ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于NDIR传感器与ESP32的智能二氧化碳检测仪DIY全攻略

基于NDIR传感器与ESP32的智能二氧化碳检测仪DIY全攻略 你有没有想过家里的空气质量尤其是看不见摸不着的二氧化碳浓度可能正在悄悄影响你的专注力和睡眠质量开窗通风是个办法但冬天太冷夏天太热或者室外空气本身就不佳时这招就不灵了。市面上的专业级二氧化碳检测仪动辄上千元而几十块的“空气检测盒子”精度又让人心里没底数据漂移是常态。于是一个念头自然产生能不能自己动手用合理的成本做一个既精准可靠又能无缝融入智能家居系统的二氧化碳检测仪这个想法并非空想。基于非分散红外NDIR原理的传感器其核心优势在于测量结果稳定、不易受其他气体干扰是环境监测领域的“金标准”。过去这类传感器模块价格高昂是DIY爱好者难以逾越的门槛。但如今随着国产供应链的成熟像MH-Z19C、S8这类双通道NDIR传感器模组的价格已经变得相当亲民为我们打开了这扇门。再搭配上开源硬件领域的明星——ESP32或ESP8266以及强大的ESPHome固件一个高精度、可联网、能接入Home Assistant的智能检测仪其物料成本可以控制在两百元以内。这不仅仅是省了钱。更重要的是你获得了一个完全受控的数据源。你可以精确知道传感器放在哪里、如何校准、数据如何记录并且能将这些数据与你家里的新风系统、空气净化器甚至窗户的智能开合器联动实现真正的自动化空气质量管理。今天我们就来彻底拆解这个DIY项目从原理认知、硬件选型、焊接组装到ESPHome固件编写、Home Assistant接入与自动化联动一步步构建属于你自己的“空气哨兵”。1. 核心原理为什么NDIR传感器是“靠谱”的选择在动手之前我们必须先理解手里的“尺子”是如何工作的。市面上低成本的空气检测设备很多使用的是半导体式或电化学式气体传感器。对于二氧化碳半导体传感器如MQ系列虽然便宜但其原理是通过气体吸附改变半导体电阻这导致它交叉敏感性极高。温度、湿度、其他有机挥发物VOCs都会严重影响读数数据飘忽不定只能定性无法定量完全不适合需要稳定数值的二氧化碳监测。而非分散红外NDIR原理则是物理层面的“指纹识别”。二氧化碳分子对特定波长的红外光约4.26μm有强烈的吸收特性。传感器内部有一个红外光源、一个测量气室、一个红外探测器。光源发出的红外光穿过气室中的空气样本二氧化碳分子会吸收掉一部分特定波长的光能导致到达探测器的光强减弱。通过测量光强的衰减程度就能精确计算出二氧化碳的浓度。“双通道”设计是保证长期稳定性的关键。单一通道的传感器会受光源老化、灰尘污染、温度漂移等因素影响。双通道方案则增加了一个参考通道通常选用不被二氧化碳吸收的波长。系统通过持续对比测量通道和参考通道的信号可以动态补偿上述干扰从而在数年内保持出色的精度和稳定性。这正是MH-Z19C、S8等型号的核心价值所在。所以选择NDIR传感器你买到的不是“可能准”而是一个基于物理定律的、可靠的测量工具。这是整个项目能够成立的基石。2. 硬件选型与物料清单把钱花在刀刃上理解了原理选型就有了方向。我们的目标是核心传感器必须可靠外围电路够用就好整体成本极致优化。2.1 核心传感器选型这是最不能省钱的部分。目前主流的选择有两款MH-Z19C非常经典的型号价格适中约百元内UART串口通信即插即用。它内部已经完成了NDIR测量、温补和计算直接通过串口输出二氧化碳浓度值ppm。优点是集成度高使用简单缺点是体积稍大功耗相对较高工作电流约70mA。S8 (0053)更新一代的模块体积小巧功耗极低工作电流约18mA精度和响应速度通常优于MH-Z19C。它同样通过UART输出浓度值。价格略高于MH-Z19C但因其低功耗特性特别适合电池供电或对功耗敏感的场景。如何选择如果项目是插电常驻运行对体积不敏感追求最高的性价比和成熟的社区支持MH-Z19C是稳妥之选。如果希望设备更小巧考虑未来用电池供电或者追求更好的性能S8是更优的选择。注意购买时务必确认型号后缀和通信协议。例如MH-Z19C是UART版还有PWM版和模拟电压版我们不推荐。S8也有不同量程版本家用选择0-5000ppm量程的即可。2.2 主控与外围电路主控MCUESP32如ESP32-WROOM-32是首选。它比ESP8266拥有更多的GPIO、更强的处理能力和蓝牙功能为未来扩展如加装显示屏、其他传感器留有余地。价格相差无几。电源模块传感器和ESP32的工作电压都是5V。我们需要一个稳定的5V电源。方案有USB供电最方便。选择一个质量可靠的5V/1A以上的USB电源适配器以及一根Micro-USB或Type-C数据线仅供电。DC插座供电如果想做得更“专业”可以购买一个5.5*2.1mm的DC插座搭配5V/1A的直流电源。电平转换非必需但推荐大多数NDIR传感器是5V TTL电平而ESP32的GPIO是3.3V电平。虽然很多传感器在3.3V下也能工作但为稳定起见建议使用一个双向逻辑电平转换模块如TXS0108E或74HC125等来处理UART的TX/RX信号。这是提升长期运行稳定性的一个小投入。PCB与外壳万用板洞洞板适合手工焊接灵活度高。定制PCB如果希望作品更精致可以用KiCad或EasyEDA设计一块简单的PCB去打样成本也很低。外壳传感器需要空气流通所以外壳必须有进气孔。可以使用3D打印外壳网上有很多开源设计或购买现成的塑料防水盒自行开孔。一份典型的物料清单以MH-Z19C ESP32为例组件型号/说明预估成本人民币NDIR CO2传感器MH-Z19C (UART)70 - 90元主控MCUESP32-WROOM-32 开发板15 - 25元电源模块5V/1A USB电源适配器 数据线10 - 20元可复用电平转换双向逻辑电平转换模块 (3.3V-5V)2 - 5元连接线杜邦线公对公、母对母若干5元PCB/结构洞洞板、外壳、螺丝等10 - 30元总计~112 - 175元可以看到核心成本集中在传感器上其他部分都非常廉价。相比商用产品性价比优势巨大。3. 电路连接与焊接建立可靠的物理基础硬件连接的核心是串口通信。我们需要将传感器的TX/RX与ESP32的串口引脚正确连接并处理好电平问题。接线示意图使用电平转换模块MH-Z19C (5V) --- 电平转换模块 (5V侧) --- ESP32 (3.3V侧) --- 电源 VCC ------------- VCC GND ------------- GND TX ------------- RX (模块A端) --- TX (模块B端) ---- GPIO16 (RX2) RX ------------- TX (模块A端) --- RX (模块B端) ---- GPIO17 (TX2)注电平转换模块的A端接5V侧B端接3.3V侧需同时连接两侧的VCC和GND。如果不使用电平转换模块风险自担直接将MH-Z19C的TX接ESP32的GPIO16 (RX2)RX接ESP32的GPIO17 (TX2)。务必确保只连接传感器的TX到ESP32的RX因为传感器TX输出是5VESP32的RX引脚通常可以容忍5V输入但非绝对查阅具体型号数据手册。切勿将传感器的RX直接接ESP32的TX这可能会将3.3V输出接到传感器的5V输入引脚上。焊接与组装步骤规划布局在洞洞板或PCB上先摆放好ESP32开发板、电平转换模块和传感器规划好走线确保电源和信号线路径清晰。焊接电源先焊接电源和地线。为整个系统建立一个稳固的“地基”。建议使用较粗的导线或铺铜来连接GND。焊接信号线按照接线图焊接串口通信线TX/RX。线不宜过长避免引入干扰。固定与绝缘将所有模块用螺丝或胶柱固定好。检查所有焊点确保无虚焊、短路。必要时使用热熔胶或绝缘胶带进行固定和绝缘。通电前检查这是最关键的一步用万用表通断档仔细检查VCC与GND之间是否短路各连接点是否导通电源正负极是否接反确认无误后方可接通5V电源。此时ESP32和传感器的指示灯应正常亮起。4. ESPHome固件编写赋予设备“灵魂”硬件是躯体固件是灵魂。ESPHome的强大之处在于你无需编写复杂的嵌入式C代码只需用一个简洁的YAML配置文件就能定义设备的功能、传感器和网络连接并一键编译刷写。4.1 基础配置框架首先在你的ESPHome运行环境可以是Home Assistant插件、Docker容器或本地安装中创建一个新的设备配置例如co2_sensor.yaml。esphome: name: living-room-co2-monitor # 设备名称在HA中显示 friendly_name: 客厅CO2监测仪 esp32: board: esp32dev framework: type: arduino # 启用日志调试时非常有用 logger: # 启用Home Assistant API这是接入的关键 api: encryption: key: 你的api加密密钥 # 首次编译后ESPHome会生成 # 配网设置 wifi: ssid: !secret wifi_ssid # 建议使用secrets.yaml管理敏感信息 password: !secret wifi_password # 可选设置静态IP # manual_ip: # static_ip: 192.168.1.200 # gateway: 192.168.1.1 # subnet: 255.255.255.0 # 如果WiFi连接失败启动热点供配置 captive_portal: # 启用OTA方便未来无线升级 ota: password: !secret ota_password # 启用网页服务器可以查看设备状态 web_server: port: 804.2 集成NDIR传感器这是核心部分。ESPHome对MH-Z19系列和S8都有原生支持。对于MH-Z19Cuart: id: uart_bus tx_pin: GPIO17 # ESP32的TX2接传感器的RX rx_pin: GPIO16 # ESP32的RX2接传感器的TX baud_rate: 9600 # MH-Z19C默认波特率 sensor: - platform: mhz19 # 使用MH-Z19组件 co2: name: Living Room CO2 id: co2_value update_interval: 30s # 更新间隔不宜过短 accuracy_decimals: 0 # 显示整数ppm temperature: name: MH-Z19 Temperature # 传感器内部温度非室温 id: mhz19_temp automatic_baseline_calibration: false # 重要关闭自动基线校准(ABC)关键配置解读uart: 定义了与传感器通信的串口总线。update_interval: 设置为30秒或更长。NDIR传感器需要稳定时间频繁读取无意义且增加功耗。automatic_baseline_calibration:务必设置为false。ABC功能是MH-Z19的一个特性它假设传感器每周会有至少一次暴露在400ppm室外空气环境下的机会并以此自动校准零点。但在室内长期运行这个假设不成立开启ABC会导致读数逐渐漂移至错误低值。室内使用的校准应依赖于手动校准。对于S8传感器uart: id: uart_bus tx_pin: GPIO17 rx_pin: GPIO16 baud_rate: 9600 # S8默认也是9600 sensor: - platform: senseair # 使用SenseAir组件S8 co2: name: Living Room CO2 id: co2_value update_interval: 30s temperature: name: S8 Temperature4.3 进阶配置与优化为了让设备更好用我们可以添加更多功能# 添加一个室内温湿度传感器如DHT22、SHT30数据更全面 i2c: sda: GPIO21 scl: GPIO22 sensor: - platform: sht3xd # 例如SHT30 temperature: name: Living Room Temperature id: room_temp humidity: name: Living Room Humidity id: room_humidity update_interval: 60s # 添加一个LED状态指示灯 binary_sensor: - platform: status name: CO2 Monitor Status id: device_status output: - platform: gpio pin: GPIO2 # ESP32板载LED可根据需要更改 id: status_led light: - platform: binary name: Status Light output: status_led # 可以通过自动化控制LED如CO2超标时闪烁 # 添加一个按钮用于手动触发校准可选 button: - platform: template name: Calibrate to Fresh Air on_press: then: - uart.write: [0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78] # MH-Z19C手动校准命令示例 # 注意校准命令需根据传感器手册精确编写并谨慎使用。配置完成后使用ESPHome命令编译并刷写固件到ESP32设备esphome run co2_sensor.yaml设备将自动连接Wi-Fi并在Home Assistant中被发现。5. Home Assistant接入与自动化从数据到行动设备上线后在Home Assistant的“设备与服务”中会自动出现一个新设备。所有在ESPHome中定义的传感器CO2、温度、湿度都会成为实体。5.1 数据可视化首先在HA的仪表盘上创建卡片来展示数据**使用实体卡片**直接显示当前CO2浓度、温湿度数值。**使用历史图表卡片**或ApexCharts卡片来绘制CO2浓度随时间的变化曲线这对于观察趋势至关重要例如夜间睡眠时CO2的累积过程。**使用仪表盘卡片**将CO2浓度以半圆仪的形式显示并设置绿色800ppm、黄色800-1200ppm、红色1200ppm等颜色区间一目了然。5.2 创建有意义的自动化数据的价值在于驱动行动。以下是一些实用的自动化思路自动化1超标报警通知alias: “CO2浓度过高提醒” trigger: platform: numeric_state entity_id: sensor.living_room_co2 above: 1000 # 触发阈值可根据感觉调整如800 1200 for: minutes: 5 # 持续5分钟高于阈值才触发避免短暂波动误报 action: - service: notify.mobile_app_your_phone # 发送手机推送 data: title: “⚠️ 客厅CO2浓度偏高” message: “当前浓度 {{ states(‘sensor.living_room_co2’) }} ppm建议通风。” - service: tts.google_translate_say # 通过音箱语音播报 data: entity_id: media_player.living_room_speaker message: “注意客厅二氧化碳浓度已超过1000ppm。”自动化2联动新风/空气净化器alias: “自动控制新风系统” trigger: platform: numeric_state entity_id: sensor.living_room_co2 above: 900 action: - choose: - conditions: - condition: state entity_id: climate.living_room_fresh_air_system state: “off” sequence: - service: climate.turn_on target: entity_id: climate.living_room_fresh_air_system - service: climate.set_hvac_mode target: entity_id: climate.living_room_fresh_air_system data: hvac_mode: “fan_only” default: [] trigger: platform: numeric_state entity_id: sensor.living_room_co2 below: 700 for: minutes: 10 action: - service: climate.set_hvac_mode target: entity_id: climate.living_room_fresh_air_system data: hvac_mode: “off”自动化3智能开窗器如果装有在春秋季可以设定当室内CO2高且室外温度/空气质量适宜时自动打开窗户。5.3 传感器校准与维护NDIR传感器长期稳定性很好但并非永不漂移。为了保持数据准确建议手动零点校准最重要每隔3-6个月或将传感器移至室外确保是清洁空气环境稳定半小时后通过ESPHome暴露的button或HA中的服务发送校准命令将当前值校准到400ppm。切勿在室内进行此操作。定期清洁用软毛刷或吹气球轻轻清理传感器进气孔处的灰尘避免堵塞。数据交叉验证如果你有另一个可靠的检测设备或有机会与专业设备对比可以对比读数如有固定偏差可在HA中利用“模板传感器”进行数值偏移校正。6. 从单点监测到全屋系统进阶玩法与思考完成一个监测点后你获得的不仅是一个工具更是一套方法论。你可以将此方案复制以极低的成本在书房、卧室、儿童房等多个关键位置部署监测点在HA中构建一个全屋二氧化碳浓度分布图。通过对比不同房间、不同时间如白天办公 vs. 夜间睡眠的数据你可以更科学地优化通风策略。例如你可能发现夜间紧闭门窗的卧室CO2浓度在清晨经常突破1500ppm这解释了为何醒来后感觉昏沉。解决方案可以是定时开启卧室新风或安装小型壁挂式新风机。多人同时在客厅活动时CO2上升速度远超想象。这提示你需要更高效的客厅通风方案。更进一步你可以将CO2数据与其他环境数据PM2.5、TVOC、温湿度以及人体存在传感器、日程信息结合打造更智能、更预判性的环境调节系统。例如“工作日晚上10点后如果卧室有人且CO2浓度持续上升则自动开启新风至低档位。”这个DIY项目的终点不是一个放在角落吃灰的小装置而是一个深度融入你生活、持续为你提供有价值数据并默默改善居住环境的智能节点。它代表了一种理念通过开源技术、合理的成本和亲手实践我们完全可以拥有不妥协于商业产品品质的个性化智能生活解决方案。现在是时候动手为你呼吸的每一口空气增加一个可靠的数字注解了。
返回列表