☰
基于红外NDIR原理DIY高精度CO2检测仪,百元成本接入Home Assistant
2026/10/5 15:54:53 网站建设 项目流程

大家好,我是专注于智能家居DIY的技术博主。你是否曾想过,以极低的成本,打造一个能媲美商用产品精度、并能无缝融入Home Assistant生态的二氧化碳检测仪?市面上的成品要么价格昂贵,要么数据封闭,难以深度集成。今天,我们就来动手实现一个基于红外原理、双通道校准的高精度二氧化碳检测仪,核心成本可以控制在百元以内,并通过ESPHome将其完美接入Home Assistant,实现数据可视化与自动化联动。

本文将手把手带你完成从硬件选型、电路连接、ESPHome固件编写到Home Assistant集成的全流程。无论你是刚接触ESP8266/ESP32的爱好者,还是希望深化智能家居自定义能力的玩家,都能从零开始,构建属于自己的空气质量监测节点。

1. 项目背景与红外NDIR原理

在开始动手之前,我们首先要明白:为什么要用“红外”方法来检测二氧化碳?这关系到我们项目的核心精度和可靠性。

1.1 常见的二氧化碳检测方法

市场上低成本的二氧化碳传感器主要分为两类:

  1. 半导体式(MOX):通常检测的是VOC(挥发性有机物),通过算法估算eCO2(等效二氧化碳)。这类传感器价格低廉,但易受酒精、香烟、香水等干扰,数据波动大,精度低,不能反映真实的CO2浓度。
  2. 红外吸收式(NDIR):这是本次项目采用的方法,也是商用、工业级检测仪的主流技术。其精度高、选择性好、寿命长。

1.2 红外NDIR(非分散性红外)技术核心

NDIR技术的原理基于特定气体对特定波长红外光的吸收特性。二氧化碳(CO2)对波长约为4.26μm的红外光有强烈的吸收作用。

传感器内部通常包含:

  • 红外光源:发射广谱红外光。
  • 采样气室:待测气体流经此处。
  • 红外滤波器:只允许4.26μm波长附近的光通过,这个通道称为主动通道或测量通道。
  • 参考滤波器:选择一个CO2不吸收的波长(如3.9μm),这个通道称为参考通道。
  • 红外探测器:将透过滤波器的光信号转换为电信号。

工作流程:红外光穿过气室后,分别经过测量滤波器和参考滤波器。CO2浓度越高,测量通道吸收的光就越多,其探测器接收到的信号就越弱。而参考通道的信号基本不受CO2影响,主要反映光源强度、灰尘附着、器件老化等共同因素。通过计算两个通道信号的比值,就能有效消除环境干扰,得出稳定、准确的CO2浓度值。这就是“双通道”校准的精髓所在。

本项目正是利用了这个原理,通过微控制器读取双通道传感器的原始数据,并利用其内置或我们编写的算法,计算出精确的PPM值。

2. 硬件准备与选型指南

一套完整的DIY系统需要以下组件。选择时,平衡成本、精度和易用性。

2.1 核心组件清单

组件推荐型号说明预估成本
NDIR CO2传感器MH-Z19B、MH-Z19C、S8本项目首选MH-Z19B。它集成度高,直接输出PPM值,也支持读取原始波形(ABC校准需注意)。性价比极高。60-80元
微控制器ESP8266 (NodeMCU, Wemos D1) 或 ESP32ESP8266足够,ESP32性能更强且有更多GPIO备用。推荐NodeMCU开发板,自带USB转串口。15-25元
电平转换模块如果传感器是5V,MCU是3.3V则必需MH-Z19B工作电压为5V,但其串口TX输出为3.3V电平,RX输入需5V。安全起见,建议使用双向逻辑电平转换模块。2-5元
电源模块5V/1A USB电源或DC电源为整个系统供电。MH-Z19B峰值电流可达150mA,需稳定5V供电。已有/10元
连接线杜邦线(母对母、公对母)用于连接各模块。已有/5元
外壳3D打印或塑料盒保护电路,并在气室部分开孔以便空气流通。可选

