1. 项目概述:基于STM32的智能空气净化系统
去年装修新房时,我被甲醛问题困扰许久。市面上的空气净化器要么价格昂贵,要么功能单一,于是萌生了自己开发智能净化系统的想法。这个基于STM32F103C8T6的方案,整合了环境监测、智能控制和远程管理三大核心功能,成本不到200元,却实现了商业产品80%的功能。
系统通过DHT11温湿度传感器和甲醛传感器实时采集环境数据,OLED屏本地显示,ESP8266模块实现手机APP远程监控。当检测值超过阈值时,自动触发净化装置并报警。特别设计了模块化PCB,使得传感器和控制器可以灵活更换。下面我将从硬件设计、程序架构到调试技巧,完整分享这个项目的实现过程。
2. 核心硬件设计解析
2.1 主控选型与外围电路
选择STM32F103C8T6作为主控主要基于三点考量:
- 72MHz主频和20KB RAM足够处理传感器数据
- 内置3个USART接口完美匹配WIFI模块、调试串口和预留扩展
- 丰富的GPIO可驱动OLED、按键矩阵和继电器组
电源电路采用AMS1117-3.3V稳压芯片,输入支持5-12V宽电压。实测中,当继电器动作时电压会出现约0.2V波动,因此在每个传感器供电脚都增加了100μF电容,有效解决了数据跳变问题。
关键经验:DHT11数据引脚必须接4.7K上拉电阻,否则在高温环境下会出现20%以上的误码率。这是数据手册中没有明确指出的细节。
2.2 传感器模块设计
甲醛传感器选用ZE08-CH2O电化学模组,其特性如下表:
| 参数 | 数值 |
|---|---|
| 检测范围 | 0-5ppm |
| 分辨率 | 0.01ppm |
| 响应时间 | <60s |
| 工作电流 | 45mA@5V |
| 输出方式 | UART/PWM |
实际使用中发现两个关键点:
- 传感器需要至少3分钟预热才能稳定
- 每30天需要进行一次8小时以上的持续通电校准
温湿度模块采用DHT11,虽然精度(湿度±5%,温度±2℃)不如SHT30,但其5元左右的成本和单总线协议大大简化了电路设计。在代码中采用三次采样取中值的策略,有效提升了数据稳定性。
2.3 PCB布局要点
四层板设计经验:
- 顶层:信号走线(0.2mm线宽)
- 内层1:3.3V电源平面
- 内层2:GND平面
- 底层:大电流走线(继电器部分1mm线宽)
特别注意将ESP8266模块放置在板边,天线区域严禁覆铜。继电器与传感器之间用开槽隔离,实测可将电磁干扰降低60%。所有数字信号线都做了50Ω阻抗匹配,这在72MHz时钟下至关重要。
3. 软件架构与关键代码
3.1 主程序流程图解
c复制void main() {
硬件初始化();
while(1) {
读取传感器数据();
处理阈值判断();
更新OLED显示();
处理WIFI通信();
执行控制逻辑();
延时(100ms);
}
}
采用时间片轮询架构而非RTOS,主要考虑:
- 任务数量少且周期固定
- 避免RTOS带来的内存开销(F103C8T6仅20KB RAM)
- 简化调试难度
3.2 传感器数据处理
DHT11驱动中的关键时序代码:
c复制void DHT11_Start() {
GPIO_ResetBits(DHT11_PORT, DHT11_PIN);
Delay_ms(18); // 严格保持18ms低电平
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
Delay_us(30); // 主机拉高20-40us
while(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); // 等待从机响应
while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); // 等待响应结束
}
常见问题排查:
- 若始终读取失败,检查上拉电阻是否接触不良
- 数据位间隔超过70μs会导致解码错误
- 连续读取间隔应大于1秒
3.3 WIFI通信协议设计
采用自定义精简协议,帧格式如下:
| 字节 | 内容 | 说明 |
|---|---|---|
| 0 | 0xA5 | 帧头 |
| 1 | 0x5A | 帧头 |
| 2 | CMD | 指令类型 |
| 3 | LEN | 数据长度 |
| 4-N | DATA | 数据 |
| N+1 | CHECKSUM | 校验和(累加和取反) |
实测在家庭路由器环境下,平均通信延迟120ms,丢包率<0.1%。为提高可靠性,在APP端实现了三次重传机制。
4. 调试经验与性能优化
4.1 电磁兼容问题解决
初期测试发现,继电器动作时会导致ESP8266断连。通过以下措施解决:
- 在继电器线圈两端并联1N4007续流二极管
- 电源输入端增加π型滤波电路(100μF+100Ω+100μF)
- WIFI模块供电单独使用LD1117稳压
4.2 功耗优化策略
系统各模块电流消耗:
| 模块 | 工作电流 | 休眠电流 |
|---|---|---|
| STM32 | 25mA | 2mA |
| ESP8266 | 80mA | 0.5mA |
| 甲醛传感器 | 45mA | 0.1mA |
| OLED | 15mA | 0mA |
通过以下优化使待机功耗从165mA降至8mA:
- 非活跃期关闭OLED背光
- 设置ESP8266每5秒唤醒一次查询指令
- 使用STM32的Stop模式替代Idle模式
4.3 移动端APP开发
采用MIT App Inventor快速开发控制界面,关键功能包括:
- 实时数据曲线显示
- 阈值滑动设置条
- 手动控制开关
- 报警历史记录
界面布局参考了米家APP的简洁风格,主要操作能在两次点击内完成。数据刷新采用差异更新策略,减少流量消耗。
5. 项目扩展方向
当前系统已稳定运行6个月,后续计划:
- 增加PM2.5激光传感器(注意需要增加风扇驱动电路)
- 接入语音控制模块(如LD3320)
- 开发微信小程序控制端
- 实现多设备组网联动
特别提醒:若增加LoRa模块实现远距离传输,需要重新设计天线匹配电路,并注意符合无线电管理规定。在封闭环境测试时,传输距离会缩短30%-40%。