1. 项目概述与设计背景
室内空气质量监测一直是环境安全领域的重要课题。作为一名长期从事嵌入式开发的工程师,我最近完成了一个基于STM32的室内有毒有害气体监测系统设计。这个项目特别适合作为高校电子类专业的毕业设计选题,也适用于智能家居、工业环境监测等实际应用场景。
系统核心采用STM32F103C8T6单片机作为主控制器,这是一款性价比极高的Cortex-M3内核处理器,具有丰富的外设接口和适中的运算能力,非常适合此类实时监测应用。我在项目中集成了6种不同类型的气体传感器,能够全面监测室内常见的危险气体成分。
设计亮点:相比市面上常见的单一气体检测装置,这套系统实现了多参数联合监测,通过综合评估算法给出整体空气质量评价,大大提高了监测的实用性和可靠性。
2. 系统架构与硬件设计
2.1 整体系统框图
系统采用经典的"传感器-控制器-执行器"架构,分为三大功能模块:
-
输入模块:
- 气体传感器阵列(MQ-5、MQ-7、MS1100、MQ-135、SGP30)
- 粉尘传感器(GP2Y10)
- 按键输入模块
- 电源管理模块
-
处理核心:
- STM32F103C8T6最小系统
- 时钟电路
- 复位电路
- 调试接口
-
输出模块:
- OLED显示屏
- 声光报警电路
- 继电器控制的风扇模块

2.2 关键硬件选型解析
2.2.1 主控芯片选择
STM32F103C8T6是ST公司的经典产品,选择理由如下:
- 72MHz主频,性能足够处理多传感器数据
- 64KB Flash + 20KB RAM,满足程序存储需求
- 多达37个GPIO,方便连接各类外设
- 内置12位ADC,可直接读取传感器模拟信号
- 丰富的定时器资源,适合多任务调度
- 成本仅10元左右,性价比极高
2.2.2 传感器阵列详解
-
MQ-5天然气传感器:
- 检测范围:300-10000ppm
- 加热电压:5V±0.1V
- 特点:对LPG、天然气敏感度高
- 注意:需要预热3-5分钟才能稳定工作
-
MQ-7一氧化碳传感器:
- 检测范围:20-2000ppm
- 工作模式:交替高低电压加热
- 数据采集:建议在低电压阶段读取
-
MS1100甲醛传感器:
- 电化学原理
- 检测范围:0-5ppm
- 输出信号:模拟电压
- 寿命:约2年(需定期校准)
-
SGP30多气体传感器:
- I2C数字接口
- 同时检测TVOC和CO2
- 内置温湿度补偿
- 功耗仅59mW
2.2.3 电源设计要点
系统采用Type-C接口供电,设计时特别注意:
- 输入电压:5V/2A
- 主控采用AMS1117-3.3稳压芯片
- 传感器供电分两组:
- 数字传感器:3.3V直供
- 模拟传感器:经LC滤波后供电
- 总功耗控制在1.5A以内
3. 电路设计与PCB实现
3.1 原理图设计规范
使用Altium Designer 2013绘制原理图,主要特点:
- 模块化设计,每个功能独立成页
- 网络标号连接,避免交叉线
- 关键信号添加测试点
- 所有接口标注引脚定义
- 电源路径明确标注

3.2 PCB布局布线技巧
-
层叠结构:
- 两层板设计
- 顶层和底层均覆铜接地
- 板厚1.2mm
-
布局原则:
- 传感器接口靠近板边
- MCU位于板中央
- 电源模块单独分区
- 模拟与数字区域隔离
-
布线要点:
- 电源线宽≥0.5mm
- 模拟信号走线最短化
- 敏感信号包地处理
- 避免直角走线

