2026 M-Design设计竞赛-基于STM32的智能环境安防监测系统设计
该项目使用了STM32F103C8T6 单片机、C 语言,实现了智能安防监测系统的设计,它的主要功能为:基于 STM32 平台,集成温度、火焰、烟雾、人体红外传感器,实现环境监测与两级预警功能,通过 OLED 显示数据与状态,并通过 LED 灯实现人员滞留和火灾隐患的联动报警。
标签
嵌入式系统
STM32
开发板
智能环境安防
陪伴zjm
更新2026-06-09
山西农业大学
4

基于STM32智能环境安防监测系统设计

1. 项目介绍

1.1 项目概述

本项目基于 STM32F103C8T6 单片机,是参赛2026 贸泽电子 M-Design 创意设计大赛(第二季)的作品,选题归属大赛方向一智能家居中的家庭安全与异常行为智能监测赛道,搭建一套集温度采集、火焰检测、烟雾监测、人体入侵预警于一体的智能环境安防监测系统。系统可实时采集环境温度,识别明火、烟雾等火灾隐患,同时检测区域内人员停留状态,针对长时间人员逗留、火焰与烟雾同时出现两类危险场景启动灯光预警,实现居家、库房、小型室内空间的自动化安防监测,具备成本低、稳定性强、操作简单、演示直观等特点。

1.2 项目创意

传统安防设备功能单一,大多仅实现独立检测,缺乏多传感器联动预警机制。本项目创新点如下:

(1) 多传感器融合监测:将温度、火焰、烟雾、人体红外四类传感器结合,一站式完成环境状态与安全风险检测;

(2) 分级联动预警:区分两种危险场景,人体长时间停留触发滞留预警,火焰+烟雾同时触发火灾联动预警,预警逻辑贴合实际安防需求;

(3) 自适应滤波优化:针对红外类传感器易受环境干扰、数值跳变的问题,采用多次采样均值滤波+阈值滞回防抖,大幅提升检测稳定性;

(4) 可视化人机交互:通过OLED屏幕实时展示所有传感器数据与工作状态,状态直观可见,便于调试与现场演示。

2. 硬件介绍

本系统硬件以STM32F103C8T6主控单片机为核心,搭配各类功能传感器、显示模块与执行器件,整体硬件清单及功能说明如下:

(1) STM32F103C8T6单片机:系统主控单元,基于ARM内核,搭载12ADC模数转换外设,负责传感器数据采集、逻辑运算、状态判断、设备控制,是整个系统的控制核心。

(2) NTC热敏电阻:模拟温度传感器,利用阻值随温度变化的特性,通过ADC采集电压信号换算环境温度,实现室温实时监测。

(3) 红外火焰传感器:专用火焰检测器件,对火焰红外光谱高度敏感,环境红外强度越高,输出ADC数值越小,用于识别明火隐患。

(4) MQ-2烟雾传感器:气敏传感器,可检测烟雾、可燃气体,本模块输出逻辑反向,气体浓度越高,ADC采样值越低。

(5) HC-SR501人体红外传感器:热释电红外传感器,仅对移动人体热源响应,输出高低电平信号,判断区域内是否有人活动。

(6) 0.96OLED显示屏:人机交互界面,实时显示温度、传感器采样数值、设备工作状态(YES/NO),显示整洁无残影。

(7) LED指示灯:执行预警器件,PB0对应人员滞留预警灯,PB1对应火灾联动预警灯,根据系统逻辑点亮/熄灭。

(8) 基础外围电路:包含电源电路、按键复位电路、GPIO上拉/下拉电路、传感器分压电路,保障硬件稳定运行。

3. 方案框图与项目设计思路

3.1  系统整体方案框图

 

3-1 系统整体方案框图

3.2 项目设计思路

(1) 硬件电路设计:对不同传感器进行引脚分配,模拟量传感器(温度、火焰、烟雾)接入单片机ADC通道,实现模拟信号转数字信号;人体传感器为数字量,接入普通GPIO输入引脚;LED灯配置为GPIO推挽输出引脚,完成硬件资源规划。

(2) 底层驱动开发:依次完成ADC模数转换驱动、OLED显示驱动、传感器引脚初始化、延时函数配置,保证各硬件模块正常通信与数据读取。

(3) 数据优化处理:针对火焰、烟雾传感器数值跳变问题,采用多次采样均值滤波降低干扰;对火焰传感器增加阈值滞回判断,避免临界值频繁切换状态。

(4) 功能逻辑设计

1) 温度:通过NTC阻值公式计算实际温度,保留一位小数,实时刷新;

2) 火焰/烟雾:采集数据后判断是否触发报警状态;

3) 人体检测:对人体有效信号进行软件计时,连续检测到人体信号满15秒判定为人员滞留;

4) 联动预警:人体滞留达标则点亮PB0指示灯;火焰、烟雾同时触发报警状态则点亮PB1火灾预警灯;风险解除后指示灯自动熄灭。

