1. 项目概述
这个基于STM32的室内甲醛净化系统是我最近完成的一个实用型智能家居项目。作为一名长期从事嵌入式开发的工程师,我发现市面上很多空气净化设备要么价格昂贵,要么功能单一,于是决定自己动手打造一个多功能、低成本的解决方案。
这个系统的核心功能包括:
- 实时监测甲醛、烟雾和可燃气体的浓度
- 通过OLED屏幕直观显示环境数据
- 根据预设阈值自动控制净化器和排气扇
- 支持手机APP远程监控和控制
整个系统采用模块化设计,硬件成本控制在200元以内,非常适合DIY爱好者复现。下面我将从硬件选型、电路设计、程序开发和实际应用等多个维度,详细分享这个项目的完整实现过程。
2. 硬件设计与选型
2.1 核心控制器选择
我选择了STM32F103C8T6作为主控芯片,主要基于以下几点考虑:
- 性价比高:这款Cortex-M3内核的MCU价格仅10元左右,却拥有72MHz主频和丰富的外设资源
- 开发生态完善:有成熟的HAL库和标准库支持,社区资源丰富
- 引脚数量适中:48脚的LQFP封装正好满足本项目需求,不会造成资源浪费
提示:对于初次接触STM32的开发者,建议先熟悉CubeMX工具,可以快速完成引脚分配和基础配置。
2.2 传感器模块选型
2.2.1 甲醛传感器
选用ZE08-CH2O电化学甲醛传感器,特点:
- 检测范围:0-5ppm
- 分辨率:0.01ppm
- 采用UART输出,直接输出浓度值
- 预热时间约3分钟
实测中发现,这款传感器需要定期校准(约每3个月一次),否则读数会逐渐偏差。
2.2.2 烟雾传感器
使用常见的MQ-2半导体传感器:
- 检测气体:烟雾、LPG、丙烷等
- 工作电压:5V
- 模拟量输出
- 需要预热约1分钟
2.2.3 可燃气体传感器
选用MQ-5传感器:
- 专门检测天然气、液化气
- 灵敏度高(0.5-10ppm)
- 同样采用模拟输出
2.3 其他关键部件
- 显示模块:0.96寸OLED(SSD1306驱动),I2C接口,功耗低且显示效果清晰
- 无线模块:ESP8266-01S,通过AT指令与STM32通信,实现WiFi连接
- 执行机构:
- 5V小型直流风扇(用于排气)
- 12V轴流风扇+活性炭滤网(净化系统)
- 电源设计:
- 主电源:12V/2A适配器
- 通过AMS1117-3.3和LM2596分别提供3.3V和5V
3. 电路设计详解
3.1 原理图设计要点

-
STM32最小系统:
- 包括复位电路、8MHz晶振、启动模式选择
- 所有未用IO口引出测试点,方便调试
-
传感器接口电路:
- 甲醛传感器:直接连接USART2
- MQ-2/MQ-5:通过100nF电容滤波后接入ADC
- 每个传感器电源端加磁珠抑制高频干扰
-
ESP8266连接电路:
- 使用USART1通信
- CH340G实现USB转串口,方便单独调试
- 注意EN引脚需要上拉
-
风扇驱动电路:
- 采用S8050三极管驱动
- 续流二极管防止反电动势
- 12V风扇需要MOSFET(如IRLZ44N)驱动
3.2 PCB设计经验

