基于鸿蒙系统的家庭燃气报警器

应用场景

应用于家庭和工厂的气体泄漏监测装置, 适宜于液化气、丁烷、丙烷、甲烷、酒精、氢气、人工煤气、烟雾等的探测。

产品说明:

特点

  • 广泛的探测范围
  • 高灵敏度
  • 快速响应恢复
  • 优异的稳定性
  • 寿命长
  • 简单的驱动电路

适用气体

液化气、甲烷、煤气

基本参数

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制作的燃气报警器就做出来了。

代码实现

本实例主要用到了两个知识点,一个是使用Hi3861自带的ADC功能获取MQ-2模块的输出电压,另一个是当MQ-2输出电压大于阈值之后,使用PWM功能驱动蜂鸣器响。

本实例的实现过程大致如下:

  1. 本实例的入口函数为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);

2.新线程中,循环判断MQ-2模块输出的电压是否超过阈值,超过阈值将触发蜂鸣器工作。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 0
收藏 0
关注 56
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