基于Arduino模拟烟雾监测系统

前言

模拟烟雾监测系统,基于传感器获取到空气中烟雾或者可燃气体的浓度,在通过对浓度划分成的三种不同的等级,来执行不同的事件。对于完成该实验后,能够学习到烟雾传感器、交通灯以及蜂鸣器的基本用法。该事件案例需要读者有一定的C语言、电子常见标识符等基础。

材料

在材料上,硬件清单:Arduino Uno板卡以其扩展板、MQ-2传感器模块、交通灯模块、蜂鸣器模块、用于连接板卡和电脑的Type-B数据线以及若干杜邦线,最好在准备一块面板板。软件环境:需要安装好Arduino IDE即可。然后在准备1瓶酒精和几张纸巾,在实现整个系统后的测试环境时,用纸巾沾染些酒精以此来模拟环境中可燃气体浓度的升高。

硬件连接

蜂鸣器的控制引脚通过杜邦线连接到GPIO2,交通灯模块的R、Y、G三种颜色的控制端也分别接到GPIO4、GPIO5、GPIO6,MQ-2烟雾传感器模块的AO模拟数值输出端接到A0上,所有模块的GND、VCC也都连接到扩展板GV的符号上,以此来给模块接通电源。

代码实现

完整代码

该代码基于宏定义去描述定义各模块的控制引脚,以便在不方便更换原有的模块连接的前提下,也能通过更改宏定义所定义的引脚,去改变控制引脚,提高了可移植性。而且,除了初始化函数setup()和主循环函数loop()外,还基于需求与模块自身,构建了蜂鸣器控制函数Buzzer_Control()以及交通灯控制函数TrafficLights_Control(),提升了程序的模块化和可维护性。并且,在下面用通过代码版本图片版本的形式,分享出完整的代码流程,可供参考。

代码版本

c 复制代码
/**
 * @file   SmokeAlarmExperiment
 * @brief  烟雾警报实验
 * @author 紫阡星影
 */

#define Device_Buzzer_Pin  2
#define Device_SmokeAo_Pin A0
#define Device_TrafficLightsR_Pin 4
#define Device_TrafficLightsY_Pin 5
#define Device_TrafficLightsG_Pin 6

/**
 * @brief 交通灯控制
 * @param color 0-G 1-Y 2-R
 */
void TrafficLights_Control(uint8_t color)
{
  /* 重置 */
  digitalWrite(Device_TrafficLightsG_Pin, LOW);
  digitalWrite(Device_TrafficLightsY_Pin, LOW);
  digitalWrite(Device_TrafficLightsR_Pin, LOW);

  /* 控制 */
  switch(color)
  {
    case 0:
      digitalWrite(Device_TrafficLightsG_Pin, HIGH);
    break;
    case 1:
      digitalWrite(Device_TrafficLightsY_Pin, HIGH);
    break;
    default:
      digitalWrite(Device_TrafficLightsR_Pin, HIGH);
    break;
  }

}

/**
 * @brief 蜂鸣器控制
 * @param num 0-关闭 1-打开
 * @note 蜂鸣器分为有源和无源,相关驱动片段都写在函数中了
 */
void Buzzer_Control(uint8_t num)
{
  if(num == 1)
  {
    // digitalWrite(Device_Buzzer_Pin, LOW);
    tone(Device_Buzzer_Pin, 1000); // 1000Hz的频率
  }
  else
  {
    // digitalWrite(Device_Buzzer_Pin, HIGH);
    noTone(Device_Buzzer_Pin);
  }
  delay(1000); // 持续1秒钟
}

void setup() 
{
  Serial.begin(115200);
  pinMode(Device_Buzzer_Pin, OUTPUT);
  pinMode(Device_TrafficLightsR_Pin, OUTPUT);
  pinMode(Device_TrafficLightsG_Pin, OUTPUT);
  pinMode(Device_TrafficLightsY_Pin, OUTPUT);

}

void loop() 
{
  uint8_t SmokeAo_value = analogRead(Device_SmokeAo_Pin);
  Serial.println(SmokeAo_value);
  if(SmokeAo_value >= 0 && SmokeAo_value < 50)
  {
    TrafficLights_Control(0);
    Buzzer_Control(0);
  }
  else if(SmokeAo_value >= 50 && SmokeAo_value < 100)
  {
    TrafficLights_Control(1);
  }
  else
  {
    TrafficLights_Control(2);
    Buzzer_Control(1);
  }

  delay(1000);
}

图片版本

分段解析

按照Arduino的程序文件定义,程序执行从初始化函数setup()运行完成后,再到主循环函数loop(),所以下述的分段解析也按照程序的运行顺序进行。

