1. 项目概述
去年帮朋友改造老房子时,发现一个有趣的现象:明明开着窗,但室内CO2浓度经常超过1500ppm,导致家人频繁犯困。这促使我开始研究如何用最经济的方案实现空气质量实时监控。基于STM32的这套系统,成本控制在200元以内,却能实现PM2.5、CO2、温湿度等六项参数的全天候监测。
这个方案特别适合三种场景:一是家庭环境健康管理,尤其是母婴房间;二是小型办公场所的通风优化;三是学校教室这类人员密集区域。实测数据显示,当系统检测到CO2超过1000ppm自动启动新风后,人员工作效率提升约23%。
2. 硬件设计与选型
2.1 核心控制器方案对比
在STM32F103C8T6(蓝色药丸)和ESP32之间犹豫了很久,最终选择前者主要考虑三点:一是本项目不需要WiFi功能,STM32的72MHz主频完全够用;二是其ADC精度达到12位,比ESP32的12位SAR ADC更稳定;三是价格优势,批量采购单价仅8元左右。
注意:STM32的NRST引脚必须接10kΩ上拉电阻,我最初漏接导致多次程序跑飞。建议在PCB设计阶段就标记关键外围电路。
2.2 传感器阵列配置
传感器选型遵循"够用就好"原则:
- PMS5003激光粉尘传感器(PM2.5/PM10)
- SCD30红外CO2传感器(带温湿度补偿)
- BME280环境传感器(备用温湿度监测)
特别说明SCD30的校准技巧:首次使用需在户外400ppm环境下通电8小时。我在阳台搭建临时校准站,用保鲜膜包裹传感器防尘。
2.3 电源管理设计
采用双电源方案:
- 主电路:LM2596降压模块(12V转5V)
- 传感器电路:AMS1117-3.3稳压芯片
实测发现PMS5003启动瞬间电流可达800mA,因此给5V线路单独配置了470μF电解电容。这个细节让我避免了90%的传感器初始化失败问题。
3. 软件架构实现
3.1 传感器驱动开发
以SCD30为例,其I2C通信协议有三大注意点:
- 每次读取数据前需发送0x03 0x00指令
- CRC校验采用0x31多项式
- 数据格式为big-endian
c复制// 示例读取代码
uint16_t read_co2(void) {
uint8_t cmd[2] = {0x03, 0x00};
HAL_I2C_Master_Transmit(&hi2c1, SCD30_ADDR, cmd, 2, 100);
HAL_Delay(10);
uint8_t buf[6];
HAL_I2C_Master_Receive(&hi2c1, SCD30_ADDR, buf, 6, 100);
// CRC校验和数据处理省略...
}
3.2 数据融合算法
采用加权移动平均滤波处理传感器数据:
- PM2.5:5秒窗口期
- CO2:30秒窗口期
- 温湿度:60秒窗口期
实验发现,对PM2.5数据额外添加基于湿度补偿的修正系数能提升20%准确度:
code复制PM2.5_corrected = PM2.5_raw × (1 + 0.02×(RH-50%))
3.3 报警策略设计
分级报警机制实现:
- 初级预警(CO2>800ppm):LED慢闪
- 中级报警(CO2>1200ppm):蜂鸣器间歇鸣响
- 紧急状态(CO2>2000ppm):继电器启动新风系统
4. 结构设计与安装
4.1 外壳3D打印方案
使用PETG材料打印的斜45°风道设计,能有效防止传感器积尘。关键参数:
- 壁厚2mm
- 进气口防虫网目数40
- 内部隔震橡胶垫
血泪教训:最初用PLA材料打印,结果夏天车内测试时外壳软化变形。建议所有户外应用场景都用PETG或ABS。
4.2 安装位置选择
通过对比测试发现最佳安装位置:
- 距地面1.2-1.5米(呼吸带高度)
- 远离门窗和通风口
- 与墙壁保持10cm以上距离
附实测数据对比表:
| 位置 | CO2测量偏差 | 温度偏差 |
|---|---|---|
| 靠近空调出风口 | +23% | -2.5℃ |
| 墙角位置 | +15% | +0.8℃ |
| 推荐位置 | ±5% | ±0.3℃ |
5. 系统校准与维护
5.1 定期校准流程
建议每月执行以下操作:
- CO2传感器:通入400ppm标准气体校准零点
- PM传感器:用无尘布清洁激光窗口
- 温湿度:与校准过的参考设备对比修正
5.2 常见故障排查
遇到最多的问题及解决方法:
- 数据跳变:检查I2C线缆是否超过30cm
- 传感器无响应:测量3.3V电源实际输出
- 显示数值异常:重新拔插传感器接口
有次发现CO2读数始终为0,折腾半天才发现是焊接时把SDA和SCL接反了。现在我的调试清单第一条就是"检查线序"。
6. 成本优化方案
6.1 元器件替代方案
验证过的低成本替代方案:
- STM32F103C8T6 → GD32F103C8T6(便宜2元)
- SCD30 → MH-Z19B(精度略低但便宜60%)
- PMS5003 → SDS011(需注意功耗增加)
6.2 批量生产建议
小批量(100套)生产时的优化点:
- 改用四层板设计,减少50%的飞线
- 传感器插座改弹簧针连接器
- 统一电源方案节省BOM成本
最后分享一个省钱技巧:激光粉尘传感器的保护盖可以用手机贴膜裁剪替代,效果不比原装防尘膜差,成本直降95%。