十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32+MQTT+华为云IoTDA:物联网火灾感知与远程监控系统

STM32+MQTT+华为云IoTDA:物联网火灾感知与远程监控系统 简介本资源为基于STM32的物联网火灾感知系统完整项目文档面向电子信息、物联网与嵌入式方向的课程设计、毕业设计及DIY开发者。内容围绕STM32F103RCT6主控整合SHT30温湿度、MQ2烟雾、红外火焰传感器配合蜂鸣器声光报警、OLED显示与ESP8266 Wi-Fi通信并部署华为云IoT平台涵盖MQTT三元组配置、主题订阅发布与设备登录测试上位机部分基于Qt完成UI与通信交互设备端则给出硬件接线、原理图、Keil工程、代码移植与主逻辑分析。压缩包内为1个PDF文档约30.34MB目录分章清晰便于按模块查阅。目前已有240人学习。对于需要完整方案、调试思路与云端接入参考的读者可借此快速理解传感器采集、自动报警与远程监控的实现路径。1. 从一台会报警的 STM32 到能远程看数据的火灾感知系统很多人做 STM32 毕设第一步就卡在“传感器买了数据也读出来了但云端和手机端接不上”。这套基于 STM32F103RCT6 的物联网火灾感知系统解决的正是这个断点它把 SHT30 温湿度、红外火焰、MQ2 烟雾三路数据在本地轮询采集超阈值立刻蜂鸣器加 LED 报警同时通过 ESP8266 以 MQTT 协议把数据推到华为云 IoTDAAndroid 端和 Qt 上位机再从云端读影子数据。OLED 屏本地显示保证了断网时也能看现场数值。适合正在做物联网毕业设计、智能家居原型或者想把传感器采集与云平台打通但一直卡在 MQTT 三元组和主题订阅上的人。下面按硬件选型、云平台接入、设备端主逻辑、上位机开发四段拆开讲参数和坑都给到位。2. 硬件选型与传感器参数MQ2 预热、SHT30 通信、火焰阈值怎么定2.1 主控与外设的引脚分配逻辑主控选 STM32F103RCT648KB SRAM、256KB Flash、5 个串口、2 个 I2C、3 个 12 位 ADC资源对这套系统是宽裕的。外设多、串口多意味着 ESP8266、OLED、传感器可以各自占独立通道不用软件模拟。模块接口典型引脚供电SHT30I2CPB6/PB73.3VESP8266UART2PA2/PA33.3V火焰传感器ADC/GPIOPA0/PA13.3~5VMQ2 模拟输出ADCPA45VOLEDI2C/SPIPB8/PB93.3V蜂鸣器GPIOPC133.3V这张表是常见接法实际以自己开发板丝印为准。关键点是 MQ2 要 5V 供电而 STM32 的 ADC 参考电压是 3.3VMQ2 模拟输出满量程可能接近 5V直接接 ADC 引脚有超压风险。常见做法是串一个分压电阻或者只在报警逻辑里判断数字输出 DO模拟量做趋势参考。2.2 MQ2 预热与温度补偿MQ2 基于 SnO2 半导体原理加热丝需要持续高温。很多新手第一天接上就发现读数乱跳以为是代码问题其实是没预热。/* MQ2 采集与简单均值滤波ADC1 通道 4PA4 */ #define MQ2_ADC_CHANNEL ADC_Channel_4 #define MQ2_SAMPLE_TIMES 10 uint16_t MQ2_ReadAverage(void) { uint32_t sum 0; for (uint8_t i 0; i MQ2_SAMPLE_TIMES; i) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* 启动单次转换 */ while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); /* 等转换完成 */ sum ADC_GetConversionValue(ADC1); /* 累加 12 位结果 */ } return (uint16_t)(sum / MQ2_SAMPLE_TIMES); /* 取均值抗抖 */ }这段代码做的是 10 次采样取均值目的是压掉 ADC 上的随机抖动。MQ2_ADC_CHANNEL要根据实际接线改MQ2_SAMPLE_TIMES越大越稳但越慢轮询周期 1 秒的话 10 次足够。电烙铁加热丝位置别贴着传感器否则本底值会一直偏高。提示MQ2 初次使用建议预热 24 小时以上本底值需在洁净空气中通过电位器校准否则阈值判断根本不可信。2.3 火焰传感器的双输出用法红外火焰传感器对 760~1100nm 波长敏感探测角约 60 度。模块同时有 DO 和 AO 输出DO 由蓝色电位器调灵敏度。打火机测试距离约 80cm。DO 适合做中断式的快速触发AO 适合做火焰强度的连续判断。/* 火焰触发判断DO 低电平有效 */ #define FLAME_DO_PIN GPIO_Pin_1 #define FLAME_GPIO GPIOA uint8_t Flame_Detected(void) { return GPIO_ReadInputDataBit(FLAME_GPIO, FLAME_DO_PIN) Bit_RESET; }DO 输出有效电平由电位器决定接前先用万用表确认。有人把 DO 直接拉去触发蜂鸣器电路上没问题但软件拿不到状态、做不了上报所以还是走 GPIO 输入让主控判断更灵活。2.4 SHT30 的 I2C 读数SHT30 精度温度 ±0.3°C、湿度 ±2%RHI2C 地址通常 0x44。它支持单次测量和周期测量两种模式火灾感知场景用周期测量更省事。注意 STM32F103 的硬件 I2C 有历史稳定性问题很多项目直接改用 GPIO 模拟 I2C这也是这个项目里常见的处理方式。接线时 SDA/SCL 上拉电阻不能省否则会出现读不到 ACK 的情况。3. 华为云 IoTDA 产品创建与 MQTT 主题三元组配置3.1 创建产品与自定义模型登录华为云搜“设备接入 IoTDA”进入控制台。创建产品时数据格式选 JSON协议选 MQTT。产品建好后要到“模型定义”里加属性温度、湿度、烟雾浓度、火焰状态四个属性类型按实际选 int 或 string。不上报模型定义的属性云端影子数据就是空的上位机读不到值。这一步很多教程跳得快但它是后面 Qt 取影子数据的前提。3.2 MQTT 三元组与平台地址三元组指设备 ID、用户名、密码在注册设备时一次性生成设备密钥只在生成时显示一次务必保存。参数取值来源说明服务器地址控制台“接入信息”形如 xxx.iot-mqtts.cn-north-4.myhuaweicloud.com端口同上MQTT 通常 1883加密 8883ClientId设备 ID拼上时间戳可避免重连冲突Username设备 ID与 ClientId 一致Password设备密钥HMAC-SHA256 加密后的结果上报主题$oc/devices/{device_id}/sys/properties/report属性上报固定格式密码不是直接填密钥华为云要求用密钥对时间戳做 HMAC-SHA256生成工具在控制台“设备详情”里能下载。手写极易错直接用官方生成器最稳。3.3 属性上报的 JSON 格式{ services: [{ service_id: fire_monitor, properties: { temperature: 26, humidity: 55, smoke: 320, flame: 0 } }] }service_id必须和产品模型里的服务 ID 完全一致properties里的键也必须和模型属性同名大小写都不能错。云端收到不认识的字段会直接丢弃或报错。设备端把传感器值格式化成这段字符串后发到$oc/devices/{device_id}/sys/properties/report主题即可。上报频率建议 5~10 秒一次太频繁会撞上平台的流控限制。注意MQTT 报文大小、发布频率在华为云都有明确限制超了会被限流甚至断开调试阶段先降低频率。4. STM32 设备端主逻辑与 ESP8266 AT 指令接入4.1 轮询与采集的任务划分主循环不适合用一堆 delay 堆时间常见做法是一个 1 秒的软定时器控制采集节奏各传感器按需读取避免某路传感器慢拖垮整个循环。/* 主循环骨架1 秒采集一次5 秒上报一次 */ uint32_t last_sample 0, last_upload 0; while (1) { uint32_t now GetTick(); if (now - last_sample 1000) { last_sample now; temp SHT30_ReadTemp(); humi SHT30_ReadHumi(); smoke MQ2_ReadAverage(); flame Flame_Detected(); OLED_ShowData(temp, humi, smoke, flame); Alarm_Check(temp, smoke, flame); } if (now - last_upload 5000) { last_upload now; MQTT_Report(temp, humi, smoke, flame); } }GetTick()用 SysTick 累加毫秒计数。采集和上报分开计时是为了让上报频率独立于采集频率避免上报耗时拖慢采集。Alarm_Check里做阈值判断温湿度、烟雾、火焰任一越界就拉响蜂鸣器。4.2 ESP8266 的连接与 AT 指令顺序ESP8266 默认走 AT 指令常见序列是重启、设 Station 模式、连 Wi-Fi、建 TCP 连接。顺序错一步后面全挂。ATRST # 复位等 ready ATCWMODE1 # Station 模式 ATCWJAPssid,password # 连路由器等 WIFI GOT IP ATCIPSTARTTCP,xxx.iot-mqtts.cn-north-4.myhuaweicloud.com,1883 ATCIPSEND # 进入发送模式随后发 MQTT CONNECT 报文每条指令都要等返回 OK 或预期字段再发下一条用固定延时硬等是靠不住的建议写一个串口接收状态机匹配应答字符串。ATCWJAP返回WIFI GOT IP才算真正联网只看到OK还不够。4.3 MQTT 连接与心跳MQTT CONNECT 报文要带 ClientId、Username、Password用十六进制拼出来后通过ATCIPSEND发出。华为云要求心跳包PINGREQ间隔内必须有数据往来否则会断开。设备端用定时器定期发 PINGREQ。连不上时先查三元组再查端口和加密方式1883 和 8883 走错会直接 TCP 握手失败。5. Qt 上位机取华为云影子数据与界面开发5.1 影子数据接口的调用方式上位机不直接连 MQTT而是通过华为云的应用侧 API 读设备影子。需要先在“我的凭证”里创建 IAM 用户拿到 AK/SK再用它换取 Token。# 获取 IAM Token替换成自己的账号、用户名、密码 POST https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json { auth: { identity: { methods: [password], password: { user: { name: your_iam_user, password: your_password, domain: {name: your_account} } } }, scope: {project: {name: cn-north-4}} } }响应头里的X-Subject-Token就是后续请求要带的 Token。它有时效上位机要处理过期重取。拿到 Token 后调GET /v5/iot/{project_id}/devices/{device_id}/shadow就能取到设备最新属性界面定时刷新即可。5.2 Qt 界面与参数配置Qt 端用 QNetworkAccessManager 发 HTTP 请求QJsonDocument 解析返回的 JSON。界面上温湿度、烟雾、火焰各一个显示控件再加一个设备在线状态。常见做法是把项目 ID、设备 ID、Token 存到 ini 配置文件避免每次改代码重编译。// 读取影子数据并刷新界面 QNetworkReply *reply manager-get(request); connect(reply, QNetworkReply::finished, this, []() { QByteArray data reply-readAll(); QJsonDocument doc QJsonDocument::fromJson(data); QJsonObject shadow doc.object()[shadow].toObject()[0].toObject(); QJsonObject props shadow[reported].toObject()[properties].toObject(); ui-tempLabel-setText(QString::number(props[temperature].toDouble())); reply-deleteLater(); });shadow.reported.properties对应设备端上报的值QJsonDocument解析失败通常是 Token 过期返回了错误页。刷新周期设 5 秒和上报频率对齐即可太勤会白刷接口。5.3 编译与图标设置Qt 工程编译前确认.pro里的网络模块已加QT network否则 QNetworkAccessManager 找不到头文件。设置应用图标用.rc文件或直接在建工程时配置。跨平台编译时路径分隔符要小心Windows 反斜杠和其他系统不一致用QDir::separator()更省心。6. 阈值调优与联调排错6.1 三路传感器阈值怎么定才不误报MQ2 对温湿度敏感南方梅雨季本底值会飘。合理做法是先在目标环境连续采一小时数据取本底均值和波动范围阈值设成本底加三倍标准差。火焰传感器响应用 DO 触发避免 AO 噪声误报。温度阈值不建议设太低室内做饭、热水器都会让温度短时升高常见起始值是 50°C。变量起始阈值调整方向温度50°C厨房环境调高烟雾 ADC本底3σ环境湿度高时重新标定火焰DO 触发即报电位器灵敏度调低可减误报6.2 联调时最常见的三类故障第一类OLED 不亮。这类模块供电正确但需要正确初始化指令序列供电不等于点亮检查 I2C 地址和初始化顺序。第二类ESP8266 连上 Wi-Fi 但 MQTT 连不上多数是三元组密码算错或端口选错。第三类云端有数据但上位机读不到通常是影子数据的服务 ID 和属性名对不上。6.3 一段可复用的上报日志联调阶段在设备端把每条上报报文打到串口比在外面猜快得多。把MQTT_Report里的报文用串口原样输出再用 MQTT 调试工具在电脑上订阅同一主题对比能立刻定位是设备发错还是云端配置错。这个习惯在调 MQTT 类项目时收益最直接。本文还有配套的精品资源点击获取
返回列表