为什么选MH-Z19B?

  • 即插即用:通过串口发送简单指令即可读取CO2浓度,无需自己处理复杂的红外模拟信号。
  • 内置NDIR核心:已经包含了红外光源、双通道探测器、气室和计算芯片。
  • 精度可靠:在400-5000ppm范围内,典型误差可达±(50ppm + 3%读数)。
  • 通信简单:采用UART(串口)通信,与ESP系列MCU连接非常方便。

2.2 硬件连接示意图(以NodeMCU + MH-Z19B为例)

重要提醒:为确保通信稳定并保护MCU,强烈建议使用电平转换模块。

NodeMCU (ESP8266) <---> 逻辑电平转换模块 <---> MH-Z19B ========================================================= NodeMCU 引脚 转换模块低压侧(LV) 转换模块高压侧(HV) MH-Z19B 引脚 GPIO13 (D7) - RX <---> TXO/LV1 TXI/HV1 <---> TX (绿线) GPIO15 (D8) - TX <---> RXI/LV2 RXO/HV2 <---> RX (黄线) 3.3V <---> LV HV <---> Vin (红线) GND <---> GND (LV侧) GND (HV侧)<---> GND (黑线) | |--- (独立供电) 5V电源正极 ---> Vin (红线)* |--- (独立供电) 5V电源负极 ---> GND (黑线)*

注:MH-Z19B的Vin和GND也可以直接从电平转换模块的HV和GND取电,前提是你的USB口或电源能提供足够电流(>500mA)。更稳妥的做法是像上图所示,为传感器单独提供一路5V电源,但需共地。

简化连接(风险自担): 由于MH-Z19B的TX脚输出已是3.3V电平,可以直接接ESP8266的RX。但它的RX脚需要5V电平驱动,如果直接接ESP8266的TX(3.3V),可能无法可靠工作或长期损坏传感器。因此,至少需要为MCU的TX到传感器的RX这条线添加电平转换。

3. 软件环境准备

在焊接硬件之前,我们先搭建好软件开发环境。

3.1 安装ESPHome

ESPHome是核心,它让我们能用YAML配置文件来“编写”固件,无需触碰Arduino IDE的复杂设置。

方法一:通过Home Assistant ESPHome插件安装(推荐)如果你已运行Home Assistant(特别是HASS OS、Supervised安装),这是最便捷的方式。

  1. 在HA侧边栏进入“设置” -> “加载项”。
  2. 点击“加载项商店”,搜索“ESPHome”。
  3. 找到并安装“ESPHome”加载项。
  4. 安装完成后,启动它,并勾选“自动启动”和“显示监视器”。
  5. 在信息页点击“打开Web UI”,即可访问ESPHome仪表盘。

方法二:通过Python Pip安装(适用于任何系统)

# 在终端或命令提示符中执行 pip install esphome # 安装后,可以使用 `esphome` 命令 esphome version # 检查安装

3.2 安装串口驱动确保电脑能识别你的ESP开发板。NodeMCU通常使用CH340或CP2102芯片,请根据型号安装对应驱动。

3.3 准备代码编辑器任何文本编辑器均可,但推荐VS Code、Atom或Sublime Text,它们对YAML语法高亮支持好。

4. ESPHome固件配置详解

这是项目的灵魂。我们将在ESPHome中创建一个新的设备,并编写其配置文件。

4.1 创建新设备在ESPHome Web UI中点击“+ NEW DEVICE”,给设备起个名字,如co2-monitor。选择你的ESP板型号(如NodeMCU ESP8266)。点击“下一步”直到完成创建。这会生成一个基础的co2-monitor.yaml文件。

4.2 核心配置文件解析我们将逐步完善这个YAML文件。以下是完整配置示例及逐段解析。