(5) 人机交互设计:OLED分区显示温度、四大传感器数值与工作状态,优化数字显示格式,数字位数不足时自动填充空格,消除显示白块、残影问题。

(6) 整体联调测试:硬件上电后进行整体功能测试,反复调试滤波参数、报警阈值、计时时长,修正传感器逻辑、显示异常等问题,完成系统稳定运行。

4. 原理图与PCB介绍

4.1 原理图说明

本系统采用模块化原理图设计,主要分为四大电路区域:

(1) 主控最小系统电路:包含STM32主控芯片、5V/3.3V电源电路、复位电路、晶振电路,保证单片机正常启动运行;

(2) 模拟采集电路:NTC热敏电阻、火焰传感器、烟雾传感器分别通过分压电路接入单片机PA0PA1PA2 ADC通道,将模拟电压传入主控;

(3) 数字输入电路:人体红外传感器接入PA3引脚,配置为上拉输入模式,读取高低电平信号;

(4) 输出与显示电路:PB0PB1配置为推挽输出,外接LED预警指示灯;OLED显示屏通过IIC/SPI接口与单片机通信,实现数据显示。

4.2 PCB说明

本次项目以面包板插接方式实现硬件搭建,未设计专用PCB电路板。

5. 软件流程图与关键代码介绍

5.1 软件整体流程图

 

5-1 软件整体流程

5.2 关键代码介绍

(1) ADC初始化与读取函数

实现12ADC配置,完成模拟传感器数据采集,开启ADC校准提升采集精度。

void My_ADC_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    //配置PA0/PA1/PA2为模拟输入
    GPIO_InitTypeDef g;
    g.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    g.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &g);
    // ADC基础配置
    ADC_InitTypeDef adc;
    adc.ADC_Mode = ADC_Mode_Independent;
    adc.ADC_ScanConvMode = DISABLE;
    adc.ADC_ContinuousConvMode = DISABLE;
    adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    adc.ADC_DataAlign = ADC_DataAlign_Right;
    adc.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &adc);
    ADC_Cmd(ADC1, ENABLE);
    // ADC校准
    ADC_ResetCalibration(ADC1);
    while (ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1));
}
//读取指定ADC通道数值
u16 Get_ADC(void)
{
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    return ADC_GetConversionValue(ADC1);
}

(2) 传感器均值滤波代码

对火焰、烟雾传感器进行多次采样取平均值,抑制环境干扰造成的数值跳变。

//火焰传感器30次均值滤波
uint32_t f_sum = 0;
for(int i=0; i<30; i++){
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    f_sum += ADC_GetConversionValue(ADC1);
    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
    Delay_ms(2);
}
uint16_t flame_val = f_sum / 30;

//烟雾传感器15次均值滤波
uint32_t s_sum = 0;
for(int i=0; i<15; i++){
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_55Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    s_sum += ADC_GetConversionValue(ADC1);
    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
    Delay_ms(2);
}
uint16_t smoke_val = s_sum / 15;

(3) 状态判断与预警逻辑代码

实现火焰滞回防抖、烟雾状态识别、人体计时、双模式灯光预警,为项目核心逻辑。

//火焰滞回防抖判断
static uint8_t flame_sta = 0;
if (flame_val < 1600) flame_sta = 1;
else if (flame_val > 2000) flame_sta = 0;

//烟雾状态判断
uint8_t smoke_sta = 0;
if (smoke_val < 1000) smoke_sta = 1;

//人体15秒计时
if (human_sta == 1) human_timer++;
else human_timer = 0;

//灯光预警逻辑
if (human_timer >= 15) GPIO_SetBits(GPIOB, GPIO_Pin_0);
else GPIO_ResetBits(GPIOB, GPIO_Pin_0);

if (flame_sta == 1 && smoke_sta == 1) GPIO_SetBits(GPIOB, GPIO_Pin_1);
else GPIO_ResetBits(GPIOB, GPIO_Pin_1);

(4) OLED数字自适应显示函数

自动识别数字位数,空位填充空格,解决四位显示区域出现白块、残影问题。

void ShowNum_Space(uint8_t x, uint8_t y, uint16_t num)
{
    if(num >= 1000)
    {
        OLED_ShowNum(x,y,num,4);
    }
    else if(num >= 100)
    {
        OLED_ShowNum(x,y,num,3);
        OLED_ShowChar(x+48, y, ' ');
    }
    else if(num >= 10)
    {
        OLED_ShowNum(x,y,num,2);
        OLED_ShowChar(x+32, y, ' ');
        OLED_ShowChar(x+48, y, ' ');
    }
    else
    {
        OLED_ShowNum(x,y,num,1);
        OLED_ShowNum(x,y,num,1);
        OLED_ShowChar(x+16, y, ' ');
        OLED_ShowChar(x+32, y, ' ');
        OLED_ShowChar(x+48, y, ' ');
    }
}

