这个室内空气质量监控系统是我去年为一个社区养老院做的实际项目。当时院方反映老人们在密闭空调房里经常头晕胸闷,但开窗又怕老人着凉。我们团队用最普通的STC89C52单片机搭配几个常见传感器,花了两周时间就做出了这套成本不到200元的监控方案。
系统核心功能很简单:实时监测室内PM2.5、CO2、温湿度数据,超标自动报警并联动新风系统。别看原理简单,在实际部署时我们踩了不少坑——比如传感器校准偏差、报警阈值设置、防误触设计等,这些实战经验我都会在后续详细说明。
主控选用STC89C52是经过实际对比的。虽然STM32性能更强,但对于这种单一功能场景,8位单片机完全够用,而且开发门槛低,养老院的电工都能看懂原理图。具体硬件配置:
传感器阵列:
报警模块:
通讯接口:
特别注意:MH-Z19B需要每24小时自动校准一次,我们最初没注意这点,导致第三天气体读数漂移严重。后来在代码里加入了凌晨3点自动校准逻辑。
采用前后台系统架构,避免上RTOS增加复杂度。主程序流程图如下:
c复制void main() {
hardware_init();
while(1) {
read_sensors(); // 每2秒采集一次
process_data(); // 滑动平均滤波
display_update();
if(check_alarm()) trigger_alert();
if(cloud_connected) upload_data();
delay(2000);
}
}
数据处理采用滑动窗口平均算法,窗口大小设为5次采样(即10秒数据)。实测发现这样既能平滑传感器噪声,又不会让报警响应太迟钝。
以PM2.5采集为例,PMS5003采用串口通信,关键代码:
c复制void read_pm25() {
uint8_t buf[32];
uart_receive(buf, 32);
if(buf[0]==0x42 && buf[1]==0x4d) { // 帧头校验
pm25 = (buf[12]<<8) | buf[13]; // 提取PM2.5值
}
}
传感器安装位置很有讲究:
采用三级报警机制:
报警阈值参考国家标准:
实际使用中发现老人对蜂鸣器高频音敏感,后来我们把2kHz蜂鸣器换成了500Hz的,并在首次报警后加入5分钟静音期,避免持续打扰。
现场遇到最棘手的问题是传感器偶尔读数异常。用示波器抓取发现是开关电源的纹波干扰导致,解决方法:
| 故障现象 | 可能原因 | 排查方法 |
|---|---|---|
| CO2读数始终为0 | 传感器未预热 | 通电等待3分钟 |
| PM2.5数据跳变大 | 激光腔积尘 | 用棉签清洁 |
| WiFi频繁掉线 | 路由器信道干扰 | 改用信道6或11 |
| 屏幕闪烁 | 电源电流不足 | 换用2A以上适配器 |
通过ESP8266将数据上传到免费物联网平台(如ThingsBoard),添加微信报警功能:
python复制# 示例:微信推送报警消息
def send_wechat_alert():
import requests
url = "http://push.weixin.qq.com/send"
data = {
"token": "YOUR_TOKEN",
"title": "空气质量警报",
"content": f"PM2.5当前值:{pm25}μg/m³"
}
requests.post(url, json=data)
通过继电器控制新风机组,逻辑设计要点:
经过三个月的实际运行,系统稳定监测了超过2000小时的数据。有几个值得分享的经验:
传感器需要定期维护:
针对特殊场景的优化:
下一步计划加入TVOC检测功能,正在测试SGP30传感器。这个项目的全部源码和PCB文件我都开源在了GitHub上,搜索"AirQuality-MCU"就能找到。对于想自己制作的朋友,建议先用洞洞板搭建原型,确认功能正常后再做PCB,能省下不少改板费用。