应用场景
应用于家庭和工厂的气体泄漏监测装置, 适宜于液化气、丁烷、丙烷、甲烷、酒精、氢气、人工煤气、烟雾等的探测。
产品说明:
特点
- 广泛的探测范围高灵敏度快速响应恢复优异的稳定性寿命长简单的驱动电路
适用气体
液化气、甲烷、煤气
基本参数
MQ-2 可燃气体传感器
A0 和 A1 之间是短接;B0 和 B1 之间是短接;
H0 和 H1 之间的电阻为加热电阻,MQ-2 的加热阻值为:31Ω±3Ω ;
A 和 B 之间的电阻为敏感体电阻,在空气中,未上电时,其阻值为 1 KΩ;
加热电压:5.0V±0.2V
加热电流:≤180mA
加热功率:≤900mW
检测原理
MQ-2 型可燃气体传感器,它是由二氧化锡半导体气敏材料构成,属于表面离子式 N 型半导体。当处于 200~300℃温度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与可燃气体接触时,如果晶粒间界处的势垒受到该可燃气体的调制而变化,就会引起表面电导率的变化。利用这一点就可以获得这种可燃气体存在的信息。
MQ-2 可燃气体传感器在一定工作条件下,接触同一种可燃气体,其电阻值 Rs 随气体浓度变化的特性称之为灵敏度特性,用 K 表示。
K=Rs/Ro,其中 Ro 为可燃气体传感器在洁净空气条件下的电阻值,Rs 为可燃气体传感器在一定浓度的可燃气体中的电阻值。
我们观察上图,可以看出,当处于一种气体中时,随着气体浓度的升高 K 值降低,由于 Ro 为常量,所以随着气体浓度的升高 --K 值降低即 Rs 降低,即其电阻降低。
原理图
图中电阻 Rh 为加热电阻,电阻 Rs 为传感器的阻值,其阻值随着周围气体的浓度变化而变化;
电阻 Rs 和电阻 R2 串联到一起,ADC 求得的就是两个电阻分压后的电压值。
R2 的电阻值固定不变,Rs 随浓度变高而变小,根据分压原理,那么 ADC 处测得的电压将升高,我们只需要根据实际情况,设定一定值为报警阈值,当 ADC 处的电压高于阈值时,蜂鸣器响,这样使用 MQ-2 制作的燃气报警器就做出来了。
引脚 | 描述 |
---|---|
A11 | ADC 对应的引脚,GPIO11/UART2_TXD/SPI0_RXD/ADC5/PWM2_OUT |
A9 |
蜂鸣器对应的引脚,GPIO9/UART2_RTS/SPI0_TXD/ADC4/PWM0_OUT/I2C0_SCL |
代码实现
本实例主要用到了两个知识点,一个是使用 Hi3861 自带的 ADC 功能获取 MQ-2 模块的输出电压,另一个是当 MQ-2 输出电压大于阈值之后,使用 PWM 功能驱动蜂鸣器响。
本实例的实现过程大致如下:
- 本实例的入口函数为
MQ2ExampleEntry()
,该函数主要完成了本实例使用的 ADC 和 PWM 功能的初始化,并在最后创建了一个新的线程MQ2_Task()
,该线程主要用于循环获取 ADC 的值,当 ADC 的值超过阈值时,启动 PWM 使蜂鸣器响,用于对身边的人进行预警。
static void MQ2ExampleEntry(void)
{
unsigned int ret = 0;
GpioInit();
// 蜂鸣器初始化
hi_pwm_set_clock(PWM_CLK_XTAL); // 设置时钟源为晶体时钟;
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);//IO 复用为 PWM 功能
ret = GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);// 设置为输出
if (ret != WIFI_IOT_SUCCESS) {
printf("===== ERROR ======gpio -> GpioSetDir ret:%d \r\n", ret);
return;
}
hi_pwm_init(HI_PWM_PORT_PWM0);// 初始化 PWM
hi_io_set_func(HI_IO_NAME_GPIO_11, HI_IO_FUNC_GPIO_11_GPIO); /* GPIO11 ADC5 */
ret = hi_gpio_set_dir(HI_GPIO_IDX_11, HI_GPIO_DIR_IN);
if (ret != HI_ERR_SUCCESS) {
printf("===== ERROR ======gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret);
return;
}
osThreadAttr_t attr = {0};
attr.name = "MQ2_Task";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 1024;
attr.priority = osPriorityNormal;
if(osThreadNew((osThreadFunc_t)MQ2_Task,NULL,&attr) == NULL)
{
printf("Failed to create MQ2_Task ! \r\n");
}
}
SYS_RUN(MQ2ExampleEntry);
- 新线程中,循环判断 MQ-2 模块输出的电压是否超过阈值,超过阈值将触发蜂鸣器工作。
本实例使用的两个知识点,具体的使用方法参见之前咱们分享的网文:
Hi3861 开发板上的 ADC 功能如何使用,请参考下文:
一个 ADC 实现多个按键检测
如何使用 PWM 输出驱动无源蜂鸣器工作,请参考下文:
基于鸿蒙操作系统的《爱若琉璃》(蜂鸣器版本)
结果展示
结果展示过程现象描述: 整个板子刚上电的时候,输出电压为 0.21V 左右,然后输出电压逐渐升高至 2.39V(超过阈值),然后随着系统预热,输出电压逐渐降低,2 分钟以后大约降到 0.45V 左右,此后 MQ-2 模块的输出电压持续降低,大约十分钟时间,电压稳定到 0.305V,20 分钟稳定到 0.290V(所以最开始有可能会出现误报的情况)。
此时用手摸 MQ-2 模块有微微发热的感觉。
触发一次蜂鸣器报警,一分钟后降至 0.45V,大约三分钟,MQ-2 的输出电压可以恢复至 0.31V。
所以如果系统尚未稳定就开始判断,可能会出现误报的情况。
断电,隔 20 分钟冷却后,再次上电,初始输出电压仍为 0.27V 左右,然后输出电压升至 0.74V,随后五分钟内降至 0.290V,应该算是稳定了。
上述测试过程没有完全重现,此过程仅供参考。