MQ-2 可燃气体与烟雾传感器
| 器材 | 数量 | 参考 |
|---|---|---|
| MQ-2 气体传感器模块 | 1 | — |
价格随渠道波动,以购买页实时为准。
想自己做个会"闻味道"的小装置:厨房燃气漏了能响、点了根烟凑近能跳数、酒精挥发也有反应。MQ-2 就是干这个的——一块带金属网罩、上电后微微发烫的蓝色小模块,是 MQ 系列里最常被拿来做烟雾/燃气报警的入门款。它一边给模拟电压(AO,看浓度趋势),一边给数字开关信号(DO,超阈值就翻转),10 块钱左右,接上就能玩。
先把一句话放在最前面:MQ-2 给的是"相对浓度趋势",不是精确的 ppm 读数。它能告诉你"现在比刚才脏了",但不能告诉你"现在是 200ppm"。把这点搞清楚,后面就不会踩坑。
工作原理
MQ-2 是半导体式(金属氧化物)气体传感器,核心是一小块二氧化锡(SnO₂)敏感层,旁边还有一个加热丝。
- 为什么要加热:SnO₂ 必须被加热到几百摄氏度才有敏感特性,所以模块上电后会发热、要预热。这也是它必须 5V 供电、电流偏大(一两百毫安)的原因——大头都给加热丝了。
- 怎么感知气体:洁净空气里,SnO₂ 表面吸附了氧,把里面的电子"抓"住,材料电导率低、阻值高。当周围出现可燃气体或烟雾(甲烷、液化气、氢气、酒精、烟颗粒等),这些气体分子在加热的表面发生反应、释放出电子,电导率升高 → 传感器阻值下降。
- 阻值变成电压:模块把这个可变阻值和一个固定电阻串成分压(原理见 /principle/divider/),气体越浓阻值越低,AO 输出电压就越高。所以"AO 电压上升 = 周围可燃气体/烟雾变多"。
模块给你两个输出,分别对应两种用法:
- AO(模拟输出):连续电压,反映浓度趋势。配 ADC 读(原理见 /principle/adc/),能看到数值平滑地涨落。
- DO(数字输出):板上有个电位器设阈值,AO 电压和这个阈值用比较器一比——超了 DO 就翻转(多数模块是超阈值输出低电平、并点亮报警灯)。这是个现成的"超标就报警"开关,不用写 ADC 也能用。
转动板上的电位器,就是在调 DO 的触发阈值:拧一个方向更灵敏(轻微气体就报),拧另一个方向更迟钝。
接线
MQ-2 是 5V 供电的器件,加热丝吃 5V 才到工作温度。但它的 AO 在浓度高时电压会接近 5V,直接喂给 3.3V 的 ADC(ESP32 等)会超量程甚至损伤引脚——必须分压。
Arduino UNO(5V 系统,ADC 也是 5V):
| MQ-2 模块 | 接到 | 说明 |
|---|---|---|
| VCC | 5V | 加热丝要 5V |
| GND | GND | 共地 |
| AO | A0 | 模拟读浓度趋势 |
| DO | D2(可选) | 数字读"是否超阈值" |
ESP32 / 3.3V 系统(重点):
| MQ-2 模块 | 接到 | 说明 |
|---|---|---|
| VCC | 5V | 仍需 5V 加热,别接 3.3V |
| GND | GND | 共地 |
| AO | → 分压 → GPIO34 | AO 可能接近 5V,必须分压到 3.3V 以内再接 ADC |
| DO | 任意 GPIO | DO 是数字电平,超 3.3V 同样需电平处理,见 /principle/level-shift/ |
AO 分压最简单就是两个等值电阻(如 10kΩ + 10kΩ)做 1/2 分压,把 05V 压到 02.5V,落在 ESP32 ADC 安全区。分压原理见 /principle/divider/,电平处理见 /principle/level-shift/。
完整代码
下面这段读 AO 看趋势、读 DO 看是否报警,并加了预热提示和超阈值串口报警。
// MQ-2 可燃气体/烟雾传感器读取
// AO 接 A0(5V系统直连;3.3V系统须分压后再接ADC)
// DO 接 D2(板载电位器调阈值)
const int PIN_AO = A0;
const int PIN_DO = 2;
const int ALARM_LEVEL = 400; // 软件报警阈值,需按你的基线实测调整
unsigned long startMs;
void setup() {
Serial.begin(9600);
pinMode(PIN_DO, INPUT);
startMs = millis();
Serial.println("MQ-2 预热中,请等待约 20 秒以上让读数稳定…");
}
void loop() {
int ao = analogRead(PIN_AO); // 0~1023,越大表示气体越浓
int doState = digitalRead(PIN_DO); // 多数模块:超阈值=LOW
// 预热期(前 30 秒)读数会持续漂移,别急着判断
bool warmingUp = (millis() - startMs) < 30000UL;
Serial.print("AO 原始值: ");
Serial.print(ao);
Serial.print(" DO: ");
Serial.print(doState == LOW ? "触发" : "正常");
if (warmingUp) {
Serial.println(" [预热中,读数仅供观察]");
} else if (ao > ALARM_LEVEL || doState == LOW) {
Serial.println(" >>> 检测到可燃气体/烟雾升高!(学习演示,非认证报警)");
} else {
Serial.println(" 空气正常");
}
delay(500);
}
把 ALARM_LEVEL 设成多少?先空跑一会儿看洁净空气下 AO 稳定在哪个值(基线),再在这个基线上加一截余量当阈值,下一节细说。
你应该看到什么
接好上电,串口会先刷一串"预热中"。刚上电的几十秒里 AO 数值通常偏高、然后慢慢往下走、最后稳在一个基线(不同模块基线不同,常见几十到两三百)。
稳定后做两个动作:
- 拿个打火机(只放气、不点火)凑近金属网罩,按住放气键——AO 数值会明显往上蹿,可能从基线一两百直冲五六百甚至更高,松手后慢慢回落。
- 划根火柴吹灭、让烟飘过去,AO 也会跳一下。
DO 那边:把电位器调到合适灵敏度后,凑近气体时板上报警灯亮、DO 引脚翻转,串口打印"触发"。这就说明它在正常工作。
读数解读与预热
两件事最容易让新手困惑:
1. 为什么要预热、要等多久。 SnO₂ 加热到工作温度需要时间,加热丝本身的状态、表面吸附的平衡都要稳定。冷启动后头 20 秒到几分钟读数都在漂,数值会持续往下走再趋稳,这是正常的。对烟雾/燃气报警这类长期通电的应用,开机预热一两分钟再开始判断即可;对要求高的场景,datasheet 甚至建议预热更久。
2. 为什么不是精确 ppm。 你读到的 AO 只是"阻值变化映射出来的电压",要换算成真实浓度(ppm),得查 datasheet 里那条对数坐标的灵敏度特性曲线,还要先在洁净空气里标定基线电阻 R₀,再按不同气体各自的曲线换算——而且同一片传感器对甲烷、液化气、酒精、氢气的响应曲线还不一样。这套标定远超入门范围。所以入门阶段就把它当趋势探测器:记住洁净空气的基线值,关注"数值往哪个方向变、变了多少",超过基线一定幅度就当"有气体"。
选型与避坑
MQ 是一个系列,每个型号对不同气体灵敏。别拿 MQ-2 去测它不擅长的东西。
| 需求 | 选谁 | 说明 |
|---|---|---|
| 烟雾 / 可燃气(液化气、甲烷、氢气、酒精) | MQ-2 | 本篇,最通用的入门款 |
| 空气质量 / 多种有害气体综合 | MQ-135 | 见 /sensor/mq-135/ |
| CO2 浓度(要相对准的数值) | MH-Z19 | 红外(NDIR)原理,直接给 ppm,见 /sensor/mh-z19/ |
| 一氧化碳 CO | MQ-7 | 本系列另一型号 |
四个最常见的坑:
- AO 5V 必须分压:MQ-2 的 AO 在高浓度时接近 5V,直接接 ESP32/3.3V 的 ADC 会超量程或伤引脚,必须分压(/principle/divider/)。DO 同理需电平处理(/principle/level-shift/)。
- 必须预热:上电头几十秒到几分钟读数一直漂,没稳之前别下判断。
- 不是精确浓度计:AO 是趋势不是 ppm,要 ppm 得查曲线标定,入门别强求。
- 易受温湿度影响:环境温度、湿度变化会让基线漂移,长期使用要么定期重新看基线,要么用软件做基线跟踪。
故障排查
| 现象 | 可能原因 | 怎么办 |
|---|---|---|
| AO 一直接近最大值不回落 | 还在预热 / VCC 没接 5V | 等够预热时间;确认 VCC 是 5V 不是 3.3V |
| 凑近气体 AO 没反应 | AO 没接对 / 接到了数字脚 | 确认 AO 接 ADC 引脚,DO 是数字脚别搞混 |
| DO 一直报警灯亮 | 电位器阈值调太灵敏 | 拧电位器降低灵敏度,到正常空气下灯灭 |
| ESP32 上读数乱跳/读不到 | AO 没分压、超量程 | 加分压电阻把 AO 压到 3.3V 内 |
| 数值整体随天气漂 | 温湿度变化 | 正常现象,重新记基线或做软件基线跟踪 |
| 模块不发热 | 供电不足 / 接线松 | 用能带得动一两百毫安的 5V 电源 |
进阶与变体
玩熟读数后,可以往"真能用"的方向加一点东西:
- 加蜂鸣器做报警:DO 触发或 AO 超阈值时驱动有源蜂鸣器响。若蜂鸣器电流大,用继电器或三极管隔离驱动,做法见 /guide/l2-relay/。
- 加 OLED 显示:把基线值和当前 AO 实时画出来,调阈值更直观。
- 多 MQ 组合:MQ-2(可燃气/烟)+ MH-Z19(CO2,/sensor/mh-z19/)+ MQ-135(空气质量,/sensor/mq-135/)一起,做一个多维度的"屋里空气仪表盘"。
- 接 AI 判断:把多传感器读数喂给模型做异常识别,思路见 /guide/l4-sensor-ai/。
典型应用
- 简易烟雾报警小装置(学习用)
- 厨房燃气泄漏提醒(学习演示)
- 车库、储物间的可燃气体环境观察
- DIY 多传感器空气监测面板的一路
本篇属于 R2(涉及安全报警场景)。MQ-2 自制的报警装置只能用于学习和演示,不可替代经过认证的消防烟感探测器或家用燃气报警器。真正用于保护生命财产的场所,请安装符合国家标准、经第三方认证的成品报警器。自制装置的灵敏度、可靠性、长期稳定性都无法与认证产品相比,别拿它当家里唯一的安全防线。
小结
MQ-2 是 SnO₂ 半导体式气体传感器,靠"遇可燃气体阻值下降"工作,5V 供电、需预热、AO 给趋势、DO 给阈值开关。把它当趋势探测器用最省心——记住洁净空气基线,关注数值变化方向。三件事别忘:AO 5V 必须分压、要预热、不是精确 ppm。
相关:
- 空气质量综合 → /sensor/mq-135/
- 更准的 CO2 测量 → /sensor/mh-z19/
- 分压原理 → /principle/divider/
- ADC 原理 → /principle/adc/
- 电平转换 → /principle/level-shift/
- 用继电器驱动负载 → /guide/l2-relay/
- 传感器接 AI → /guide/l4-sensor-ai/
- 更多传感器 → /sensor/
- 更多原理 → /principle/
- 更多实战 → /guide/
参数以 datasheet 为准;本页公开资料整理,接线与代码请结合实物验证。