1. 项目概述这个基于WIFI的室内空气质量控制系统是我去年为一个智能家居客户开发的实战项目核心思路是通过STM32主控ESP8266 WiFi模块多种环境传感器构建一套完整的空气质量监测与调控系统。整套系统可以实时监测PM2.5、甲醛、温湿度等关键指标并通过继电器控制通风设备改善空气质量。提示项目硬件成本控制在200元以内适合作为物联网入门练手项目所有传感器模块都能在淘宝轻松采购。1.1 核心功能解析系统主要实现三大类功能环境监测通过SHT30温湿度传感器、夏普PM2.5传感器、MS1100VOC传感器和MQ135气体传感器组成的传感网络每5秒采集一次环境数据本地交互0.96寸OLED实时显示数据蜂鸣器提供超限报警远程控制通过ESP8266将数据上传至OneNet平台配套Android APP可实现远程监控和阈值设置实测中各传感器性能表现SHT30温湿度传感器±0.3℃温度精度±2%RH湿度精度夏普PM2.5传感器检测范围0-1000μg/m³分辨率1μg/m³MS1100VOC传感器甲醛检测范围0-5ppm响应时间30秒2. 硬件设计与选型2.1 主控模块方案选用STM32F103RCT6作为主控芯片主要考虑因素丰富的外设接口需要同时驱动SPI OLED、多个I2C传感器和UART WiFi模块实时性能需要保证传感器数据采集的时序精度开发生态有完善的HAL库和寄存器开发资料具体引脚分配PA4-PA7SPI接口连接OLEDPB6-PB7I2C1接口连接SHT30PA9-PA10USART1连接ESP8266PC13蜂鸣器控制PB12继电器控制2.2 传感器选型对比在项目开发初期我对比测试了多款常见传感器传感器类型候选型号最终选择选择理由温湿度DHT11/SHT30SHT30精度更高I2C接口PM2.5夏普GP2Y1010AU0F/攀藤PMS5003GP2Y1010AU0F成本更低满足需求VOCMS1100/MQ-2MS1100专为甲醛检测优化空气质量MQ135/MQ-9MQ135检测范围更广注意MQ135传感器需要预热20分钟才能稳定工作实际编程中需要加入预热计时逻辑。3. 软件架构设计3.1 主程序流程图系统采用前后台架构上电后先初始化各硬件模块进入主循环依次执行传感器数据采集每5秒一次本地显示刷新阈值判断与报警控制数据上传每分钟一次命令接收处理void main() { hardware_init(); while(1) { read_sensors(); update_display(); check_threshold(); if(upload_count 12) { upload_data(); upload_count 0; } process_cmd(); } }3.2 OneNet平台对接使用MQTT协议接入OneNet的要点设备注册在平台创建产品获取设备ID和API Key主题订阅订阅命令下发主题$sys/{pid}/{dev}/cmd数据点上传格式{ datastreams:[ { id:temp, datapoints:[{value:25.3}] }, { id:humi, datapoints:[{value:56}] } ] }踩坑记录ESP8266的AT固件需要升级到1.6.2以上版本才能稳定支持MQTT协议早期版本会出现频繁断连问题。4. 关键实现细节4.1 传感器数据处理所有传感器数据都经过三重滤波处理硬件滤波在传感器输出端添加100nF电容软件滤波连续采样5次取中值滑动平均维护一个长度为10的队列计算移动平均值以PM2.5数据为例具体实现#define SAMPLE_SIZE 5 #define AVG_WINDOW 10 int pm25_samples[SAMPLE_SIZE]; int pm25_window[AVG_WINDOW]; int window_index 0; int get_pm25_value() { // 原始采样 for(int i0; iSAMPLE_SIZE; i) { pm25_samples[i] sharp_pm25_read(); delay(10); } // 中值滤波 bubble_sort(pm25_samples, SAMPLE_SIZE); int median pm25_samples[SAMPLE_SIZE/2]; // 滑动平均 pm25_window[window_index] median; window_index (window_index 1) % AVG_WINDOW; int sum 0; for(int i0; iAVG_WINDOW; i) { sum pm25_window[i]; } return sum / AVG_WINDOW; }4.2 低功耗优化虽然本项目采用有线供电但仍做了以下优化传感器分时供电非采集时段切断传感器电源ESP8266智能休眠无数据传输时进入Light-sleep模式显示刷新控制只有数据变化超过阈值时才刷新OLED实测功耗对比持续工作模式85mA优化后模式平均45mA5. 常见问题与解决方案5.1 传感器读数异常现象PM2.5值持续显示为0排查步骤检查传感器供电电压需5V±0.2V测量LED引脚是否有脉冲信号检查ADC引脚连接和配置确认光学窗口无遮挡解决方案更换质量更好的5V稳压模块后问题解决5.2 WiFi频繁断开现象ESP8266每10分钟左右断开连接可能原因路由器设置了连接超时MQTT KeepAlive设置过小电源干扰导致模块重启优化措施在路由器设置白名单将KeepAlive从60秒改为300秒在ESP8266电源端添加470μF电容5.3 继电器误动作现象风扇偶尔会无故启动根本原因STM32引脚未配置上拉受干扰误触发修改方案// 修改GPIO初始化代码 GPIO_InitTypeDef gpio; gpio.Pin FAN_PIN; gpio.Mode GPIO_MODE_OUTPUT_PP; gpio.Pull GPIO_PULLUP; // 增加上拉 gpio.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(FAN_PORT, gpio);6. 项目扩展方向在实际部署中我发现这套系统还可以进一步优化增加LoRa组网适合大户型多房间部署通过LoRa节点收集各房间数据接入智能音箱增加语音播报功能通过天猫精灵/小爱同学提醒数据分析功能在云端增加趋势分析和异常预警算法联动其他设备当空气质量差时自动关闭窗户需配合电动窗帘硬件上可以考虑升级到STM32F4系列运行FreeRTOS实现多任务改用工业级传感器提升长期稳定性设计PCB替代洞洞板提高可靠性这个项目最让我意外的是MQ135传感器的表现 - 虽然价格低廉但经过精心校准后其检测结果与专业设备的相关性达到0.89。关键在于要建立针对不同气体的特征曲线我在项目资料包中提供了详细的校准方法和参数表。