经验分享:在PCB设计中,我将所有传感器接口集中在一侧,方便后期外壳开孔。同时预留了SWD调试接口和串口测试点,极大方便了调试过程。
4. 软件架构与关键代码实现
4.1 程序整体框架
采用前后台系统架构:
- 主循环处理非实时任务
- 定时器中断处理实时性要求高的任务
- 驱动程序与业务逻辑分离
code复制主程序流程:
初始化硬件 → 校准传感器 → 进入主循环
↓
读取传感器数据 → 数据处理 → 显示更新
↓
检测按键输入 → 执行相应功能
↓
阈值判断 → 触发报警/风扇
4.2 关键代码解析
4.2.1 定时器中断处理
c复制void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_1ms_count = 0;
if(htim->Instance == htim1.Instance) // 定时器1中断
{
time_1ms_count++;
if(time_1ms_count >= 10) // 10ms计时
{
time_1ms_count = 0;
flag_time_10ms = 1; // 设置10ms标志位
}
}
}
这段代码实现了精确的10ms定时,用于:
- 传感器数据采集周期控制
- 按键消抖处理
- 显示刷新定时
4.2.2 传感器数据处理算法
c复制float GetGasConcentration(uint32_t adc_value)
{
float voltage = adc_value * 3.3f / 4095.0f;
float Rs = (3.3f - voltage) / voltage * RL;
float ratio = Rs / R0;
float ppm = A * pow(ratio, -B); // 对数转换公式
return ppm;
}
算法说明:
- 将ADC值转换为电压
- 计算传感器电阻Rs
- 通过特征曲线转换为浓度值
- 不同气体A/B参数不同
4.3 空气质量评价算法
采用加权综合评价法:
| 参数 | 权重 | 优(0) | 良(1) | 轻度污染(2) | 中度污染(3) | 重度污染(4) |
|---|---|---|---|---|---|---|
| CO | 0.25 | <5ppm | 5-10 | 10-20 | 20-50 | >50 |
| 甲醛 | 0.20 | <0.08 | 0.08-0.1 | 0.1-0.3 | 0.3-0.5 | >0.5 |
| TVOC | 0.20 | <0.3 | 0.3-0.5 | 0.5-1.0 | 1.0-2.0 | >2.0 |
| 粉尘 | 0.15 | <35 | 35-75 | 75-150 | 150-300 | >300 |
| 天然气 | 0.10 | <500 | 500-1000 | 1000-2000 | 2000-5000 | >5000 |
| CO2 | 0.10 | <800 | 800-1000 | 1000-1500 | 1500-2000 | >2000 |
评分公式:
code复制总分 = Σ(参数等级 × 权重)
空气质量 = 优(0-0.5), 良(0.5-1.5), 轻度(1.5-2.5), 中度(2.5-3.5), 重度(>3.5)
5. 系统调试与优化
5.1 传感器校准流程
-
预热阶段:
- 所有MQ系列传感器通电预热24小时
- 在洁净空气中记录基准电阻R0
-
标准气体校准:
- 使用已知浓度的标准气体
- 调整算法参数A/B
- 记录多点校准数据
-
交叉干扰测试:
- 测试其他气体对传感器的干扰
- 在算法中添加补偿系数
5.2 常见问题排查
-
传感器读数不稳定:
- 检查供电电压是否稳定
- 确认预热时间足够
- 检查ADC参考电压
-
误报警问题:
- 调整阈值设置
- 添加数据滤波算法
- 检查传感器是否过期
-
显示异常:
- 检查I2C上拉电阻
- 确认时序符合规格
- 测试不同刷新率
5.3 性能优化技巧
-
软件滤波算法:
c复制#define FILTER_LEN 5 float filter_buf[FILTER_LEN]; float MovingAverageFilter(float new_val) { static uint8_t index = 0; filter_buf[index] = new_val; index = (index + 1) % FILTER_LEN; float sum = 0; for(int i=0; i<FILTER_LEN; i++){ sum += filter_buf[i]; } return sum / FILTER_LEN; } -
低功耗优化:
- 传感器分时供电
- 合理设置采样间隔
- 使用STOP模式
-
抗干扰设计:
- 添加TVS二极管
- 信号线屏蔽处理
- 合理接地设计
6. 项目扩展与改进方向
在实际使用过程中,我发现系统还可以从以下几个方向进行改进:
-
无线传输功能:
- 添加Wi-Fi或蓝牙模块
- 实现手机APP远程监控
- 支持云端数据存储
-
历史数据记录:
- 增加SD卡存储
- 实现数据导出功能
- 支持趋势分析
-
智能联动控制:
- 与新风系统联动
- 支持场景模式
- 语音报警提示
-
外壳与结构设计:
- 3D打印专用外壳
- 优化传感器气路
- 添加防尘设计
这个项目从设计到实现共耗时约3个月,期间遇到了不少挑战,比如传感器交叉干扰、小信号测量精度等问题。通过反复调试和算法优化,最终系统达到了设计指标。对于初学者来说,建议先从单个传感器开始,逐步增加复杂度。