Skip to content

MQ-2烟雾传感器详解

今天我要向大家介绍一款常用的气体传感器模块——MQ-2,烟雾传感器模块。如果您对于检测可燃性气体、烟雾和一氧化碳等有害气体感兴趣,那么 MQ-2 模块将成为您的得力助手。

MQ-2 传感器模块基于半导体传感技术,能够高度敏感地检测到目标气体的存在并产生相应的电信号。在接下来的文章中,我们将深入了解 MQ-2 模块的特点、工作原理以及如何正确使用和应用它。无论是家庭安全监测、工业环境监测还是个人健康管理,MQ-2 模块都将为您提供准确可靠的气体检测功能。

让我们一起开始探索这个小巧而强大的气体传感器模块吧!

1. 源码下载及前置阅读

  • STM32F103C8T6模板工程

链接:https://pan.baidu.com/s/1n7XHCaMYtASWdJH2uA5yDA?pwd=lw59 提取码:lw59

  • 本文的源码

链接:https://pan.baidu.com/s/1o_DAUdh8XNdS9W_z0NVoNw?pwd=i81x 提取码:i81x

如果你是嵌入式开发小白,那么建议你先读读下面几篇文章。

往期教程,有兴趣的小伙伴可以看看。

2. MQ-2介绍

MQ 系列模块是一个广泛应用于气体检测领域的大家族。MQ 代表着"Metal Oxide"(金属氧化物),这是指该系列模块中所采用的传感器原理。

MQ 系列长相相似,但是可以按照传感器上的编号区分它们,每个成员都有自己检测的气体,真是术业有专攻呢。

当然,我们今天的主角是 MQ-2。

2.1 MQ-2型号介绍

MQ-2,烟雾传感器模块,也叫可燃气体检测模块。

(有的小伙伴可能不理解为什么烟雾和可燃气体扯在一起了,这里给大家回忆一下烟雾的化学定义:雾是指空气中漂浮的小液滴,烟是可燃物在没有完全燃烧的情况下产生的悬浮在空气中的可见微粒,也就是固体小颗粒。所以烟雾就是指小液滴和固体小颗粒了。燃烧时产生烟雾的一个原因是没有完全燃烧,产生的固体小颗粒与空气中的小液滴结合形成了烟雾。)

MQ-2 可用于家庭和工厂的气体泄漏监装置,适宜于液化气、丁烷、丙烷、甲烷、酒精、烟雾等多种可燃性气体的探测。它的优点是灵敏度高、响应快、稳定性好、寿命长、驱动电路简单以及方便安装。

2.2 MQ-2工作参数及引脚介绍

MQ-2 工作参数:

  • 工作电压:DC 5V
  • 工作温度:-10 ~ +50℃

模块中蓝色的电位器是用于调节阀值,顺时针旋转,阈值会越大,逆时针越小。

上电后电源指示灯亮。

当烟雾超过阈值,DO 输出指示灯亮。

接线如下:

MQ-2STM32备注
VCC3.3/5V电源正极
GNDGND电源负极
D0任意 GPIO 口数字输出(小于阈值输出高电平,大于阈值输出低电平)
A0有 ADC 功能的引脚模拟输出(0.1V-0.5V 正常,2V 左右浓度高)

模块通电后需要预热一分钟,稳定后数据才准确,传感器发热是正常现象因为内部有电热丝,如果烫手那就有问题了。

ADC 和引脚对应关系如下:

3. MQ-2工作原理

MQ-2 烟雾传感器采用在清洁空气中电导率较低的二氧化锡,属于表面离子式N型半导体。当 MQ-2 烟雾传感器在200到300摄氏度环境时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。

简单来说就是通过测量电阻变化来检测可燃气体和烟雾的存在,浓度越高电压越高。

4. 编程实战

本次实战的目标是用串口助手将气体浓度的数值实时打印出来。

在此之前,我们要知道 MQ-2 的模拟输出信号电压范围为0到5V,并且与气体浓度成正比关系。通过将 MQ-2 的模拟输出信号接入处理器的 ADC(模数转换)管脚进行转换,我们可以获取 MQ-2 传感器输出电压值。由于该输出电压与电阻值成反比关系,而电阻值又与气体浓度呈一定的线性关系,因此通过测量 MQ-2 传感器的输出电压值,我们能够推导出气体的浓度水平

