← 返回传感器图鉴

MH-Z19 红外 CO₂ 传感器

最后更新 2026-06-20
⏱ 约 10 分钟 🟡 涉接线/强电
🛒 器材清单
器材数量参考
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 为准;本页公开资料整理,接线与代码请结合实物验证。

📄 来源 / 自校链接

本文为公开资料整理,非亲测。关键参数与代码请结合实物与下列官方来源验证。

内容有错、看不懂、或想看下一期?告诉我们 →

本文为公开资料的学习整理,非亲测。涉接线/花钱/合规的步骤请结合实物与官方最新资料验证,风险自负。见免责声明