1. 项目背景与核心价值
空气质量问题已经成为现代城市居民最关注的健康隐患之一。去年冬天我所在的城市连续多天出现雾霾天气,当时就想如果能实时掌握室内外的空气质量数据,就能更好地安排户外活动和通风计划。市面上虽然有不少商业化的检测设备,但要么价格昂贵,要么功能单一,于是萌生了自己动手做一个多功能空气质量检测仪的想法。
这个基于单片机的空气质量检测仪最大的特点在于它的可定制性。你可以根据需求自由搭配不同的传感器模块,监测PM2.5、PM10、二氧化碳、甲醛、TVOC等多种空气指标,成本却只有商业设备的1/3到1/5。整套系统采用模块化设计,即使没有电子基础的爱好者也能轻松组装,数据可以通过LCD屏实时显示,也能通过WiFi模块上传到手机APP,实现远程监控。
2. 硬件系统设计
2.1 核心器件选型
主控芯片我选择了STM32F103C8T6这款ARM Cortex-M3内核的单片机,它有着72MHz的主频、64KB Flash和20KB RAM,完全能满足多传感器数据处理的需求,而且价格只要十几块钱。相比Arduino,STM32的性能更强,功耗更低,更适合长期运行的监测设备。
传感器部分采用了以下组合:
- PMS5003激光粉尘传感器(检测PM2.5/PM10)
- SGP30气体传感器(检测TVOC和CO₂)
- DHT22温湿度传感器
- MQ-135空气质量传感器(检测NH3、NOx等有害气体)
提示:传感器选型时要特别注意测量范围和精度。比如PMS5003的PM2.5检测范围是0-1000μg/m³,精度±10%,完全能满足日常监测需求。
2.2 电路设计要点
电源部分采用AMS1117-3.3V稳压芯片,将5V输入降压为3.3V供主控和传感器使用。考虑到部分传感器功耗较大(如PMS5003工作电流约100mA),我在电源输入端并联了一个1000μF的电解电容,确保系统稳定运行。
传感器接口设计:
- PMS5003通过UART接口连接
- SGP30和MQ-135使用I2C接口
- DHT22使用单总线协议
为了简化布线,我设计了一块转接板,将所有传感器的电源和通信线路集中管理,通过排线连接到主控板。这样不仅美观,也方便后期维护和升级。
3. 软件系统实现
3.1 嵌入式程序开发
使用Keil MDK开发环境,基于HAL库进行开发。主程序采用状态机设计模式,主要包含以下几个任务:
- 传感器数据采集任务(优先级最高)
- 数据处理与校准任务
- 显示更新任务
- 数据上传任务(如启用)
传感器数据采集的关键代码示例:
c复制void PMS_ReadData(void)
{
uint8_t buffer[32];
HAL_UART_Receive(&huart1, buffer, 32, 100);
if(buffer[0] == 0x42 && buffer[1] == 0x4d) // 检查帧头
{
pm25 = (buffer[12]<<8) | buffer[13]; // PM2.5浓度
pm10 = (buffer[10]<<8) | buffer[11]; // PM10浓度
}
}
3.2 数据处理算法
传感器原始数据需要经过以下处理:
-
滑动平均滤波:消除瞬时波动
c复制#define FILTER_LEN 5 float pm25_values[FILTER_LEN]; float moving_average(float new_value) { static uint8_t index = 0; pm25_values[index++] = new_value; if(index >= FILTER_LEN) index = 0; float sum = 0; for(int i=0; i<FILTER_LEN; i++) { sum += pm25_values[i]; } return sum/FILTER_LEN; } -
温度补偿:特别是气体传感器受温度影响较大
-
基线校准:SGP30需要定期进行基线校准
3.3 用户界面设计
使用1.3寸OLED显示屏显示实时数据,界面布局如下:
code复制-----------------
| PM2.5: 35μg/m³ |
| PM10: 50μg/m³ |
| CO₂: 650ppm |
| Temp: 25.5℃ |
| Humi: 45%RH |
-----------------
通过按键可以切换不同的显示页面,查看历史数据曲线和各项指标的等级评价(优/良/轻度污染/重度污染等)。
4. 系统优化与实测
4.1 低功耗设计
为了实现长期监测,我做了以下优化:
- 调整STM32的工作模式,在不采集数据时进入Stop模式
- 关闭不使用的传感器电源(通过MOS管控制)
- 降低显示屏亮度并设置自动关闭时间
实测下来,系统平均工作电流从80mA降到了25mA,使用2000mAh的锂电池可以连续工作3天左右。
4.2 数据准确性验证
将设备与商业级检测仪(价格约2000元)进行对比测试:
| 指标 | 本设备读数 | 商用设备读数 | 误差 |
|---|---|---|---|
| PM2.5 | 58μg/m³ | 62μg/m³ | 6.5% |
| CO₂ | 1120ppm | 1080ppm | 3.7% |
| 温度 | 26.3℃ | 26.1℃ | 0.8% |
结果显示主要指标的误差都在可接受范围内,完全能满足家庭使用需求。
4.3 外壳设计与安装
使用3D打印制作了一个尺寸为100×70×50mm的外壳,正面开孔用于传感器进气,背面设计有挂墙孔和支架接口。外壳材料选用ABS塑料,既轻便又有足够的强度。
安装时要注意:
- 避免将设备安装在空调出风口或窗户旁边
- 离地面高度建议1.2-1.5米(模拟人体呼吸高度)
- 定期清洁传感器进气口,防止灰尘堆积影响精度
5. 常见问题与解决方法
5.1 传感器读数异常
现象:PM2.5数值突然跳到999μg/m³
排查:
- 检查激光传感器窗口是否被灰尘遮挡
- 测量传感器供电电压是否稳定(应在4.5-5.5V之间)
- 重新插拔传感器连接线
解决方案:清洁传感器窗口后恢复正常
5.2 WiFi连接不稳定
现象:数据上传经常中断
优化措施:
- 在代码中添加WiFi重连机制
c复制void WiFi_Reconnect(void) { if(WiFi_Status() != CONNECTED) { WiFi_Disconnect(); HAL_Delay(1000); WiFi_Connect(); } } - 调整ESP8266模块的天线位置
- 在路由器设置中将设备IP设为静态分配
5.3 电池续航时间短
可能原因:
- 显示屏亮度设置过高
- 传感器采样频率太快(默认是1次/分钟)
- 电池容量衰减
优化方案:
- 将屏幕亮度调到50%
- 调整采样间隔为5分钟(对空气质量监测足够)
- 更换大容量电池或外接电源
6. 项目扩展方向
这套系统还有很大的改进空间:
- 增加GPS模块,制作便携式移动监测设备
- 开发微信小程序,实现多设备数据汇总和分析
- 结合智能家居系统,当空气质量超标时自动开启空气净化器
- 使用太阳能供电,实现完全无线化
我在实际使用中发现,将设备放在卧室和客厅各一台,通过对比数据能明显看出不同时段的空气质量变化规律。比如早晨开窗通风后PM2.5会快速下降,而CO₂浓度在夜间关闭门窗后会逐渐升高到1200ppm以上,这些数据对改善居住环境很有参考价值。