基于STM32的空气污染检测与报警系统设计与实现

基于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 系列采集流程四步走:

  1. 上电预热约 60s(半导体气敏元件加热稳定);

  2. ADC 多次采样取均值,消除抖动;

  3. 按参考电压 5V / 4096 换算为实际电压;

  4. 代入传感器灵敏度曲线,换算为 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 无线上云,实现手机端远程查看------主控和采集架构完全不用动。

七、资料内容完整工程资料(原理图、PCB、代码、元件清单)

八、资料获取方式

相关推荐
zhangzhangkeji3 小时前
stm32 15-2 flash 闪存:代码部分二
stm32
盛世宏博北京3 小时前
工业环境稳定采集:配电室 IP 温湿度变送器 TCP/UDP 通信部署指南
单片机·tcp/ip·udp
comyccccc4 小时前
自制多路输出DCDC电源板,3.3V-12V可调 学习笔记
单片机·嵌入式硬件·硬件工程
Zwawa4 小时前
把 AO 接回来:黑线和白底之间到底差了多少
c语言·单片机·嵌入式
Yiran_G4 小时前
BLE终端数据积压如何处理?缓存队列、断连补传与流量调度设计
嵌入式硬件·物联网
硅基手札5 小时前
【串口技术系列文档 07】UART控制器寄存器详解
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
甜甜的大香瓜5 小时前
【MT32F006】MT32F006之TM1621C驱动LCD
单片机
硅基手札5 小时前
【串口技术系列文档 09】FIFO管理与流控
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
硅基手札5 小时前
【串口技术系列文档 08】中断驱动vs轮询vs DMA
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设