1. 项目概述:当STM32遇上甲醛治理
去年帮学弟调试这个除甲醛装置时,我们对着传感器数据折腾到凌晨三点。市面上动辄上千元的除醛设备,核心不过是一块STM32F103C8T6蓝板子搭配几组传感器。这个毕业设计项目用不到200元的硬件成本,实现了市面商用设备80%以上的核心功能。
典型的除醛装置包含三大模块:STM32主控板作为"大脑"负责数据处理和逻辑控制,甲醛传感器作为"鼻子"实时监测浓度,执行机构(风扇+净化模块)作为"手"完成物理除醛。系统通过OLED屏显示实时数据,当浓度超标时自动启动净化程序,必要时通过蜂鸣器报警。
2. 硬件设计:精打细算的BOM清单
2.1 主控芯片选型对比
STM32F103C8T6(蓝板)之所以成为毕业设计首选,主要基于三点考量:
- 72MHz主频足够处理传感器数据(甲醛传感器采样周期通常>2s)
- 内置12位ADC满足模拟信号采集需求
- 市场价格仅12-15元(2023年报价)
相较之下,STM32F407VET6虽然性能更强,但:
- 超过40元的单价对毕设不友好
- 需要配合更复杂的电路设计
- 资源利用率不足50%造成浪费
经验提示:淘宝购买时认准"STM32F103C8T6最小系统板",注意检查芯片丝印。曾有学生买到GD32仿制品导致驱动不兼容。
2.2 甲醛传感器选型指南
MQ-138与ZE08-CH2O的实测对比:
| 参数 | MQ-138(半导体式) | ZE08-CH2O(电化学) |
|---|---|---|
| 检测范围 | 1-100ppm | 0-5ppm |
| 精度 | ±15% | ±5% |
| 响应时间 | <60s | <30s |
| 寿命 | 2年 | 3年 |
| 单价 | 25元 | 180元 |
| 适用场景 | 工业环境 | 家居环境 |
毕业设计推荐使用MQ-138,虽然精度稍低但完全满足教学演示需求。注意要配合温度补偿算法:
c复制// 温度补偿公式示例
float temp_compensation(float raw_val, float temp) {
return raw_val * (1 + 0.02 * (temp - 25));
}
2.3 执行机构设计细节
风扇控制电路要注意:
- 必须使用MOS管驱动(如IRLZ44N)
- 添加续流二极管防止反电动势
- PWM频率建议设置在25-30kHz避免可闻噪声
净化模块可采用:
- 活性炭滤网(成本低但需定期更换)
- 光触媒涂层(需配合UV灯使用)
- 静电集尘(需要高压发生器)
3. 软件架构:状态机驱动设计
3.1 主程序流程图解析
c复制void main() {
hardware_init();
while(1) {
switch(system_state) {
case IDLE:
if(甲醛浓度 > 阈值) system_state = PURIFY;
break;
case PURIFY:
fan_control(70); // 70%占空比
if(浓度 < 安全值) system_state = IDLE;
break;
case ALARM:
buzzer_on();
if(用户按键) system_state = IDLE;
break;
}
oled_display(浓度值);
}
}
3.2 关键算法实现
移动平均滤波算法消除传感器噪声:
c复制#define FILTER_LEN 5
float filter_buf[FILTER_LEN];
float moving_avg(float new_val) {
static uint8_t index = 0;
filter_buf[index++] = new_val;
if(index >= FILTER_LEN) index = 0;
float sum = 0;
for(uint8_t i=0; i<FILTER_LEN; i++) {
sum += filter_buf[i];
}
return sum / FILTER_LEN;
}
3.3 OLED显示优化技巧
使用u8g2库时注意:
- 先调用
u8g2_ClearBuffer()再绘制 - 固定内容使用全缓冲模式
- 动态数据使用局部刷新
显示布局建议:
code复制+-------------------+
| 当前浓度: 0.08ppm |
| 安全阈值: 0.10ppm |
| 温度: 25.5℃ |
| 状态: 监测中 |
+-------------------+
4. 调试经验与问题排查
4.1 典型故障现象分析
传感器读数不稳定:
- 检查电源是否添加了100μF+0.1μF去耦电容
- 确认ADC采样周期设置合理(建议239.5周期)
- 尝试软件滤波算法
风扇启动失败:
- 测量MOS管栅极电压是否达到开启阈值
- 检查PWM信号是否正常输出(用示波器观察)
- 确认续流二极管方向正确
4.2 电磁兼容性处理
实测中发现的问题及解决方案:
- 电机干扰导致ADC读数跳变
- 在电机电源线加磁环
- ADC输入线使用屏蔽线
- 继电器动作造成MCU复位
- 在继电器线圈并联1N4007
- 加强电源滤波
4.3 功耗优化方案
待机模式下可采取:
- 关闭OLED背光(节省15mA)
- 降低采样频率(从1Hz降到0.2Hz)
- 使用STOP模式(电流降至500μA)
实测数据对比:
| 模式 | 电流消耗 | 响应延迟 |
|---|---|---|
| 全速运行 | 85mA | 即时 |
| 待机模式 | 22mA | <1s |
| STOP模式 | 0.5mA | 2-3s |
5. 功能扩展方向
5.1 无线数据传输模块
添加ESP-01S实现微信报警:
- 通过AT指令连接路由器
- 调用Server酱API发送通知
- 注意增加重发机制
典型报文格式:
json复制{
"device": "甲醛检测仪",
"value": 0.12,
"unit": "ppm",
"status": "危险"
}
5.2 历史数据记录
使用SPI Flash存储数据:
- W25Q16(2MB)可存储30天数据(5分钟间隔)
- 采用环形缓冲区设计
- 通过USB导出CSV格式
5.3 多传感器融合
增加TVOC+PM2.5检测:
- 使用SGP30检测TVOC
- 攀藤PMS5003测PM2.5
- 综合空气质量指数算法:
c复制float AQI = 0.6*HCHO + 0.3*TVOC + 0.1*PM2.5;
6. 工程文件管理建议
推荐的项目目录结构:
code复制/Project
├── /Hardware
│ ├── Schematic.pdf
│ └── BOM.xlsx
├── /Software
│ ├── MDK-ARM
│ └── STM32CubeIDE
├── /Docs
│ ├── 参考文献
│ └── 测试报告
└── README.md
版本控制技巧:
- 每天提交时添加注释说明
- 硬件版本使用HWRx标注
- 软件版本遵循SemVer规范
在面包板上调试时,建议先用杜邦线连接核心功能,验证通过后再制作PCB。遇到过最头疼的问题是传感器接反导致基准电压异常,后来养成了给所有接口添加防呆设计的习惯。