前言
模拟烟雾监测系统,基于传感器获取到空气中烟雾或者可燃气体的浓度,在通过对浓度划分成的三种不同的等级,来执行不同的事件。对于完成该实验后,能够学习到烟雾传感器、交通灯以及蜂鸣器的基本用法。该事件案例需要读者有一定的C语言、电子常见标识符等基础。
材料
在材料上,硬件清单:Arduino Uno板卡以其扩展板、MQ-2传感器模块、交通灯模块、蜂鸣器模块、用于连接板卡和电脑的Type-B数据线以及若干杜邦线,最好在准备一块面板板。软件环境:需要安装好Arduino IDE即可。然后在准备1瓶酒精和几张纸巾,在实现整个系统后的测试环境时,用纸巾沾染些酒精以此来模拟环境中可燃气体浓度的升高。


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

代码实现
完整代码
该代码基于宏定义去描述定义各模块的控制引脚,以便在不方便更换原有的模块连接的前提下,也能通过更改宏定义所定义的引脚,去改变控制引脚,提高了可移植性。而且,除了初始化函数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模拟烟雾监测系统_演示视频