家里装个燃气报警器要花几十上百块,但玩硬件的人有更省的路子:一支几块钱的 MQ-2 烟雾/可燃气体传感器,加一块 Arduino,就能做出会"闻"液化气、酒精、烟雾并报警的小装置。这篇把三件事讲透:怎么读模拟量、怎么标定阈值、怎么接出报警指示。

先认识 MQ-2:它靠什么闻气味
MQ-2 是 MQ 系列里最常见的一款金属氧化物半导体(MOS)气敏传感器,业内也叫化学电阻式(chemiresistor)。核心是一片涂了二氧化锡(SnO2)的陶瓷管:洁净空气里电导率低,碰到液化气、丙烷、丁烷、甲烷、氢气、酒精蒸汽或烟雾,电导率就上升。传感器内部带一根镍铬合金加热丝,由标 H 的两只引脚供电加热,信号则从 A、B 四只引脚经铂丝引出——加热是为了让气体分子顺利吸附反应,这也是它必须预热的原因。
浓度越高,输出电压越高,这是读数的基本逻辑:无烟时电压低,有烟时电压抬升。

市售的 MQ-2 模块把敏感芯体和一块小板集成在一起,板上有一颗 LM393 比较器、一颗蓝色电位器和两颗指示灯。敏感芯体输出模拟信号走 AO 脚,比较器把模拟值和电位器设定的门槛比一比,超了就拉低(或拉高)DO 脚,同时点亮状态灯。也就是说,一支模块同时给了你"模拟浓度曲线"和"数字开关量"两种用法。

关键参数与预热口径:不同教程说法不一,如实并列
按 Last Minute Engineers 整理的模块规格:工作电压 5V,负载电阻 20 KΩ,加热丝电阻 33Ω ±5%,加热功耗小于 800mW,敏感体阻值 10-60 KΩ,检测浓度范围 200-10000ppm。器件教程只认数据手册口径,这些值建议原样记下,别凭感觉估。
预热时间这一项,不同教程的口径并不统一,这里如实摆出来:
- Last Minute Engineers 的规格表写"预热时间 24 小时以上",并解释:超过一个月没用的传感器,要用 24-48 小时把敏感体"烧"回稳定态;常用不间断的话,每次上电预热 5-10 分钟就够。
- Random Nerd Tutorials 的示例代码里只留了 delay(20000),即上电后等 20 秒再读数——这是演示用口径,适合先跑通逻辑,别拿去做浓度对比。
我的建议是分层理解:初次上电或长期搁置后,给足 24 小时老化;日常开关机,预热几分钟再采数;只验证"通不通电、代码跑不跑",20 秒也凑合。预热期间读数漂移是正常现象,别在这个窗口标定。
接线并读模拟量:三根线起步
模块四个引脚,对 Arduino UNO 这样接,读模拟量只需前三根:
| MQ-2 模块 | Arduino UNO |
|---|---|
| VCC | 5V |
| GND | GND |
| AO | A0(模拟输入) |
| DO | 任一数字脚(可选,走比较器开关量) |
加热丝功耗接近 800mW,折算电流 150mA 左右,UNO 的 5V 稳压直接带没问题;但如果你用的是 3.3V 逻辑的小板,记得模块最好还是吃 5V,否则加热温度不够、读数偏低。只接 VCC、GND、AO 三根线就能跑通第一段代码,DO 可以先悬空。

线接好,先把 AO 的原始读数打上串口看看。UNO 的 ADC 是 10 位,读数范围 0-1023。下面这段代码照搬自 Last Minute Engineers 的实验一,上电先等 20 秒再进循环:
#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
}打开串口监视器(波特率 9600),你会看到一个两秒一跳的数字。洁净空气里这个数通常落在一百上下, Last Minute Engineers 给的参考量级是:无气体约 100,有气体约 400。把打火机不放气的气口凑近(只排气不点火),你会看到数字快速爬升——这就是模拟量在反映浓度变化。
标定阈值并接出完整报警
阈值不能拍脑袋定,标准做法是采两组数:洁净空气里的本底值,和目标气体出现时的峰值。方法很简单——先让传感器在通风处稳定,记下串口读数;再把气体源凑近,记下峰值。两组数之间取一个留有裕量的点当报警线。比如本底 100、峰值 400,报警线定 300 就比直接卡 400 更稳妥,轻微泄漏也能捕捉到。
把报警判断加进代码,同样是 Last Minute Engineers 的实验一进阶版:
/* 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
}串口里会看到"Sensor Value: xxx | Gas detected!"这样的输出。要是你连 DO 脚,还能反向验证:旋转模块上的蓝色电位器,让无气体时状态灯刚好熄灭、有气体时点亮,电位器设定的门槛和你在代码里定的阈值就能互相对上。两边都对过,标定才算闭环。
阈值有了,接上执行机构就是成品。Random Nerd Tutorials 的方案是红灯、绿灯各一颗(各串 220Ω 电阻)、蜂鸣器一只,模拟量接 A5。下面代码从其教程页逐字符搬运,阈值在 sensorThres 变量里改:
/*******
All the resources for this project:
https://randomnerdtutorials.com/
*******/
int redLed = 12;
int greenLed = 11;
int buzzer = 10;
int smokeA0 = A5;
// Your threshold value
int sensorThres = 400;
void setup() {
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(smokeA0, INPUT);
Serial.begin(9600);
}
void loop() {
int analogSensor = analogRead(smokeA0);
Serial.print("Pin A0: ");
Serial.println(analogSensor);
// Checks if it has reached the threshold value
if (analogSensor > sensorThres)
{
digitalWrite(redLed, HIGH);
digitalWrite(greenLed, LOW);
tone(buzzer, 1000, 200);
}
else
{
digitalWrite(redLed, LOW);
digitalWrite(greenLed, HIGH);
noTone(buzzer);
}
delay(100);
}逻辑一目了然:读数超过 sensorThres,红灯亮、绿灯灭,蜂鸣器以 1000Hz 响 200ms;低于阈值则回到绿灯常亮。tone() 的第三个参数决定了报警是"嘀"一声而不是长鸣,间隔 100ms 扫一次读数,响应相当跟手。想把红灯换成继电器驱动排气扇, digitalWrite 那两行换成对应引脚的开关就行。
两句实在话收尾
一要认清它的边界:MQ-2 是"宽带"传感器,分不清液化气和酒精,只适合监测"某种已知气体的浓度变化",拿去测空气质量并不合适。二要记得它费电:加热丝常年接近 800mW,电池供电的方案要么周期上电要么直接上市电。把预热耐心给足、阈值用两组实测值定出来,这支几块钱的"鼻子"完全撑得起厨房燃气监测、小车烟雾检测这类项目。











提醒一句:MQ-2 对酒精也敏感,别拿着喷酒精消毒凑近玩,会误报,测燃气之前屋里别用酒精喷雾
DO 那个电位器和代码阈值互相对上的思路很妙,我以前只顾拧电位器,从来没两边一起验证过
预热那段写得实在,不少教程直接抄 20 秒就开测,长期搁置的传感器这么玩纯属自欺欺人
上个月刚用 MQ-2 给厨房做了个燃气报警,文章里的标定流程和我的实操完全对得上:先通风记本底,再用打火机排气采峰值,中间留裕量定阈值。我踩过的坑是本底值只记一次不够,早晚温差会让读数漂十几格,建议不同时段多采几组再定线。另外预热真的不能省,冷启动头几分钟数字会一路往上爬,急着标定全白忙。