4.1 硬件接线

本教程使用的硬件如下:

  • 单片机:STM32F103C8T6

  • 烟雾传感器模块:MQ-2

  • 串口:USB 转 TTL

  • 烧录器:ST-LINK V2

MQ-2STM32USB 转 TTL
VCC5V
GNDG
DO悬空
AOA0
A10TX
A9RX
GGND

烧录的时候接线如下表,如果不会烧录的话可以看我之前的文章【STM32下载程序的五种方法】。

ST-Link V2STM32
SWCLKSWCLK
SWDIOSWDIO
GNDGND
3.3V3V3

接好如下图:

4.2 ADC初始化

ADC初始化代码如下,我们用 A0 引脚,对应的是 ADC1,通道0。

c
ADC_HandleTypeDef hadc1;                                //ADC句柄

void ADC1_Init(void)
{
    ADC_ChannelConfTypeDef sConfig = {0};

    hadc1.Instance = ADC1;                              //ADC1
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;         //不扫描,仅用到一个通道
    hadc1.Init.ContinuousConvMode = DISABLE;            //关闭连续转换模式
    hadc1.Init.DiscontinuousConvMode = DISABLE;         //禁止规则通道组间断模式
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;   //软件触发
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;         //数据右对齐
    hadc1.Init.NbrOfConversion = 1;                     //1个规则通道序列
    HAL_ADC_Init(&hadc1);                               //初始化

    sConfig.Channel = ADC_CHANNEL_0;                    //通道0
    sConfig.Rank = ADC_REGULAR_RANK_1;                  //rank1
    sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;     //1.5个周期
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

4.3 复写ADC初始化

复写 HAL 库的 ADC初始化,引脚配置,时钟使能,此函数会被 HAL_ADC_Init() 调用

c
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if(adcHandle->Instance==ADC1)
    {
        /* ADC1 时钟使能 */
        __HAL_RCC_ADC1_CLK_ENABLE();

        __HAL_RCC_GPIOA_CLK_ENABLE();
        /* PA0 对应 ADC1_IN0 */
        GPIO_InitStruct.Pin = GPIO_PIN_0;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;        //模拟
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    }
}

4.4 主函数

因为电压范围是 0~3.3V,这个范围被分为4096(2的12次方)个刻度。

所以烟雾值 = 电压值 = 3.3 / 4096 × smoke_value(模拟输出值)。

c
int main(void)
{
    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    delay_init(72);                         /* 延时初始化 */
    usart_init(115200);                     /* 波特率设为115200 */
    ADC1_Init();                            /* ADC1初始化 */

    printf("烟雾传感器实验:\r\n");
    while(1)
    { 
        HAL_ADC_Start(&hadc1);                          // 启动ADC1转换
        HAL_ADC_PollForConversion(&hadc1, 50);          // 等待ADC1转换完成
        smoke_value = HAL_ADC_GetValue(&hadc1);         // 获取ADC1转换结果
        printf("烟雾值 = %f\r\n\r\n", 3.3/4096 * smoke_value);
        HAL_Delay(1000);
    }
}

4.5 最终效果

测试的时候大家可以:

  1. 可燃气体:拿一个普通打火机(防风的不行),打着,吹灭,手按住开关,就有可燃气体出来了,可以对着 MQ-2 做测试啦。
  2. 烟雾:小心地点燃一根牙签,吹灭,就有一缕烟啦,可以对着 MQ-2 做测试啦。

注意安全噢。

串口输出如下,0.1 到 0.5 正常;2 左右浓度高。

正常情况的串口输出:

有烟雾的串口输出:

5. 小结

MQ-2 广泛应用于家庭用气体泄漏报警器、工业用可燃气体报警器以及便携式气体检测仪器等领域。它的高灵敏度和快速响应使得它成为了气体检测的优选之一。

通过本文的介绍,希望能够为您提供全面而清晰的指导,让您对 MQ-2 烟雾传感器模块的原理和功能有更深入的了解。感谢各位看官,peace and love!