MQ-2烟雾传感器接Arduino:读模拟量、标定阈值到报警

2026-11-05 07:17:22 19阅读

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

MQ-2烟雾传感器模块面包板接线实拍

先认识 MQ-2:它靠什么闻气味

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

浓度越高,输出电压越高,这是读数的基本逻辑:无烟时电压低,有烟时电压抬升。

烟雾浓度与MQ-2输出电压关系示意

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

MQ-2传感器模块引脚与元件标注

关键参数与预热口径:不同教程说法不一,如实并列

按 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
VCC5V
GNDGND
AOA0(模拟输入)
DO任一数字脚(可选,走比较器开关量)

加热丝功耗接近 800mW,折算电流 150mA 左右,UNO 的 5V 稳压直接带没问题;但如果你用的是 3.3V 逻辑的小板,记得模块最好还是吃 5V,否则加热温度不够、读数偏低。只接 VCC、GND、AO 三根线就能跑通第一段代码,DO 可以先悬空。

MQ-2与Arduino UNO模拟输出接线示意

线接好,先把 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,电池供电的方案要么周期上电要么直接上市电。把预热耐心给足、阈值用两组实测值定出来,这支几块钱的"鼻子"完全撑得起厨房燃气监测、小车烟雾检测这类项目。


作者:电机传感器师
链接:https://www.aiddithome.com/p/76b5d3b788f86.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
线比代码多
1楼 · 2天前

提醒一句:MQ-2 对酒精也敏感,别拿着喷酒精消毒凑近玩,会误报,测燃气之前屋里别用酒精喷雾

只看不说话
2楼 · 2天前

DO 那个电位器和代码阈值互相对上的思路很妙,我以前只顾拧电位器,从来没两边一起验证过

胶佬憨憨
3楼 · 2天前

预热那段写得实在,不少教程直接抄 20 秒就开测,长期搁置的传感器这么玩纯属自欺欺人

老张装机
4楼 · 2天前

上个月刚用 MQ-2 给厨房做了个燃气报警,文章里的标定流程和我的实操完全对得上:先通风记本底,再用打火机排气采峰值,中间留裕量定阈值。我踩过的坑是本底值只记一次不够,早晚温差会让读数漂十几格,建议不同时段多采几组再定线。另外预热真的不能省,冷启动头几分钟数字会一路往上爬,急着标定全白忙。