基于STM32的室内环境监测系统设计与实现

STM32F103C8T6ESP8266OneNetMQTTuni-app
学生
陈宇瀚
学号
13220527
学院
计算机学院 · 计算机科学与技术
指导教师
孙庚 教授

铁皮屋:被忽视的安全盲区

01

夏季高温 + 线路老化

铁皮屋热阻隔差,夏季室内温度急剧升高。临时布线普遍,线路老化叠加高负荷用电,短路起火风险远高于普通建筑。

02

传统设备只管"叫"不管"传"

市面上常见的烟雾报警器和温湿度计,只能本地被动声光报警。人一离开现场,报警就断了——没人听得到,也没人能处理。

03

需要什么样的系统?

能同时感知温度、湿度、烟雾、明火、入侵;断网了自动控制照样跑;出事了能把警报推到手机上——一个从感知到控制的完整闭环。

论文第1.1节明确指出:铁皮屋"结构单薄、热阻隔能力较差,极易受到极端室外气象条件的干扰"且"由电路短路或热量积聚引发的明火与烟雾等火灾隐患发生率居高不下"。

多传感器融合 + 软件滤波 + 边缘自主控制

5×

五种传感器,六个维度的数据

DHT11 拿温湿度、MQ-2 测烟雾浓度、光敏电阻读光照强度、火焰传感器(红外接收管 760–1100nm)检明火、HC-SR501 人体红外抓入侵。论文表3-2定义了9个云数据点的完整映射。

DHT11MQ-2火焰传感器HC-SR501光敏电阻
滤

Get_Adc_Average():五采样均值滤波

源码 main.c 第357行:MQ-2 和光敏电阻的 ADC 值不是直接用的,而是每 20ms 采一次、连续 5 次取算术平均。论文4.2.1节写得很清楚——"有效过滤了瞬间电磁干扰造成的毛刺,极大减少了系统因误差报警的情况"。

ADC滤波5次平均20ms周期
创新性:火焰传感器和 HC-SR501 没有用轮询——源码第361–362行直接读 GPIO 引脚电平(低电平触发),论文2.1节要求"本地继电器排风与蜂鸣器报警必须完全独立于网络状态"。实测:WiFi 断线后,本地自动控制逻辑照常运转,风扇该开就开、蜂鸣器该响就响。论文称"边缘联动逻辑必须完全独立于网络"——代码做到了。

自研 MQTT 协议栈 + OneNet 安全接入

①

MqttKit.c:手写的 MQTT 客户端

源码路径 STM32/NET/MQTT/MqttKit.c,约 1100 行。没引入 lwIP 等 TCP/IP 协议栈,直接通过 ESP8266 AT 指令封装 MQTT 报文。CONNECT / PUBLISH / SUBSCRIBE 全部自建,QoS 0 模式下包头最短 2 字节。论文4.3.1节:"MQTT 报文头部仅 2 字节,特别适合算力有限、网络带宽紧张的嵌入式场景"。

MqttKit.cAT指令桥接QoS 0
②

HMAC-SHA1 + Base64 设备鉴权

源码 onenet.c 中的 OneNET_Authorization 函数:拼接 "ver\nres\net\naccess_key\ndev_name" 格式的待签字符串,HMAC-SHA1 哈希后 Base64 编码,发送至 OneNet 完成设备身份认证。APP 端 key.js 同样使用 HMAC-SHA1 生成用户令牌。

HMAC-SHA1Base64设备认证
③

cJSON 解析 → 标志位 → 驱动硬件

源码 OneNet_RevPro():收到 ESP8266 的 +IPD 数据帧后,cJSON_Parse 解析 JSON 负载,提取 fan/led/beep 等控制字段,更新全局标志位 fan_flag / led_flag / beep_flag。主循环(main.c 第327行)检测到标志位变化后直接调用 Fan_Set() / Led_Set() / Beep_Set() 驱动硬件。

cJSON标志位驱动主循环
APP 点击
{"fan":"on"}
→
OneNet Broker
mqtts.heclouds.com:1883
→
ESP8266
AT+CIPSEND
→
OneNet_RevPro
cJSON → fan_flag=1
→
Fan_Set(ON)
GPIO 拉高 → 继电器闭合

"端-管-云-用"架构与嵌入式工程实践

层

自顶向下的四层模型

论文3.1节定义的"端-管-云-用"模型:感知控制层(STM32 + 5传感器 + 执行器)→ 网络传输层(ESP8266 + MQTT)→ 平台服务层(OneNet 规则引擎)→ 应用交互层(uni-app APP)。论文明确指出"摒弃传统Web三层结构",每层独立职责,改硬件驱动不影响 APP,换云平台不动硬件。

感知层传输层平台层应用层
稳

MCU 资源受限下的可靠性设计

① 全部网络缓冲用全局静态数组,零 malloc——论文强调"避免动态内存碎片,适合MCU资源受限环境"。② ESP8266 通信嵌入超时重试机制。③ PCB 数字地与模拟地分区覆铜隔离。④ 继电器用光耦隔离,论文3.3.3节:"彻底隔离大功率线圈产生的反向电动势,避免单片机I/O口被击穿"。

静态分配光耦隔离超时重试覆铜隔离

状态机 OLED 菜单

源码定义 enum MenuPages { display_page1, display_page2, settingsPage },switch(menu) 控制三页切换。每个页面独立渲染函数(OLED_Menu1/2/3)。

enumswitch分支

环形阈值计数器

