想让 Arduino 项目闻得出空气里的异常,MQ-2 大概是入门成本最低的一颗"电子鼻"。LPG(液化石油气)、烟雾、酒精、丙烷、氢气、甲烷、一氧化碳都在它的探测清单里,量程 200–10000ppm,模块本身只要几块钱。这篇把它的工作原理、引脚定义、接线、读数和校准一次讲完,关键参数均以该模块页给出的实测口径为准。

MQ-2 是什么类型的传感器
MQ-2 属于 MOS(Metal Oxide Semiconductor,金属氧化物半导体)传感器,业内也叫它 chemiresistor——化敏电阻。它的核心特征是:碰到特定气体时,器件自身的电阻会发生变化,测电阻就等于测气体浓度。
这颗器件 5V 直流供电,加热功耗大约 800mW。要特别提醒一点:MQ-2 能探测多种可燃气体,但它分不清自己闻到的到底是哪种气体。它给出的是"可燃气体浓度在变"这个趋势信号,所以最适合做浓度变化的跟踪和阈值报警,而不是气体成分分析。选型时把这一条记住,能避开后面一大半的坑。
顺带解释下 ppm:parts per million,百万分比浓度,即一百万个空气分子里目标气体分子占多少。比如一氧化碳 500ppm,就是每 100 万体积份的空气里有 500 份 CO。
工作原理:SnO2 气敏电阻为什么一遇气就变阻
先看结构。MQ-2 是加热驱动型器件,外壳是两层不锈钢细网,官方叫法是"防爆网"——里面烧着加热丝,又面对可燃气体,这层网是安全底线,同时兼作防尘滤网,只让气体分子进到敏感区。网由镀铜卡环压紧固定。
拆开网能看到核心:一个胶木圆底座上星形伸出六根金属脚。其中两根 H 脚接镍铬合金线圈,负责加热;另外四根 A、B 脚用铂丝连到敏感元件上,负责把电信号引出来。铂丝导电好,对微小电阻变化也敏感。敏感元件本体是一根氧化铝(Al2O3)陶瓷管,外面镀一层二氧化锡(SnO2)——这才是真正干活的材料,陶瓷管的作用是让热量分布均匀,把元件稳定在工作温度上。
原理一句话讲清:上电加热后,空气中的氧分子吸附在 SnO2 表面,把半导体里的自由电子抓走,形成电子耗尽区,此时电阻偏高。可燃气体一进来,与这些吸附氧发生化学反应,被抓走的电子被释放回 SnO2,耗尽区变薄,电阻随之下降。气体浓度越高,电阻降得越多,配合负载电阻分压,输出电压就越高。整个 MQ-2 的读数,本质上就是测这个电阻变化。
模块引脚、阈值电位器与关键参数
常见的 MQ-2 模块只引出 4 个脚:VCC 接 5V、GND 接地、AO 是模拟输出、DO 是数字输出。AO 的电压随气体浓度升高而升高,直接给单片机的 ADC 口读。AO 同时也送进板上的 LM393 比较器,与电位器设定的基准电压作比较:浓度超过你设的阈值时 DO 输出 LOW,低于阈值时输出 HIGH。板上还有两颗 LED——电源灯常亮,状态灯在超阈值时点亮,做报警触发非常直观。
灵敏度调节就靠那颗蓝色电位器:顺时针旋,阈值升高,需要更多气体才触发;逆时针旋,阈值降低,一点气体就报警。具体怎么定,后面实验 2 会讲操作步骤。
器件页给出的关键参数如下,逐项照录:
| 工作电压 | 5V |
|---|---|
| 负载电阻 | 20 KΩ |
| 加热丝电阻 | 33Ω ± 5% |
| 加热功耗 | <800mW |
| 敏感体电阻 | 10 KΩ – 60 KΩ |
| 探测浓度 | 200 – 10000ppm |
| 预热时间 | 超过 24 小时 |
选型视角多啰嗦一句:加热功耗接近 800mW,意味着这颗模块自己就是个持续发热体。用电池的项目要把这笔功耗账算进去,一节充电宝带一晚上都嫌费劲;桌面固定监测的场景反而无所谓。
接线与预热时间
模拟读值的接线只有三根:模块 VCC 接 Arduino 5V,GND 接 GND,AO 接 A0 模拟输入口(见封面接线图)。DO 那路先不接,实验 2 再用。
预热是 MQ-2 最容易被新手忽略的环节。如果这颗传感器已经闲置超过一个月,第一次用要先通电老化 24 到 48 小时,才能回到正常工作状态;如果是近期常用,每次上电预热 5 到 10 分钟即可。参数表里那句"预热超过 24 小时"说的就是这种老化口径,不是每次开机都要等一天,别被吓到。
另外,刚上电的头几分钟读数会飘,数值明显不可信,属于正常现象,等加热稳定后再取数。
实验:读模拟值、定阈值、用数字口报警
实验 1:模拟口读浓度。先把下面这段代码烧进 Arduino,循环读 A0 并打到串口,波特率 9600:
#define MQ2pin 0
float sensorValue; //variable to store sensor value
void setup() {
Serial.begin(9600); // sets the serial port to 9600
Serial.println("MQ2 warming up!");
delay(20000); // allow the MQ2 to warm up
}
void loop() {
sensorValue = analogRead(MQ2pin); // read analog input pin 0
Serial.print("Sensor Value: ");
Serial.println(sensorValue);
delay(2000); // wait 2s for next reading
}烧录后打开 IDE 的串口监视器。刚开机会先看到一行"MQ2 warming up!",然后板子自己等 20 秒。接下来做标定:把传感器放到待测气体附近,记下串口数值;再撤掉气体、让它在洁净空气里静置,记下本底数值。这颗器件页的实测参考是:洁净空气约 100,有气体时约 400。