# co2-monitor.yaml esphome: name: co2-monitor friendly_name: 客厅CO2检测仪 esp8266: board: nodemcuv2 # 启用日志,便于调试 logger: # 启用Home Assistant API,用于集成 api: encryption: key: "你的加密密钥(创建项目时自动生成)" # 配网设置 wifi: ssid: !secret wifi_ssid password: !secret wifi_password # 可设置静态IP # manual_ip: # static_ip: 192.168.1.100 # gateway: 192.168.1.1 # subnet: 255.255.255.0 # 通过Web页面进行配置(OTA更新后仍可配网) captive_portal: # 启用OTA,方便无线更新固件 ota: # 定义UART串口,用于与MH-Z19B通信 uart: rx_pin: GPIO13 # NodeMCU的D7 tx_pin: GPIO15 # NodeMCU的D8 baud_rate: 9600 # MH-Z19B默认波特率 # 定义MH-Z19B传感器组件 sensor: - platform: mhz19 uart_id: uart_bus_1 # 引用上面定义的uart,如果只有一个uart,可省略 co2: name: "Living Room CO2" id: co2_value # 可选:温度补偿(MH-Z19B内置温度传感器可能不准,可外接) # temperature: 25.0 # 自动校准背景点功能(ABC)。家用环境波动大,建议**关闭**! automatic_baseline_calibration: false # 校准周期(如果开启ABC)。关闭后此项无效。 # abc_period: 150h update_interval: 30s # 读取数据的间隔 # 可选:读取传感器内部温度(通常不准确,仅作参考) temperature: name: "MH-Z19B Internal Temperature" id: mhz19_temp internal: true # 不将此实体暴露给HA前端,仅内部使用 # 可选:添加一个DHT22温湿度传感器,获取更准确的环境参数 # sensor: # - platform: dht # pin: GPIO2 # D4 # temperature: # name: "Living Room Temperature" # humidity: # name: "Living Room Humidity" # update_interval: 60s # 系统状态传感器 sensor: - platform: wifi_signal name: "WiFi Signal" update_interval: 60s - platform: uptime name: "Uptime" # 状态灯(可选,用于指示设备状态) binary_sensor: - platform: status name: "CO2 Monitor Status" # 网页界面显示 web_server: port: 80 # 文本秘密文件(secrets.yaml),与主配置文件在同一目录 # 内容: # wifi_ssid: "你的WiFi名称" # wifi_password: "你的WiFi密码"

关键配置解析:

  1. uart: 定义了与MH-Z19B通信的串口引脚和波特率。务必与硬件连接对应。
  2. platform: mhz19: 这是ESPHome内置的MH-Z19系列组件,它封装了与传感器通信的协议。它支持co2和temperature两个测量值。
  3. automatic_baseline_calibration (ABC):这是最重要的设置!MH-Z19B传感器默认开启ABC功能。其逻辑是:在连续运行一段时间(如24小时)后,它会将过去一段时间内读取到的最低值(假设为400ppm)设为新的零点基准。在室内环境中,CO2浓度很少会长期稳定在400ppm(室外空气水平),这会导致传感器基准漂移,读数越来越低,严重失准!因此,对于室内固定使用的场景,务必将其关闭。
  4. update_interval: 设置为30秒,平衡数据刷新率和传感器寿命(红外光源有寿命)。
  5. secrets.yaml: 将WiFi密码等敏感信息放在单独的文件中,避免泄露。在ESPHome仪表盘编辑时,可以直接在界面输入,它会自动管理。

4.3 编译与烧录固件

  1. 在ESPHome Web UI中,点击你创建的co2-monitor设备。
  2. 点击“EDIT”编辑YAML文件,将上述配置粘贴进去(记得修改WiFi信息)。
  3. 保存后,点击“INSTALL”。选择“Plug into the computer running ESPHome Dashboard”。
  4. 用USB线将NodeMCU连接至电脑。在弹出窗口中选择正确的串口端口。
  5. 点击“INSTALL”开始编译并烧录。等待进度完成,设备将自动重启并连接WiFi。