源码 ThresholdModification():温度/烟雾/光照阈值 1~99 循环——加超 99 回 1,减小过 1 回 99。物理按键调参数,不怕设到非法值。论文4.2.2节详述了三种阈值的调节流程。

环形计数防越界

外设硬件抽象层

每个外设(LED / Fan / Beep / DHT11 / ADC / Key)提供统一的 Init() 和 Set() 接口。源码 hardware/inc/ 下 9 个头文件,隐藏寄存器操作,业务代码只调接口。

HALInit/Set

五路感知 + 双模式自动控制

环境感知
论文4.2节定义的 SensorScan() 函数(源码第354行)一个调用完成全部五路采集:DHT11_Read_Data 拿温湿度、Get_Adc_Average 采光照和烟雾、GPIO_ReadInputDataBit 检火焰和人体红外。采集后数据存入全局变量 temp / humi / ad1 / mq2 / pir / flame,供显示和控制两个路径使用。
自动模式
mode_flag=1 时(源码第336-346行):主循环先强制关掉所有外设,然后用滤波后的数据逐项比对阈值。temp > temp_th → Fan_Set(ON) 开风扇排热;mq2 > mq2_th 或 pir==1 或 flame==1 → Beep_Set(ON) 拉蜂鸣器;ad1 < ad1_th → Led_Set(ON) 亮灯补光。论文4.2.2节:"条件判断的控制逻辑简单清晰,轮询执行方式稳定可靠"。
手动模式
mode_flag=0 时(源码第327-334行):完全听从外部指令。物理按键(4个按键,KeyNum 全局变量)或 APP 远程下发(fan_flag / led_flag / beep_flag 全局标志位),直接控制 LED、风扇、蜂鸣器的开和关。论文5.2.2节设计的 4 项本地测试用例和 5.3.2 节设计的 4 项远程测试用例全部覆盖了这两种模式。

跨平台APP与直观的人机交互

📱

uni-app 一套代码跑两端

源码 APP/pages/detail/detail.vue(约580行),HBuilderX + uni-app + Vue.js 开发。论文4.3.2节说明 APP "以对监测系统进行远程控制"。每2秒通过 OneNet REST API(api.heclouds.com)拉取设备属性,界面数据自动刷新。

uni-appVue.jsOneNet API
🎛

三区布局:看数据、控设备、调参数

论文图表4-11 和 4-12 详细描述了 APP 的三个功能区。顶栏:温度/湿度/光照/烟雾四个数据卡片。中间:LED、蜂鸣器、风扇、自动模式的开关按钮。底部:温度阈值和烟雾阈值的 slider 滑动条,拖拽实时下发。

数据卡片开关控制滑动条阈值
交互细节:APP 端 key.js 实现了 HMAC-SHA1 令牌生成(源码第3-20行),每次 API 请求携带 Authorization 签名,OneNet 服务端验证通过才放行。论文5.3.3节测试结论:远程指令下发成功率 99%。排障记录中记录了一个实际调试问题——初次测试因手机开了 5GHz 热点(ESP8266 仅支持 2.4GHz),换成 Wi-Fi5 2.4GHz 后通信恢复正常。

测试数据与方案对比

<2s
烟/火报警响应时间
99%
APP远程指令成功率
8/8
测试用例全部通过
100%
断网时本地控制可用
对比维度传统独立式报警器本系统
感知维度单一维度(烟或温)温湿度 + 烟雾 + 光照 + 明火 + 人体红外,六维
报警方式本地声光,脱离现场即失效本地声光 + APP 远程推送,任何地方都能收到
远程控制不支持APP 实时看数据 + 远程开关设备 + 在线改阈值
离线能力—断网自动模式完整运行,本地声光防线绝不失效
数据处理固定阈值直接触发ADC 五采样平均滤波,多传感器交叉确认后触发
显示方式仅 LED 指示灯OLED 三页中文菜单 + APP 卡片式实时数值
部署方式多种设备拼凑单节点、模块化 PCB,一套覆盖所有指标
论文测试结论(第5章):本地测试 4/4 通过(电吹风加热 → 风扇自启、手电筒 → 光照数值变化、燃烧塑料片 → 蜂鸣器报警、明火靠近 → 蜂鸣器长鸣)。远程测试 4/4 通过(ESP8266 启动、WiFi 连接、OneNet 接入、APP 指令下发)。排障记录:修复了 DHT11 因轮询频率过高导致单总线时序错乱假死的 bug,将轮询周期调整为 5 秒。

从 STM32 引脚到手机屏幕的完整链路

做完了什么

✓ STM32F103C8T6 + 5种传感器 + PCB 制板
✓ 自研 MQTT 客户端(MqttKit.c,~1100行)
✓ OneNet HMAC-SHA1 鉴权 + ESP8266 AT 桥接
✓ 自动/手动双模式 + OLED 三页中文菜单
✓ uni-app 跨平台 APP + 远程控制 + 阈值下发
✓ 8 项黑盒测试全部通过(论文第5章)

还能做什么

→ 论文6章:锂电池冗余供电,避免火灾断电失效
→ 扩展 LoRa / NB-IoT 多模通信
→ 用机器学习替代固定阈值判断
→ 增加摄像头模块做可视化安防
→ 支持多个设备同时接入 OneNet

五个传感器、一块 STM32、一个 ESP8266、一台手机
——让没人看守的铁皮屋不再无声无息。

感谢各位老师批评指正 · 陈宇瀚 · 2026