-
布局原则:
- 模拟部分(传感器)与数字部分(MCU)分区布置
- 大电流路径(如风扇)尽量短而宽
- WiFi模块远离模拟信号线
-
布线技巧:
- 传感器信号线走线等长
- 电源线宽度不小于0.5mm
- 关键信号(如晶振)包地处理
-
实战教训:
- 第一次打样时忘记加电源指示灯,调试很不方便
- ADC采样线最初太靠近高频信号,导致读数波动大
- 12V和5V地平面需要单点连接,避免形成环路
4. 软件架构与实现
4.1 程序框架设计
采用前后台系统架构:
- 前台:主循环处理业务逻辑
- 后台:定时器中断处理时序关键任务
c复制// 主程序结构
int main(void)
{
hardware_init(); // 硬件初始化
gizwitsInit(); // WiFi模块初始化
while(1)
{
key_scan(); // 按键扫描
sensor_data_get(); // 获取传感器数据
display_update(); // 更新显示
control_logic(); // 执行控制逻辑
wifi_handle(); // 处理WiFi通信
delay_ms(100);
}
}
4.2 关键功能实现
4.2.1 传感器数据采集
c复制void SensorDataGet(void)
{
// 甲醛传感器读取
if(USART2_RX_STA&0x8000) // 接收完成标志
{
JQ1 = (USART2_RX_BUF[4]<<8)|USART2_RX_BUF[5];
USART2_RX_STA = 0;
}
// ADC采样处理
smoke = Get_Adc_Average(ADC_Channel_0, 5)*3300/4096;
air = Get_Adc_Average(ADC_Channel_1, 5)*3300/4096;
}
注意:ADC采样需要多次平均(通常5-10次)以消除噪声,且最好在定时器中断中定期采样。
4.2.2 控制逻辑实现
c复制void control_logic(void)
{
// 甲醛控制
if(JQ1 > JQyz) // 超过阈值
{
FANJH = 1; // 开启净化
delay_ms(5000); // 持续5秒
}
else
{
FANJH = 0;
}
// 烟雾/燃气控制
if((smoke > smokeyz) || (air > airyz))
{
FANPF = 1; // 开启排气
}
else
{
FANPF = 0;
}
}
4.3 WiFi通信实现
使用机智云平台提供的SDK,关键步骤:
- 协议对接:
c复制void gizwitsEventProcess(eventInfo_t *info)
{
if(info->event == EVENT_JQyz)
{
JQyz = info->para[0]<<8 | info->para[1]; // 更新阈值
}
// 其他事件处理...
}
- 数据上报:
c复制currentDataPoint.valueJQ1 = JQ1;
currentDataPoint.valuesmoke = smoke;
currentDataPoint.valueair = air;
gizwitsHandle((dataPoint_t *)¤tDataPoint);
5. 开发中的问题与解决方案
5.1 传感器读数不稳定
现象:MQ-2传感器数值在无烟雾环境下频繁跳动
排查过程:
- 检查电源:发现5V纹波较大(约200mV)
- 增加LC滤波后改善不明显
- 最终发现是ADC参考电压不稳定
解决方案:
- 为VREF增加1个10uF钽电容
- 软件上采用滑动平均滤波:
c复制#define FILTER_LEN 10
uint16_t filter_buf[FILTER_LEN];
uint16_t moving_average(uint16_t new_val)
{
static uint8_t index = 0;
uint32_t sum = 0;
filter_buf[index++] = new_val;
if(index >= FILTER_LEN) index = 0;
for(uint8_t i=0; i<FILTER_LEN; i++)
{
sum += filter_buf[i];
}
return sum/FILTER_LEN;
}
5.2 WiFi频繁断连
现象:ESP8266工作一段时间后失去响应
原因分析:
- 电源带载能力不足
- 软件看门狗未喂食
- 缓冲区溢出
最终方案:
- 为ESP8266单独增加1000uF电容
- 添加硬件看门狗电路
- 优化AT指令处理流程:
c复制void ESP8266_SendCmd(char *cmd, char *ack, uint16_t timeout)
{
USART1_RX_STA = 0;
printf("%s\r\n", cmd); // 发送命令
while(timeout--)
{
if(USART1_RX_STA&0x8000) // 接收完成
{
if(strstr((char*)USART1_RX_BUF, ack) != NULL)
{
return SUCCESS;
}
}
delay_ms(1);
}
return FAILURE;
}
6. 项目优化与扩展
6.1 已完成优化
-
功耗优化:
- 空闲时关闭OLED背光
- 传感器采用间歇工作模式(每分钟唤醒一次)
- 整体待机功耗从1.2W降至0.5W
-
可靠性提升:
- 增加硬件看门狗
- 关键数据EEPROM备份
- 异常状态自动恢复机制
6.2 ��来扩展方向
-
功能扩展:
- 增加PM2.5检测(如攀藤PMS5003)
- 支持多房间组网(LoRa模块)
- 添加语音报警功能
-
算法优化:
- 采用PID控制风扇转速
- 基于历史数据的智能预测
- 异常模式机器学习识别
-
产品化改进:
- 设计3D打印外壳
- 开发iOS/Android双平台APP
- 通过CE/FCC认证
7. 实际应用效果
经过两周的连续测试,系统表现出色:
- 甲醛检测误差:±0.03ppm
- 响应时间:<3秒(从超标到启动设备)
- WiFi连接稳定性:72小时无断连
- 误报率:<1次/周
在20平米的卧室环境中测试:
- 初始甲醛浓度0.12ppm
- 开启净化30分钟后降至0.05ppm以下
- 香烟烟雾可在2分钟内排净
这个项目从构思到完成历时约1个月,物料成本约180元,但实现了商业产品上千元级别的功能。最重要的是,作为开发者可以完全掌握所有细节,随时进行功能调整和优化。
