基于STM32的空气污染检测与报警系统设计与实现
空气质量看不见摸不着,但 CO、甲醛、PM2.5 每一项都实打实影响健康。这篇基于 STM32F103C8T6 的空气污染检测与报警系统,用几颗气体传感器加一块 OLED,就能把室内空气质量量化显示出来,超标立刻蜂鸣报警,还能通过串口把数据传给上位机做曲线分析。整套方案成本不到百元,适合作为毕业设计或室内空气质量监测的入门项目。本文从方案选型、硬件接线、软件流程到实测数据完整过一遍。
一、系统功能总览
系统围绕"多参数采集---本地显示---阈值判断---串口上报"四个环节展开,整体功能如下:
| 功能模块 | 具体功能 | 涉及硬件 |
|---|---|---|
| 温湿度采集 | 实时采集环境温度、湿度 | DHT11 |
| CO 浓度检测 | 检测一氧化碳浓度并换算为 PPM | MQ-2 |
| 甲醛浓度检测 | 检测甲醛浓度(10~1000ppm 量程) | MQ-135 |
| PM2.5 检测 | 检测粉尘颗粒物浓度 | GP2Y1010AU0F |
| 氧气含量检测 | 采集氧气浓度信号(模拟量采集) | 模拟氧气传感器 |
| 数据显示 | 分屏刷新显示各参数数值 | OLED12864 |
| 阈值设定 | 按键设定各参数报警阈值 | 独立按键 |
| 超标报警 | 任一参数超阈值,蜂鸣器报警 | 有源蜂鸣器 |
| 串口通信 | 数据实时上传 PC 上位机 | MAX232 |
系统主循环逻辑很清晰:上电初始化后,依次采集 CO、甲醛、PM2.5、温湿度、氧气五类数据,OLED 刷新显示,随后与设定阈值逐一比较,任何一项超标就驱动蜂鸣器报警,最后把数据帧通过 MAX232 发给 PC,周而复始。
二、核心模块选型对比
2.1 主控芯片:STM32F103C8T6 vs nRF52840
| 对比项 | STM32F103C8T6 | nRF52840 |
|---|---|---|
| 内核 | Cortex-M3 | Cortex-M4F |
| 主频 | 72MHz | 64MHz |
| ADC | 12 位 10 通道 | 12 位 8 通道 |
| 生态资料 | 国内教程、例程极多 | 资料相对较少 |
| 开发成本 | 低 | 较高 |
本系统需要 4 路 ADC 采集气体与粉尘信号,外加单总线、I2C、USART 各一路,STM32F103C8T6 的外设资源完全够用,且开发资料最全,选择方案 1。
2.2 温湿度传感器:DHT11 vs SHT40
| 对比项 | DHT11 | SHT40 |
|---|---|---|
| 温度精度 | ±2℃ | ±0.2℃ |
| 湿度精度 | ±5%RH | ±1.8%RH |
| 接口 | 单总线 | I2C |
| 价格 | 约 5 元 | 约 20 元 |
空气检测系统中温湿度主要用于环境参考与传感器温漂补偿,对精度要求不高,DHT11 性价比更高,选择方案 1。
2.3 CO 检测:MQ-2 vs MH-Z19
| 对比项 | MQ-2 | MH-Z19 |
|---|---|---|
| 原理 | 半导体气敏 | 红外 NDIR |
| 量程 | 300~10000ppm | 0~5000ppm |
| 输出 | 模拟电压 | 串口/_pwm |
| 响应时间 | <10s | <30s |
| 价格 | 约 8 元 | 约 70 元 |
MQ-2 是半导体气敏传感器,加热后 SnO₂ 表面电阻随 CO 浓度变化,输出模拟电压可直接进 ADC;MH-Z19 精度更高但价格接近十倍,对毕业设计场景没必要,选择方案 1。
2.4 甲醛检测:MQ-135 vs MH-Z19
| 对比项 | MQ-135 | MH-Z19 |
|---|---|---|
| 检测对象 | 甲醛/苯/氨等广谱 | 仅 CO₂ |
| 量程 | 10~1000ppm | 0~5000ppm |
| 输出 | 模拟电压 | 串口 |
| 寿命 | 约 5 年 | >5 年 |
MH-Z19 是 CO₂ 专用传感器,无法测甲醛;MQ-135 对甲醛等挥发性有机物广谱响应,模拟输出配合 ADC 换算即可得到 PPM 值,选择方案 1。
2.5 PM2.5 检测:GP2Y1010AU0F vs SDS011
| 对比项 | GP2Y1010AU0F | SDS011 |
|---|---|---|
| 原理 | 红外散射 | 激光散射 |
| 量程 | 0~500µg/m³ | 0~999µg/m³ |
| 输出 | 模拟电压 | 串口 |
| 体积 | 超薄小巧 | 较大 |
| 价格 | 约 25 元 | 约 90 元 |
GP2Y1010AU0F 通过内部红外 LED 发光、光电晶体管接收粉尘散射光,输出与浓度成正比的模拟电压,输出端加 0.1µF 滤波电容即可稳定读数,且体积小、功耗低,选择方案 1。
2.6 显示屏:OLED12864 vs ST7735
| 对比项 | OLED12864 | ST7735 |
|---|---|---|
| 分辨率 | 128×64 | 160×128 |
| 接口 | I2C(2 线) | SPI(4 线) |
| 功耗 | 极低(自发光) | 较高(需背光) |
| 显示内容 | 字符/小图标 | 可显示曲线 |
本系统只需显示 5 组数值与阈值,OLED12864 两线 I2C 即可完成,占用引脚最少,选择方案 1。
三、系统接线总表
按上述选型,各模块与 STM32F103C8T6 的接线规划如下(引脚为规划分配,均无冲突):
| 模块 | 模块引脚 | STM32 引脚 | 说明 |
|---|---|---|---|
| DHT11 | DATA | PA0 | 单总线,4.7kΩ 上拉至 3.3V |
| DHT11 | VCC / GND | 3.3V / GND | 供电 |
| MQ-2 | AO | PA1 | ADC1_IN1,模拟输出 |
| MQ-2 | VCC / GND | 5V / GND | 加热丝需 5V 供电 |
| MQ-135 | AO | PA2 | ADC1_IN2,模拟输出 |
| MQ-135 | VCC / GND | 5V / GND | 5V 供电 |
| GP2Y1010AU0F | VO | PA3 | ADC1_IN3,输出端并 0.1µF 滤波电容 |
| GP2Y1010AU0F | VCC / GND | 5V / GND | 内部红外 LED 由 5V 驱动 |
| 模拟氧气传感器 | OUT | PA4 | ADC1_IN4,滑动变阻器分压输出 |
| OLED12864 | SCL / SDA | PB6 / PB7 | I2C,SSD1306 驱动 |
| OLED12864 | VCC / GND | 3.3V / GND | 供电 |
| MAX232 | T1IN / R1OUT | PA9 / PA10 | USART1 TX/RX,TTL 侧 |
| MAX232 | DB9 | --- | RS-232 侧接 PC 串口 |
| 按键 K1~K4 | 一端 | PB0~PB3 | 输入上拉,按下接地 |
| 按键 K1~K4 | 另一端 | GND | --- |
| 蜂鸣器 | I/O | PB5 | 低电平驱动(NPN 三极管放大) |
| 蜂鸣器 | VCC / GND | 3.3V / GND | 有源蜂鸣器 |
说明:MQ 系列 DO 数字输出脚本设计不接,全部走 ADC 模拟采集以提高分辨率;MAX232 完成 RS-232 与 TTL 电平转换,内部电荷泵自升压,只需外接 5 个 1µF 电容。
四、系统软件设计
4.1 主程序流程
主程序采用"初始化---循环采集---显示---判断---上传"结构:
int main(void)
{
/* 外设初始化 */
SystemInit(); // 时钟 72MHz
ADC1_Init(); // 4 路模拟通道:PA1/PA2/PA3/PA4
DHT11_Init(); // PA0 单总线
OLED_Init(); // PB6/PB7 I2C
KEY_Init(); // PB0~PB3
BEEP_Init(); // PB5
USART1_Init(9600); // PA9/PA10 → MAX232
threshold_load(); // 载入默认报警阈值
while (1)
{
key_scan(); // 按键设定阈值
DHT11_Read_Data(&temp, &humi); // 温湿度
co_ppm = MQ2_GetPPM(); // CO 浓度
ch2o_ppm = MQ135_GetPPM(); // 甲醛浓度
pm25 = GP2Y_GetDensity(); // PM2.5
o2_level = O2_GetPercent(); // 氧气含量
OLED_ShowAll(); // 分屏刷新显示
if (co_ppm > th_co || ch2o_ppm > th_ch2o ||
pm25 > th_pm25 || o2_level < th_o2)
BEEP_ON(); // 任一超标 → 蜂鸣报警
else
BEEP_OFF();
USART1_ReportFrame(); // 数据帧上传 PC
delay_ms(500);
}
}
4.2 气体浓度采集流程(MQ-2 / MQ-135)
MQ 系列采集流程四步走:
-
上电预热约 60s(半导体气敏元件加热稳定);
-
ADC 多次采样取均值,消除抖动;
-
按参考电压 5V / 4096 换算为实际电压;
-
代入传感器灵敏度曲线,换算为 PPM 浓度值。
float MQ2_GetPPM(void)
{
u16 adc = Get_Adc_Average(ADC_CH1, 10); // 10 次均值
float voltage = adc * 5.0f / 4096.0f; // 转实际电压
float rs = (5.0f - voltage) * RL / voltage; // 传感器电阻
float ratio = rs / R0; // 与洁净空气比值
return (float)pow(COEFF_A / ratio, 1.0f / COEFF_B); // 曲线换算 PPM
}
其中 R0 为传感器在洁净空气中的标定电阻值,系数 A/B 取自器件手册的对数灵敏度曲线。
4.3 PM2.5 采集流程
GP2Y1010AU0F 内部红外 LED 按数据手册要求的脉冲时序点亮,光电晶体管输出与粉尘浓度成正比的电压:
float GP2Y_GetDensity(void)
{
u16 adc = Get_Adc_Average(ADC_CH3, 10);
float voltage = adc * 5.0f / 4096.0f;
// 典型转换:1V ≈ 200µg/m³(低浓度段线性)
float dust = (voltage - 0.0f) * 200.0f;
return (dust < 0) ? 0 : dust;
}
VO 引脚的 0.1µF 滤波电容在这里发挥作用------红外散射信号很微弱,不滤波读数会明显跳动。
4.4 温湿度采集流程
DHT11 单总线时序:主机拉低 1~2ms 发起,传感器回 80µs 低 + 80µs 高,随后送出 40 位数据(湿度整数/小数 + 温度整数/小数 + 校验和),末位校验通过才算一次有效读取:
u8 DHT11_Read_Data(u8 *temp, u8 *humi)
{
u8 buf[5];
DHT11_Rst(); // 起始信号
if (DHT11_Check() == 0) // 响应正确
{
for (i = 0; i < 5; i++) // 读 5 字节
buf[i] = DHT11_Read_Byte();
if (buf[0] + buf[1] + buf[2] + buf[3] == buf[4])
{
*humi = buf[0];
*temp = buf[2];
return 0; // 校验通过
}
}
return 1;
}
4.5 阈值设定与报警流程
四个按键分工:K1 切换设定项(CO→甲醛→PM2.5→氧气),K2 数值加,K3 数值减,K4 确认保存。设定模式下 OLED 顶行显示当前设定项并闪烁。运行时每轮采集结束做一次全参数比对,任一参数越限即置位报警标志,蜂鸣器长鸣提示;所有参数回到阈值以内自动解除报警,无需人工干预。
4.6 串口上传流程
USART1 波特率 9600,每 500ms 发送一帧 ASCII 数据,格式形如:
T:25,H:56,CO:12,CH2O:08,PM:35,O2:20.9
上位机按逗号解析各字段即可绘制历史曲线。MAX232 芯片在中间承担电平转换:TTL 侧接 PA9/PA10,RS-232 侧经 DB9 与 PC 串口对接,收发两个方向都能可靠传输。
五、系统实现与测试
5.1 硬件测试
上电后先做静态检查:各供电点电压正常(3.3V、5V),MQ-2/MQ-135 加热丝约 1 分钟后进入稳定状态,表面微热属正常现象;OLED 刷屏正常;按键逐个按动,OLED 设定界面能正确切换。
5.2 软件测试
逐模块验证:DHT11 连续读 20 次,数据稳定、校验和全通过;ADC 通道用万用表比对------滑动变阻器给定已知电压,换算值误差在 ±2% 以内;MAX232 回环测试,PC 收到的数据帧与 OLED 显示逐字段一致。
5.3 功能实现与调试
整机联调结果如下:
| 测试项 | 操作方法 | 预期结果 | 实测结果 |
|---|---|---|---|
| CO 检测 | 靠近传感器处注入少量烟雾 | 浓度值上升并超阈值报警 | 报警及时,数值随烟雾消散回落 |
| 甲醛检测 | 附近挥发少量酒精模拟 | 甲醛 PPM 上升 | 显示正常,超标报警 |
| PM2.5 检测 | 香烟雾吹入探测腔 | PM2.5 数值显著上升 | 数值爬升明显,响应 <10s |
| 温湿度 | 向传感器哈气 | 湿度上升 | 湿度 45%→70%RH,随后恢复 |
| 氧气检测 | 滑动变阻器调低模拟电压 | 氧含量下降 | 低于阈值时报警 |
| 阈值设定 | K1~K4 修改 CO 阈值 | 新阈值生效 | 报警点随新阈值变化 |
| 串口上传 | PC 打开串口助手 9600 | 每 0.5s 收到一帧 | 数据帧完整无乱码 |
测试表明:各传感器响应灵敏,报警逻辑准确,串口通信稳定,系统整体达到了设计预期。
六、总结
这套基于 STM32F103C8T6 的空气污染检测与报警系统,用 MQ-2、MQ-135、GP2Y1010AU0F 三颗低成本传感器覆盖了 CO、甲醛、PM2.5 三项核心空气指标,配合 DHT11 温湿度与氧气采集,实现了多参数实时显示、按键阈值设定、超标蜂鸣报警和 MAX232 串口上传的完整功能。整套系统的价值在于:所有模拟量都走 ADC 采样 + 均值滤波 + 曲线换算的标准流程,这套数据处理方法可以直接迁移到其他气体检测项目中。如果后续想扩展,可以在此基础上把 MAX232 换成 ESP8266 无线上云,实现手机端远程查看------主控和采集架构完全不用动。