5. 接入Home Assistant

设备上线后,接入HA非常简单,基本是自动完成的。

5.1 自动发现(推荐)如果Home Assistant和ESPHome设备在同一局域网,并且HA中已安装ESPHome集成,大多数情况下设备会被自动发现。

  1. 在HA侧边栏进入“设置” -> “设备与服务”。
  2. 点击“添加集成”,搜索“ESPHome”。
  3. 通常会自动列出发现的设备co2-monitor,点击配置即可。
  4. 如果没有自动发现,可以点击“手动添加”,输入设备的IP地址或本地域名(如co2-monitor.local)。

5.2 实体验证添加成功后,进入“设置” -> “设备与服务” -> “实体”,搜索“CO2”,你应该能看到名为“Living Room CO2”的传感器实体。它的单位应为ppm。

5.3 创建仪表盘卡片在HA的仪表盘上添加一个卡片来可视化数据。

# 在Lovelace仪表盘编辑器中,使用`entities`卡片或`gauge`卡片 type: gauge entity: sensor.living_room_co2 name: CO2浓度 unit: ppm segments: - from: 0 to: 800 color: green label: 优 - from: 800 to: 1200 color: yellow label: 良 - from: 1200 to: 2000 color: orange label: 差 - from: 2000 to: 5000 color: red label: 警告 min: 400 max: 3000 needle: true

你也可以使用更美观的apexcharts或mini-graph-card卡片来绘制历史曲线。

5.4 创建自动化示例当CO2浓度过高时,自动打开新风、空气净化器或发送通知。

# 在HA的“设置”->“自动化与场景”中创建新自动化 alias: "CO2过高时提醒并开新风" description: "" trigger: - platform: numeric_state entity_id: sensor.living_room_co2 above: 1000 # 触发阈值,可根据需要调整 for: minutes: 5 # 持续5分钟高于阈值才触发,避免短暂波动 condition: [] action: - service: notify.mobile_app_your_phone # 发送手机通知 data: title: "空气质量提醒" message: "客厅CO2浓度已超过1000ppm,请注意通风。" - service: switch.turn_on target: entity_id: switch.new_fan # 打开新风开关 mode: single

6. 校准与精度提升

即使关闭了ABC,传感器仍可能需要手动校准以获得最佳精度。

6.1 零点校准(推荐方法)将传感器置于室外或通风良好、确信CO2浓度在400ppm左右的环境中,稳定运行至少20分钟后,通过ESPHome的“服务”功能或发送特定串口指令进行校准。

通过ESPHome服务校准:在HA中,进入“开发者工具” -> “服务”。选择服务esphome.co2_monitor_calibrate_zero_point(服务名可能因ESPHome版本略有不同,可在esphome.服务中查找)。点击“调用服务”。传感器会以当前读数为基准进行零点校准。

通过串口指令校准(备用):如果你熟悉串口工具(如Arduino IDE串口监视器、Putty),可以给MH-Z19B发送16进制指令:FF 01 87 00 00 00 00 00 78。具体指令集请参考MH-Z19B的数据手册。

6.2 跨度校准(非必要)需要已知浓度的标准气体,一般家用无需操作。

6.3 预热与稳定NDIR传感器通电后需要一段时间预热(MH-Z19B约3分钟)才能达到稳定精度。在读取数据时请注意。

7. 常见问题与排查

在DIY过程中,你可能会遇到以下问题:

