目录
[3.1 MQ-2气体传感器](#3.1 MQ-2气体传感器)
[3.2 电子模块](#3.2 电子模块)
[3.2 原理图](#3.2 原理图)
[5.1 mq2.h](#5.1 mq2.h)
[5.2 mq2.c](#5.2 mq2.c)
[5.3 adc.h](#5.3 adc.h)
[5.4 adc.c](#5.4 adc.c)
[5.5 main.c](#5.5 main.c)
引言
本次,我们学习的传感器是一款MQ-2烟雾气体传感器,顾名思义就是用于检测气体的传感器,也是与前面介绍的有些许类似,如下图所示。

1、MQ-2传感器介绍
MQ-2烟雾气体传感器是一种气体检测传感装置 ,主要通过其中的MQ-2气敏元件以及相关电子模块构成,实现对外界环境的某些气体浓度的灵敏检测,对液化气、丁烷、丙烷、加完、酒精、氢气、烟雾等检测尤为敏感。
因其电路简单、稳定性好、探测范围广泛、灵敏度高以及响应快速等特点,常用于家庭和工厂的气体泄漏监测装置以及学习之中。
2、相关参数
| 参数 | 规格 |
|---|---|
| 工作电流 | 约150mA |
| 工作电压 | DC 5V |
| 模拟输出范围 | 0~5V |
| 检测浓度 | 300~10000ppm(可燃气体) |
| 主要芯片 | LM393、MQ-2气体传感器 |
| 输出 | AO/DO |
3、硬件构成
MQ-2烟雾气体传感器硬件上主要由两部分组成,分别是核心气体检测传感器MQ-2气敏元件以及电子模块,接下来我们逐一介绍一下。
3.1 MQ-2气体传感器
MQ-2 气体传感器由核心敏感组件与辅助电路构成。敏感部分以二氧化锡(SnO₂)为基底,掺杂贵金属催化剂,配合镍铬合金加热器(提供 300~400℃工作温度),通过陶瓷管承载并封装于不锈钢防爆网内;电路端通过负载电阻与敏感层串联,部分模块集成 LM393 比较器实现信号转换。

由于该器件是该模块实现气体检测的核心部分,所以简单说一下其检测原理。其检测是基于半导体气敏效应:洁净空气中,敏感层表面形成氧吸附层,呈高电阻状态;当接触可燃气体(如甲烷、丙烷)或烟雾时,气体与氧吸附层反应释放自由电子,导致电阻降低。这一变化通过分压电路转化为电压信号 ------ 浓度越高,输出电压越大,经模拟或数字(阈值触发)形式输出,实现气体浓度检测与报警触发。
简单来说即:**空气干净时,敏感层电阻非常高;当空气中出现可燃气体或烟雾时,敏感层电阻降低,且气体浓度越高,输出电压越大。**然后电阻变化会通过电路将电阻转换成电压信号经过模拟输出或数字输出到单片机即可实现气体浓度检测以及报警触发。
3.2 电子模块
该模块上还有一部分电子模块,也就是前面传感器介绍过的LM393与电位器电路。

简单来说,就是MQ-2传感器检测气体产生的电压变化经过LM393比较器 可以转换成数字信号通过数字信号(开关信号)DO口输出;然后蓝色的电位器 可以调节检测气体的灵敏度,也就是检测气体认为浓度超标的阈值,当气体浓度大于设定阈值时,DO输出低电平,反之输出高电平。顺时针旋转旋钮可以增加灵敏度,逆时针旋转则减少灵敏度。
3.2 原理图

4、引脚定义及功能
如下图,为引脚相关说明(图中蓝色电位器可能与前面图不同,不过外形不同罢了,无伤大雅)。

|------|--------------------|
| 引脚名称 | 描述 |
| VCC | 供给电压DC 5V |
| GND | 地线 |
| DO | 开关信号,0-浓度超标,1-空气正常 |
| AO | 模拟信号,有害气体或烟雾浓度情况 |
5、参考代码
接下来,根据其原理基于STM32 给出参考测试代码,该代码基于寄存器方式进行编写,当然由于传感器原理比较简单,因此逻辑应该容易理解。
5.1 mq2.h
cpp
/*
* @Descripttion: 气体检测传感器驱动文件(.h)
* @Author: JaRyon
* @version:
* @Date: 2025-11-02 10:19:57
*/
#ifndef __MQ2_H
#define __MQ2_H
#include "stm32f10x.h"
/**
* 引脚接线
*
* VCC ---> 5V
* GND ---> GND
* DO ---> PA0
* AO ---> PA1
*
*/
void MQ2_Init(void);
uint8_t MQ2_Detect(void);
#endif
/*** (C) COPYRIGHT 2025 END OF FILE ***/
5.2 mq2.c
cpp
/*
* @Descripttion: 气体检测传感器驱动文件(.c)
* @Author: JaRyon
* @version:
* @Date: 2025-11-02 10:19:57
*/
#include "mq2.h"
/**
* @brief 气体检测传感器初始化
* @param void 无
* @return void
* @example MQ2_Init();
* @attention
*/
void MQ2_Init(void)
{
// 1. 开启时钟 PA
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// 2. DO-PA0 浮空输入 mode-00 cnf-01
GPIOA->CRL &= ~GPIO_CRL_MODE0;
GPIOA->CRL |= GPIO_CRL_CNF0_0;
GPIOA->CRL &= ~GPIO_CRL_CNF0_1;
}
/**
* @brief 检测气体浓度,获取状态
* @param void 无
* @return uint8_t
* @example uint8_t gasState = MQ2_Detect();
* @attention
*/
uint8_t MQ2_Detect(void)
{
uint8_t gasState = 0;
if (GPIOA->IDR & GPIO_IDR_IDR0)
{
gasState = 1;
}
return gasState;
}
5.3 adc.h
5.4 adc.c
可参考前面介绍使用的ADC程序,移植很容易。
5.5 main.c
cpp
/*
* @Descripttion: 气体烟雾传感器测试程序
* @Author: JaRyon
* @version:
* @Date: 2025-11-02 10:19:57
*/
#include "stm32f10x.h"
#include "Systick.h"
#include "oled.h"
#include "mq2.h"
#include "LED.h"
#include "adc.h"
int main(void)
{
uint32_t waitTimes = 0;
char *str = "Normal";
double GasIntensity = 0, GasRes = 0.0;
uint8_t count = 0;
// 初始化
Systick_Init();
LED_Init();
OLED_Init();
OLED_ClearAll();
ADC1_Init();
MQ2_Init();
ADC1_StartConvert();
waitTimes = Systick_GetTick();
while(1)
{
if (Systick_GetTick() - waitTimes >= 10000)
{
if (MQ2_Detect() == 0)
{
str = "ExcStd";
LED_On(LED1);
}
else
{
str = "Normal";
LED_Off(LED1);
}
// 提高精度 算10次均值
GasIntensity += ADC1_GetVol() * 100 / 5.0;
count++;
if (count >= 10)
{
GasRes = GasIntensity / count;
count = 0;
GasIntensity = 0;
}
waitTimes = Systick_GetTick();
}
OLED_ShowString(39, 27, str, 8);
OLED_ShowString(25, 45, "GI:", 8);
OLED_ShowFloat(53, 45, GasRes, 3, 1, 8);
OLED_Update();
}
}
6、总结
本文介绍了MQ-2烟雾气体传感器的基本原理和应用。该传感器采用二氧化锡气敏元件,通过电阻变化检测可燃气体(液化气、丙烷等)和烟雾浓度,具有模拟/数字双输出接口,集成LM393比较器可实现阈值报警。文章介绍了传感器相关原理和使用方法,并提供了STM32的驱动代码示例,包含初始化配置和浓度检测功能。
以上便是本次文章的所有内容,欢迎各位朋友在评论区讨论,本人也是一名初学小白,愿大家共同努力,一起进步吧!
鉴于笔者能力有限,难免出现一些纰漏和不足,望大家在评论区批评指正,谢谢!