6. 功能展示及说明

6.1 基础状态展示

在正常室内环境下,OLED屏幕清晰显示实时室温数据 Temp:XX.X C,火焰、烟雾传感器数值稳定,状态均为NO,人体红外传感器状态显示为0 NOPB0PB1两路预警LED灯均保持熄灭状态,表明系统正处于无明火、无烟雾、无人员活动的正常监测模式6-1所示

 

6-1 正常情况

6.2 火焰模拟测试

使用手机红外遥控、热水杯等红外源对准火焰传感器探头时,OLED界面上火焰传感器数值会明显下降,状态变为“YES”;此时烟雾传感器状态仍为“NO”,火灾预警灯PB1保持熄灭,说明系统已成功识别红外火源,单火焰信号不会触发火灾联动报警逻辑。

6.3 烟雾模拟测试

对着烟雾传感器轻轻呼气,OLED界面中烟雾传感器数值下降,状态变为“YES”;此时火焰传感器状态仍为“NO”,火灾预警灯PB1保持熄灭,说明系统已成功识别烟雾信号,单烟雾信号不会触发火灾联动报警逻辑。

6.4 火灾联动预警测试

当同时触发火焰传感器与烟雾传感器时,OLED界面中火焰、烟雾的状态均变为YES,硬件上PB1火灾预警LED灯随之点亮,说明火焰与烟雾双信号同时触发后,系统判定为火灾隐患并成功启动联动报警机制6-2所示

 

6-2 火焰和烟雾联动预警

6.5 人体滞留预警测试

在人体传感器感应范围内持续活动15秒以上时,OLED界面中PIR状态持续显示为 1 YES,硬件上PB0人员滞留预警LED灯随之点亮;当人员离开感应范围后,预警灯自动熄灭,说明系统完成了计时判断,成功对长时间逗留人员启动预警机制6-3所示

 

6-3 人体滞留15s预警

7. 难题和解决方法

在项目开发与调试过程中,我遇到了多项软硬件相关问题,并逐一进行了优化解决。首先是火焰与烟雾传感器的ADC数值存在剧烈跳变,静置状态下数值在800~3700之间大幅波动,造成OLED显示状态频繁在YES/NO之间切换,严重影响系统稳定性,对此我采用多次采样均值滤波弱化瞬时干扰,并加入阈值滞回判断,通过设置高低阈值让临界区间保持原有状态,彻底解决了误触发问题。其次是OLED四位数字显示不美观,当数值不足四位时会出现白色色块与残影,我通过自定义ShowNum_Space函数,让程序根据数值位数自动填充空格,有效提升了显示效果。

调试中还发现烟雾传感器输出逻辑与常规模块相反,浓度越高数值越小,导致原有报警逻辑失效,我通过实际测试标定正常与报警数值,反向修改判断条件,使程序适配硬件特性。同时,人体红外传感器在无人时也会出现0/1随机跳变,造成计时异常与误报警,我结合热释电传感器的工作特性,采用连续15秒高电平软件计时的方式过滤瞬时干扰,并优化硬件摆放位置,避开气流、阳光等干扰源,提升了检测准确性。

最后在温度计算环节,由于使用log ()对数函数缺少相关库文件,导致Keil编译器出现警告,我在代码头部添加math.h数学库头文件后,顺利解决编译问题,保证温度采集与计算功能稳定运行。通过对以上问题的分析与处理,系统整体稳定性、准确性和实用性得到显著提升。

8. 心得与建议

本次学习中,我完整完成了基于STM32的智能安防监测系统设计,全程参与硬件选型、代码编写、功能调试与整体联调,真正走完了嵌入式项目开发的全流程,收获巨大。通过实践,我深刻体会到理论与实践结合的重要性,传感器在实际使用中会受到环境干扰,特性与理论存在差异,必须依靠实测与参数调整才能达到稳定效果;同时,面对数值跳变、显示异常、逻辑错误等问题,我学会了先分析根源再针对性解决,大幅提升了问题排查与优化能力;模块化的代码设计让程序结构清晰、调试高效,也让我理解了规范化开发的重要性;整个项目也让我对嵌入式智能安防产品有了更直观的认识,激发了我继续学习智能硬件与物联网技术的热情。

在学习建议与自身改进方面,我建议初学嵌入式的同学从单一模块开始调试,逐个验证功能后再进行整合,避免多问题叠加难以排查,遇到传感器干扰优先使用软件滤波等低成本方案。而针对本次项目,我也明确了后续优化方向,未来可以增加无线传输、蜂鸣器报警、数据上传等功能,进一步完善预警方式;硬件上可设计专用PCB电路板替代面包板,让系统更加稳定、标准、美观,整体提升作品的实用性与专业性


 

附件下载
tree.zip
完整代码
团队介绍
山西农业大学温家懿
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号