1. 项目概述
作为一名在嵌入式系统领域摸爬滚打多年的工程师,我最近完成了一个特别实用的项目——基于单片机的室内空气质量监控系统。这个系统可以实时监测我们每天呼吸的空气质量,包括PM2.5、二氧化碳浓度、温湿度等关键指标。不同于市面上那些价格昂贵的商用设备,这个方案成本不到200元,但精度完全能满足家庭和办公室的日常需求。
室内空气质量直接影响我们的健康和工作效率。根据我的实测数据,很多封闭的办公室二氧化碳浓度经常超过1500ppm(国际标准建议不超过1000ppm),长期处于这种环境会导致头晕、注意力不集中。通过这个DIY系统,你可以随时掌握室内空气状况,及时开窗通风或开启空气净化设备。
2. 系统设计与硬件选型
2.1 核心功能需求分析
在设计之初,我明确了系统需要实现的几个核心功能:
- 多参数监测:PM2.5、CO2、温湿度是影响空气质量的最关键指标
- 实时显示:需要直观的数字和图形化展示
- 超标报警:当某项指标超过安全阈值时及时提醒
- 数据记录:存储历史数据用于分析空气质量变化趋势
- 低功耗设计:适合7×24小时连续运行
2.2 硬件组件选型与对比
经过多次测试和比较,我最终确定了以下硬件配置方案:
| 组件类型 | 选型型号 | 关键参数 | 成本 | 选择理由 |
|---|---|---|---|---|
| 主控芯片 | STM32F103C8T6 | 72MHz, 64KB Flash, 20KB RAM | ¥15 | 性价比高,资源充足 |
| PM2.5传感器 | 攀藤PMS5003 | 量程0-1000μg/m³,精度±10% | ¥85 | 激光散射原理,响应快 |
| CO2传感器 | MH-Z19B | 0-5000ppm,精度±(50ppm+5%读数) | ¥65 | NDIR原理,稳定性好 |
| 温湿度传感器 | SHT30 | 温度±0.2℃,湿度±2%RH | ¥25 | I2C接口,精度高 |
| 显示屏 | 1.3寸OLED | 128×64分辨率,I2C接口 | ¥18 | 省电,显示清晰 |
| 其他 | 蜂鸣器、LED等 | - | ¥10 | 报警提示用 |
提示:传感器选型时要特别注意接口类型。我选择的都是数字输出传感器,省去了复杂的模拟信号处理电路,大大降低了开发难度。
3. 系统硬件搭建
3.1 电路设计要点
整个系统的电路设计遵循"模块化"思路,各个传感器通过标准接口与主控连接:
- 电源部分:采用AMS1117-3.3稳压芯片,将5V输入转为3.3V供主控和传感器使用
- 传感器接口:
- PMS5003:UART串口通信
- MH-Z19B:UART串口通信(注意需要5V供电)
- SHT30:I2C接口
- 显示模块:OLED通过I2C连接
- 报警装置:蜂鸣器+LED通过GPIO控制
3.2 PCB布局技巧
在制作PCB时,有几个关键注意事项:
- 传感器要远离主控芯片,避免电磁干扰影响读数
- 为每个传感器预留足够的安装空间
- 电源走线要足够宽(建议≥0.5mm)
- 串口线上可串联100Ω电阻减少信号反射
4. 软件系统实现
4.1 程序架构设计
整个软件采用模块化设计,主要分为以下几个部分:
c复制// 主程序框架示例
int main(void) {
hardware_init(); // 硬件初始化
sensor_init(); // 传感器初始化
display_init(); // 显示初始化
while(1) {
read_sensors(); // 读取所有传感器数据
process_data(); // 数据处理
update_display();// 更新显示
check_alarm(); // 检查是否超标
save_data(); // 存储数据
delay_ms(1000); // 1秒周期
}
}
4.2 关键算法实现
4.2.1 传感器数据滤波
传感器读数往往存在波动,需要采用合适的滤波算法:
c复制// 移动平均滤波实现
#define FILTER_SIZE 5
float filter_pm25(float new_value) {
static float buffer[FILTER_SIZE] = {0};
static uint8_t index = 0;
static float sum = 0;
sum -= buffer[index]; // 减去最旧的值
buffer[index] = new_value; // 存入新值
sum += new_value; // 加上新值
index = (index + 1) % FILTER_SIZE;
return sum / FILTER_SIZE; // 返回平均值
}
4.2.2 空气质量指数(AQI)计算
根据国家标准GB 3095-2012,PM2.5的AQI计算公式如下:
c复制// PM2.5 AQI计算
int calculate_aqi_pm25(float concentration) {
// AQI分段限值表
const float bp_high[6] = {35,75,115,150,250,500};
const float bp_low[6] = {0,35,75,115,150,250};
const int i_high[6] = {50,100,150,200,300,500};
const int i_low[6] = {0,50,100,150,200,300};
for(int i=0; i<6; i++) {
if(concentration <= bp_high[i]) {
return (int)((i_high[i]-i_low[i])/(bp_high[i]-bp_low[i])*(concentration-bp_low[i])+i_low[i]);
}
}
return 500; // 超过500按500计算
}
4.3 显示界面设计
OLED显示采用多页面设计,通过按键切换:
- 主页面:显示所有参数的实时数值
- 趋势图页面:显示最近1小时的变化曲线
- 历史数据页面:显示日统计数据
- 设置页面:调整报警阈值等参数
5. 系统校准与测试
5.1 传感器校准方法
-
CO2传感器校准:
- 将传感器置于室外新鲜空气中(400ppm左右)
- 通电预热20分钟后,发送校准命令
- 命令格式:0xFF 0x01 0x87 0x00 0x00 0x00 0x00 0x78
-
PM2.5传感器校准:
- 使用专业校准设备比对
- 或在空气洁净的室内(PM2.5<10)进行零点校准
5.2 系统精度测试
我使用专业级空气质量检测仪作为参考,测试结果如下:
| 参数 | 测试值 | 系统读数 | 误差 | 是否达标 |
|---|---|---|---|---|
| PM2.5 | 50μg/m³ | 53μg/m³ | +6% | 是 |
| CO2 | 800ppm | 785ppm | -1.9% | 是 |
| 温度 | 25.3°C | 25.1°C | -0.2°C | 是 |
| 湿度 | 45%RH | 46%RH | +1%RH | 是 |
6. 常见问题与解决方案
6.1 传感器读数不稳定
可能原因及解决方法:
- 电源噪声 - 增加滤波电容(推荐100μF电解+0.1μF陶瓷)
- 接线过长 - 缩短传感器与主控的距离,或使用屏蔽线
- 电磁干扰 - 让传感器远离电机、继电器等干扰源
6.2 CO2传感器预热问题
MH-Z19B需要充分预热才能获得稳定读数:
- 首次使用建议预热30分钟
- 长期断电后重新通电需要15分钟预热
- 可以通过加热传感器缩短预热时间(需谨慎)
6.3 数据存储方案选择
根据需求可以选择不同的存储方案:
- 内部Flash:适合少量数据,无需额外硬件
- EEPROM:如24C02,适合中等数据量
- SD卡:适合大量数据记录,但增加复杂度
- 无线传输:通过WiFi/蓝牙上传到云端
7. 系统优化与扩展
7.1 低功耗优化技巧
- 调整传感器采样频率:
- PM2.5传感器可设置为30秒唤醒一次
- CO2传感器设置为5分钟测量一次
- 使用睡眠模式:
- 主控在空闲时进入STOP模式
- 通过RTC定时唤醒
- 优化显示:
- 降低OLED亮度
- 设置自动关闭时间
7.2 物联网功能扩展
通过添加ESP8266模块,可以实现:
- 数据上传到云平台(如阿里云IoT)
- 微信小程序远程监控
- 超标报警推送
- 与智能家居联动(自动开启净化器)
硬件连接示意图:
code复制STM32 <--UART--> ESP8266
|
V
云服务器
7.3 外壳设计与安装建议
- 选择通风良好的外壳,避免传感器被遮挡
- 安装位置:
- 离地1.2-1.5米(呼吸带高度)
- 远离门窗和通风口
- 避免阳光直射
- 可以考虑3D打印定制外壳
在实际部署中,我发现将系统安装在办公室中央位置,距离人员活动区域1.5米左右的位置,获得的监测数据最具代表性。避免安装在墙角或家具后面,这些位置空气流通不畅,会导致监测数据失真。