setup函数

初始化开发板串口的波特率以及设置所以模块引脚的控制模式

c 复制代码
void setup() 
{
  Serial.begin(115200);
  pinMode(Device_Buzzer_Pin, OUTPUT);
  pinMode(Device_TrafficLightsR_Pin, OUTPUT);
  pinMode(Device_TrafficLightsG_Pin, OUTPUT);
  pinMode(Device_TrafficLightsY_Pin, OUTPUT);

}

loop函数

以1000毫秒为周期的循环该函数,首先通过SmokeAo_value变量获取到MQ-2传感器所感应到环境中可燃气体或者烟雾的值,然后在通过串口打印出来,并且通过判断的方式,进行三级气体浓度的行为判断以及执行。

c 复制代码
void loop() 
{
  uint8_t SmokeAo_value = analogRead(Device_SmokeAo_Pin);
  Serial.println(SmokeAo_value);
  if(SmokeAo_value >= 0 && SmokeAo_value < 50)
  {
    TrafficLights_Control(0);
    Buzzer_Control(0);
  }
  else if(SmokeAo_value >= 50 && SmokeAo_value < 100)
  {
    TrafficLights_Control(1);
  }
  else
  {
    TrafficLights_Control(2);
    Buzzer_Control(1);
  }

  delay(1000);
}

TrafficLights_Control函数

交通灯控制函数,进来函数时先统一的熄灭所有灯光,在通过传入函数的值来确定是哪个颜色的灯光亮起,这样就能实现控制指定灯光的效果。

c 复制代码
/**
 * @brief 交通灯控制
 * @param color 0-G 1-Y 2-R
 */
void TrafficLights_Control(uint8_t color)
{
  /* 重置 */
  digitalWrite(Device_TrafficLightsG_Pin, LOW);
  digitalWrite(Device_TrafficLightsY_Pin, LOW);
  digitalWrite(Device_TrafficLightsR_Pin, LOW);

  /* 控制 */
  switch(color)
  {
    case 0:
      digitalWrite(Device_TrafficLightsG_Pin, HIGH);
    break;
    case 1:
      digitalWrite(Device_TrafficLightsY_Pin, HIGH);
    break;
    default:
      digitalWrite(Device_TrafficLightsR_Pin, HIGH);
    break;
  }

}

Buzzer_Controlan函数

蜂鸣器控制函数,如果是有源蜂鸣器可以给定触发电平高/低即可触发响声,而无源蜂鸣器需要通过一定频率的方波,例如1000Hz表示在1秒内完成1000个完整的高低电平翻转周期。通过传入的参数值,可以实现对蜂鸣器是否发出声响进行控制。

c 复制代码
/**
 * @brief 蜂鸣器控制
 * @param num 0-关闭 1-打开
 * @note 蜂鸣器分为有源和无源,相关驱动片段都写在函数中了
 */
void Buzzer_Control(uint8_t num)
{
  if(num == 1)
  {
    // digitalWrite(Device_Buzzer_Pin, LOW);
    tone(Device_Buzzer_Pin, 1000); // 1000Hz的频率
  }
  else
  {
    // digitalWrite(Device_Buzzer_Pin, HIGH);
    noTone(Device_Buzzer_Pin);
  }
  delay(1000); // 持续1秒钟
}

测试视频

可以看到在下述模拟可燃气体浓度升高的情况下,系统在获取到MQ-2传感器所感应到的情况后,反应到了交通灯的显示中。

基于Arduino模拟烟雾监测系统_演示视频

相关推荐
SystickInt2 小时前
32 DMA实现ROM与RAM通信
stm32·单片机·嵌入式硬件
俊昭喜喜里4 小时前
STM32开发板电源设计( DCDC 电路和 LDO 电路 )
stm32·单片机·嵌入式硬件
m0_555762904 小时前
方案再再对比
单片机
boneStudent5 小时前
Day20:串口基本配置与收发
stm32·单片机·嵌入式硬件
HIZYUAN6 小时前
嵌入式开发踩坑记: AG32硬件设计指南(一)
stm32·单片机·嵌入式硬件·fpga开发·硬件设计·最小系统·agm ag32
三佛科技-134163842127 小时前
BP85958D输出12V400MA智能家居电源芯片(典型应用电路、替代型号HN32512)
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
海涛高软7 小时前
axi-gpio
单片机·嵌入式硬件
youcans_7 小时前
【动手学STM32G4】(2)USB 虚拟串口通信
stm32·单片机·嵌入式硬件·串口通信·通信协议
绵山介子推7 小时前
STM32硬件错误(HardFault_Handler)一些心得体会
stm32·单片机·嵌入式硬件