问题现象可能原因排查思路与解决方案
ESPHome编译失败YAML语法错误、缩进错误、组件名称错误1. 检查YAML文件的缩进(必须是空格,不能是Tab)。
2. 检查platform: mhz19等关键词拼写。
3. 查看ESPHome日志输出的具体错误行。
设备无法连接WiFiWiFi密码错误、信号弱、SSID隐藏1. 确认secrets.yaml或配置中的SSID/密码正确。
2. 设备靠近路由器。
3. 尝试在wifi:配置下添加fast_connect: true或power_save_mode: none。
HA中找不到设备网络隔离、防火墙、自动发现失败1. 检查设备是否获取到IP(可在路由器后台查看)。
2. 在ESPHome仪表盘查看设备日志,确认API连接正常。
3. 在HA中手动添加集成,输入设备IP地址。
CO2读数始终为0或异常低ABC功能开启、传感器未预热、硬件连接问题1.首先确认配置中automatic_baseline_calibration: false。
2. 设备通电后等待至少5分钟再读数。
3. 检查串口RX/TX线是否接反,电平转换是否正常工作。
CO2读数固定不变通信失败、传感器故障1. 在ESPHome设备日志中查看sensor.mhz19是否有读取错误。
2. 尝试用USB-TTL模块直接连接MH-Z19B,用串口工具发送读取指令FF 01 86 00 00 00 00 00 79看是否有返回。
读数跳跃、波动大传感器靠近通风口、人体呼吸干扰、电源不稳1. 将传感器放置在空气流通但无直吹的位置,远离门窗和人的口鼻。
2. 检查电源,确保5V供电稳定,尝试更换电源适配器。
3. 在ESPHome配置中适当增加update_interval(如60s),并在HA中使用滤波传感器(filter集成)进行平滑。
传感器发热严重正常现象MH-Z19B的红外光源工作时会发热,壳体温度可达50-60℃,这是正常的。确保外壳有散热空间。

8. 项目优化与扩展思路

基础功能实现后,你可以考虑以下优化方向,让项目更完善、更专业。

8.1 硬件优化

  • 独立供电:使用5V/2A的电源适配器单独为传感器和MCU供电,避免USB供电不足导致WiFi断连或读数不稳。
  • 添加屏显:连接一个OLED或LCD屏幕(如SSD1306),通过I2C接口实时显示CO2、温湿度数据,即使断网也能查看。
  • 美化外壳:使用3D打印设计一个带进气孔和屏幕窗口的外壳,提升美观度和安全性。
  • 多传感器融合:集成SGP30(VOC/eCO2)、PMS5003(PM2.5)等传感器,构建多功能空气质量监测站。

8.2 软件优化

  • 数据滤波:在ESPHome中使用filter组件对CO2读数进行平滑处理,减少瞬时波动。
    sensor: - platform: mhz19 co2: name: "Living Room CO2 Raw" id: co2_raw ... - platform: filter name: "Living Room CO2 Filtered" entity_id: sensor.living_room_co2_raw filters: - sliding_window_moving_average: window_size: 5 send_every: 2
  • 本地化与容错:在WiFi配置中添加多个备用网络和fallback热点模式,提高网络可靠性。
  • 深度睡眠(电池供电):如果希望便携或电池供电,可以配置ESP8266定时唤醒(如每5分钟)、读取传感器数据、发送到HA后再次深度睡眠,极大延长续航。

8.3 Home Assistant高级应用

  • 历史数据与统计:利用HA的recorder和history集成长期存储数据,并使用statistics传感器计算日均值、峰值等。
  • 复杂自动化:结合人体存在传感器、门窗传感器和空调/新风系统,实现“有人且CO2高则自动通风,无人或开窗则关闭”的智能场景。
  • 外部数据集成:通过HA的RESTful或MQTT集成,将CO2数据上报到其他物联网平台或自建的数据分析系统(如Grafana)。

通过以上步骤,你已经成功打造了一个低成本、高精度、完全自主可控的智能二氧化碳检测仪。它不仅是一个传感器,更是你深入理解物联网硬件、嵌入式配置和智能家居联动的绝佳实践项目。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询