建议反复多做几轮气体/洁净空气的对照,确认数值可复现,再取中间值定阈值。把阈值写进代码,就得到一个最小可用的浓度报警:
/* Change the threshold value with your own reading */
#define Threshold 400
#define MQ2pin 0
float sensorValue; //variable to store sensor value
void setup() {
Serial.begin(9600); // sets the serial port to 9600
Serial.println("MQ2 warming up!");
delay(20000); // allow the MQ2 to warm up
}
void loop() {
sensorValue = analogRead(MQ2pin); // read analog input pin 0
Serial.print("Sensor Value: ");
Serial.print(sensorValue);
if (sensorValue > Threshold) {
Serial.print(" | Gas detected!");
}
Serial.println("");
delay(2000); // wait 2s for next reading
}代码里 Threshold 400 只是器件页作者自己环境下的读数,你的环境和气体不一样,务必用自己的实测值替换,这也是整篇唯一允许你大改的数字。
实验 2:数字口做阈值报警。接线只改一处:把 A0 那根线断开,模块 DO 接到数字脚 8:

调阈值的操作顺序:先把传感器怼到待测气体旁边,缓慢顺时针旋电位器,直到状态灯点亮;再往回逆时针旋,旋到灯刚好熄灭为止。这样阈值就卡在了"这个浓度刚好触发"的边界上。
然后烧这段读数字口的代码:
#define MQ2pin 8
int sensorValue; //variable to store sensor value
void setup() {
Serial.begin(9600); // sets the serial port to 9600
Serial.println("MQ2 warming up!");
delay(20000); // allow the MQ2 to warm up
}
void loop() {
sensorValue = digitalRead(MQ2pin); // read digital output pin
Serial.print("Digital Output: ");
Serial.print(sensorValue);
// Determine the status
if (sensorValue) {
Serial.println(" | Gas: -");
} else {
Serial.println(" | Gas: Detected!");
}
delay(2000); // wait 2s for next reading
}
DO 输出 LOW(串口读到 0)表示浓度超阈值,HIGH(读到 1)表示正常。数字口的用法不用你算 ADC、不用定阈值代码,适合只想做"超了就响"的简单报警;要画浓度曲线、记录数据,还是走 AO 那条路。
最后是注意事项,选型前务必过一遍:其一,MQ-2 分不清气体种类,也不能当成分分析仪用,想同时区分 CO 和甲烷得选电化学或者 NDIR 方案;其二,不同气体在同一浓度下的响应程度并不一样,代码里的阈值只对你标定用的那种气体有意义,换气体要重新标;其三,它没有任何安全认证,读数只能当趋势参考,燃气报警这类涉及人身安全的场景,请使用有相应认证的专用探测器,MQ-2 顶多做你的兴趣项目和"提前发现异常"的辅助信号;其四,加热部件工作时表面温度不低,装机时别贴着易燃材料,也别封死防爆网。











代码里那个delay(20000)的预热等待好评,新手直接抄就能跑,不用自己踩坑。
MQ-2这颗我之前在一个烟雾报警小项目里用过,最深的印象就是预热那回事。刚上电那几分钟数值从两三百一路往下掉,等个七八分钟才稳住,文章里说的5到10分钟真不夸张。另外标定千万别偷懒,我拿打火机放气做对照,洁净空气是九十多,放气能冲到四百多,跟文中100/400那组参考值基本对得上。还有就是这模块功耗确实高,我拿充电宝供电,一夜能掉百分之二十几的电,想做成电池常开的监测器得先算好这笔账。
800mW加热功耗这条选型时真得看清楚,等于自己挂了个小暖炉,电池党慎入。
电位器那段实用,先顺时针点亮状态灯再回旋到刚灭,比我之前瞎试强多了。
分不清气体种类这点是硬伤,当趋势报警器用没问题,想测成分得换电化学方案。