MH-Z19 红外 CO₂ 传感器
| 器材 | 数量 | 参考 |
|---|---|---|
| MH-Z19B CO₂ 传感器模块 | 1 | — |
价格随渠道波动,以购买页实时为准。
会议室里待了一上午,到后半段开始犯困、脑子发钝——很多时候不是没睡好,而是房间里 CO₂ 已经悄悄爬到了一千多 ppm。想知道这个数到底是多少,普通那种几块钱的半导体气体传感器帮不上忙:MQ-135 这类只能给你一个"空气脏不脏"的模糊趋势,测不出准确的 CO₂ 浓度。要真正把 ppm 这个数字读出来,得用红外原理的 MH-Z19。
工作原理
MH-Z19 用的是 NDIR(非分散红外,Non-Dispersive Infrared) 原理,这和半导体气体传感器是两条完全不同的路子。
核心物理事实是:CO₂ 分子会强烈吸收波长约 4.26μm 的红外光,而空气里别的主要成分(氮气、氧气)几乎不吸收这个波段。MH-Z19 内部有一根密闭的光学气室,一头是红外光源、另一头是红外探测器,中间是被测空气。光从一头打到另一头的路上,气室里 CO₂ 越多,4.26μm 这个波段的红外光就被吸收得越多,最终落到探测器上的红外能量就越少。反过来,探测器收到的红外越弱,就说明气室里 CO₂ 浓度越高——芯片据此换算出 ppm 值。
这就是它比半导体传感器准得多的根本原因:它测的是 CO₂ 这一种气体对特定波长光的吸收量,是真正在"测浓度"。而 MQ 系列半导体传感器靠的是气体让金属氧化物表面电阻变化,对各种还原性气体都有反应、互相干扰,给出的只是一个"测趋势"的相对值,把它的读数当真实 CO₂ ppm 用是会误导人的。
MH-Z19 主要通过 UART 串口(默认 9600bps)把浓度数据传出来;模块上通常还有一路 PWM 输出,用占空比表示浓度,不想接串口时可以用它。本页用 UART,数据更直接。
接线
MH-Z19 需要 5V 供电(红外光源耗电,3.3V 喂不动),但它的串口逻辑电平是 3.3V 兼容的——也就是供电 5V、TX/RX 信号是 3.3V 逻辑。这点对 ESP32 很友好:ESP32 是 3.3V 系统,模块的 TX(3.3V)可以直接接进 ESP32 的 RX 而不会顶坏引脚。多数 MH-Z19/MH-Z19B 模块都是这样,但批次有差异,接之前最好核实一下手上模块的丝印或卖家说明;拿不准时按 电平转换 里的思路处理更稳妥。
串口是交叉接的:模块 TX → ESP32 RX,模块 RX → ESP32 TX。这里用 ESP32 的第二个硬件串口 Serial2(默认 RX2=GPIO16、TX2=GPIO17)。
| MH-Z19 引脚 | 接到 ESP32 | 说明 |
|---|---|---|
| Vin(5V) | 5V / VIN | 必须 5V,电流要够 |
| GND | GND | 公共地 |
| TX | GPIO16(RX2) | 模块发、ESP32 收,3.3V 逻辑 |
| RX | GPIO17(TX2) | ESP32 发、模块收 |
串口本身是怎么回事,可以看 UART 串口。
完整代码
用 WifWaf 的 MH-Z19 库(Arduino 库管理器搜 "MH-Z19" 即可),它把命令收发都封装好了。下面这段通过 Serial2 读浓度并打印:
#include <Arduino.h>
#include <MHZ19.h>
#define RX2 16 // 接模块 TX
#define TX2 17 // 接模块 RX
#define BAUD 9600 // MH-Z19 默认 9600
MHZ19 mhz;
void setup() {
Serial.begin(115200);
Serial2.begin(BAUD, SERIAL_8N1, RX2, TX2); // 启动第二个硬件串口
mhz.begin(Serial2);
mhz.autoCalibration(true); // 打开 ABC 自动基线校准(见下文)
Serial.println("MH-Z19 预热中,请等 1-3 分钟再看读数...");
}
void loop() {
int co2 = mhz.getCO2(); // 读 CO2 浓度,单位 ppm
if (mhz.errorCode == RESULT_OK) {
Serial.print("CO2: ");
Serial.print(co2);
Serial.println(" ppm");
} else {
Serial.print("读取失败,错误码 ");
Serial.println(mhz.errorCode); // 多半是接线或还没预热好
}
delay(2000);
}
注意 mhz.begin(Serial2) 传进去的是已经配好引脚的 Serial2。getCO2() 每次返回当前 ppm;上电头一两分钟红外光源还没热稳定,读数会偏、甚至读不到,属于正常,等预热过了再判断。
你应该看到什么
串口监视器(115200 波特率)预热完后,通风房间里大致是:
MH-Z19 预热中,请等 1-3 分钟再看读数...
CO2: 612 ppm
CO2: 608 ppm
CO2: 615 ppm
现在凑近传感器对着它呼一口气——人呼出的气 CO₂ 浓度极高,下一两秒读数会猛地飙到几千甚至上万 ppm,然后等气体散开又慢慢回落。这个"呼气即跳、移开即降"的反应,是验证传感器活着、且真在测 CO₂ 最直观的办法。
读数解读与校准
把 ppm 读出来还得知道它意味着什么。几个该记住的基准:
- 约 400 ppm:室外清洁空气的基线,也是地球大气背景值。
- 600~800 ppm:通风良好的室内,舒适。
- >1000 ppm:开始感觉闷、注意力下降,这是很多通风标准的提醒线。
- >2000 ppm:明显影响——困倦、头胀、效率掉得厉害,该开窗或开新风了。
校准方面,MH-Z19 默认开着 ABC 自动基线校准(Automatic Baseline Correction):它假定每隔一段时间(通常 24 小时)房间总会有一次接近室外的最低点,就把这段时间里的最低读数当作 400 ppm 来自动归零。对于会定期开窗通风的普通房间,开着 ABC 很省心。如果想更准,也可以把传感器放到室外或长时间通风处做手动零点校准(把当前环境标定为 400ppm)。
选型与避坑
- 要准确的 CO₂ ppm 数字(监测、报警、联动新风)→ 就用 MH-Z19 这类 NDIR 传感器,它是真测浓度。
- 只想要一个空气"脏/净"的综合趋势、预算又紧 → MQ-135 更便宜,但它是半导体原理,测 CO₂ 并不准,别拿它的读数当真实 ppm。想要可燃气/烟雾报警则看 MQ-2。
四个最容易栽的坑:①预热——上电后约 1~3 分钟内读数不可信,别一上电就下结论。②ABC 校准误区——ABC 靠"房间每天总会通一次风回到 400ppm"这个假设工作;如果传感器装在常年密闭、从不开窗的房间(比如恒温实验间),ABC 会把一个偏高的最低值误当 400 校进去,越校越歪,这种场景应关掉 ABC 改用手动校准。③供电要稳——必须 5V 且电流够,红外光源工作时电流有波动,电源偏弱会让读数乱跳。④电平——模块串口是 3.3V 逻辑、供电是 5V,接 ESP32 前核实清楚,别把 5V 信号直灌进 3.3V 引脚。
故障排查
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 一直读取失败 / 错误码 | TX/RX 接反,或没交叉接 | 模块 TX→ESP32 RX、模块 RX→ESP32 TX |
| 读数始终是 400 或 500 | 还在预热,或刚上电默认值 | 等 1~3 分钟预热完再看 |
| 读数乱跳、忽高忽低 | 5V 供电不稳 / 电流不足 | 换稳的 5V 电源,就近加退耦电容 |
| 浓度明显偏低且不动 | ABC 把偏值校成 400 了 | 关 ABC,搬到通风处手动校准 |
| 完全无数据 | 波特率或引脚号写错 | 确认 9600bps、RX2/TX2 引脚号一致 |
进阶与变体
把 CO₂ 读数配一块 OLED 实时显示,比串口直观得多:屏上除了打印数字,再按阈值做分级提醒——<800 绿色"良好"、800~1200 黄色"该留意"、>1200 红色"快通风",一眼就懂。OLED 的接法见 OLED 显示屏实验。
再往前一步,让 ESP32 在浓度超过 1200ppm 时自动联动新风或风扇(继电器/智能插座),低于 800ppm 再关,就成了一个最小的自动通风闭环。多组 CO₂ 时序数据采上来后,还能交给模型做趋势预测和异常识别,思路见 让 AI 帮你处理传感器数据。
典型应用
- 室内 CO₂ 浓度实时监测与超标报警
- 教室、会议室、办公室通风提醒
- 新风系统 / 排风扇按浓度自动联动
- 卧室睡眠环境空气质量记录
- 温室、菇房等需要控 CO₂ 的种植场景
小结 · 相关
MH-Z19 = NDIR 红外原理 + 真测 CO₂ 浓度 ppm + UART 串口(9600bps)。它靠 CO₂ 对 4.26μm 红外的吸收量来定浓度,是"测浓度"而非半导体的"测趋势",准得多。用的时候记住:5V 供电、串口 3.3V 逻辑交叉接、预热 1~3 分钟、ABC 校准只适合会通风的房间。要准确 ppm 选它,只要空气脏净的粗略趋势用 MQ-135 更省钱。
相关阅读:MQ-135 · MQ-2 · UART 串口 · 电平转换 · OLED 显示屏实验 · 回到 传感器总览 与 原理总览。
参数以 datasheet 为准;本页公开资料整理,接线与代码请结合实物验证。