一、前言
1.1 项目介绍
本项目的资料已上传到夸克网盘
(包括软件工具、传感器代码),需要的可以去下载:https://pan.quark.cn/s/145a9b3f7f53
【1】项目开发背景
随着智能家居和物联网技术的快速发展,人们对于家庭安全的关注度日益提升。尤其是在火灾防范方面,传统的火灾报警系统往往只能在火灾发生时提供本地警报,这对于及时发现并采取措施以减少损失具有一定的局限性。由于现代生活节奏加快,越来越多的人无法时刻待在家中,因此需要一种可以远程监控家庭环境、尤其是火灾情况的解决方案。基于这样的背景,设计一个能够连接云端服务器的火灾感知系统显得尤为重要。
本项目开发一套基于STM32微控制器的智能火灾感知系统,该系统不仅具备基础的环境监测功能,如通过SHT30传感器检测室内温度与湿度,还集成了火焰检测(使用火焰传感器)及烟雾浓度监测(采用MQ2烟雾传感器),能够在早期阶段准确识别潜在的火灾风险。当检测到异常情况时,系统将立即激活蜂鸣器发出警报,并通过Wi-Fi模块将信息上传至华为云IOT平台,实现了从硬件端到云端的数据传输。这使得即使用户不在家,也能第一时间收到通知,从而快速响应可能发生的紧急状况。
为了进一步增强用户体验,为这套系统开发了一款配套使用的Android手机应用程序。借助这款APP,用户可以在任何地方轻松访问其家庭中的实时数据,包括但不限于当前的温湿度水平、是否存在火源或烟雾等关键指标。这种即时的信息反馈机制极大地提高了居住安全性,同时也符合当今社会对于智能化生活方式的追求。本项目不仅体现了技术进步如何改善日常生活质量,也是推动“万物互联”愿景实现的具体实践之一。
【2】设计实现的功能
1. 环境温湿度监测
• 硬件:使用SHT30数字温湿度传感器。
• 功能:实时采集室内温度和相对湿度数据,为用户提供关于居住环境舒适度的信息。同时,异常的温湿度变化也可能预示着某些潜在风险。
2. 火焰检测
• 硬件:采用红外火焰传感器。
• 功能:持续监控是否存在明火或高温热源。一旦探测到火焰信号,即刻启动报警机制。
3. 烟雾浓度监测
• 硬件:MQ2气体传感器。
• 功能:用于检测空气中的可燃气体及烟雾颗粒浓度。当烟雾水平超过设定阈值时,表明可能存在火灾隐患。
4. 声光报警
• 硬件:蜂鸣器与LED指示灯。
• 功能:结合火焰传感器和烟雾传感器的数据分析结果,如果发现任何一项指标达到预警标准,则立即触发蜂鸣器响铃并点亮LED以吸引注意,提醒用户采取行动。
5. 数据上传至云端
• 硬件:Wi-Fi模块(ESP8266)。
• 功能:将收集的所有传感器读数定期发送到华为云IoT平台,确保即使用户不在家也能随时了解最新情况。此外,云端存储还支持历史数据分析。
6. Android手机应用交互
• 软件:专为本项目定制开发的应用程序。
• 功能:允许用户通过智能手机接收来自家庭设备的即时更新,包括当前环境参数状态以及是否发生了紧急事件。应用程序界面友好,易于操作。
7. OLED显示屏信息展示
• 硬件:OLED显示屏幕。
• 功能:直接向用户展示现场测量值,如当前温度、湿度、烟雾浓度等重要信息,无需额外设备即可查看。
这套基于STM32的火灾感知系统不仅能够提供全面的环境监控服务,还能利用物联网技术实现远程管理与控制,极大地增强了家庭的安全保障能力。
【3】项目硬件模块组成
本项目基于STM32F103RCT6微控制器设计的火灾感知系统,其硬件模块组成主要包括以下几个部分:
1. 主控芯片
• 型号:STM32F103RCT6
• 功能:作为整个系统的控制核心,负责处理来自各个传感器的数据,并根据设定逻辑执行相应操作,如触发报警、数据上传等。
2. 温湿度传感器
• 型号:SHT30
• 功能:用于监测室内的温度和相对湿度。SHT30是一款高精度数字温湿度传感器,能够提供准确可靠的环境参数信息。
3. 火焰传感器
• 类型:红外火焰传感器
• 功能:检测室内是否存在明火或高温热源。这种传感器通常对波长在760nm到1100nm范围内的红外光敏感,适用于探测火焰产生的特定辐射。
4. 烟雾传感器
• 型号:MQ2
• 功能:检测空气中的烟雾及多种可燃气体(如天然气、液化气等)的浓度。MQ2是一种常用于气体泄漏检测和火灾预警的低成本传感器。
5. 蜂鸣器
• 功能:当系统检测到火焰或烟雾超过预设阈值时,蜂鸣器会发出声音警报,提醒用户注意潜在危险。
6. OLED显示屏
• 规格:例如0.96寸I2C接口OLED屏
• 功能:实时显示当前的温度、湿度、烟雾浓度等重要信息,便于用户直接查看现场状态。
7. Wi-Fi模块
• 型号:ESP8266或其他兼容Wi-Fi模块
• 功能:负责将采集到的数据通过无线网络上传至华为云IoT平台。同时也支持从云端接收指令,实现远程控制功能。
8. 电源管理
• 组件:稳压器、电池(可选)、电源适配器
• 功能:为系统各部件提供稳定的工作电压。根据实际需求可以选择使用外部供电或是内置电池方案以保证设备长时间运行。
1.2 设计思路
本项目的整体设计思路围绕着构建一个高效、可靠且易于使用的火灾感知系统展开,该系统旨在通过实时监测环境参数来预防和应对潜在的火灾风险。项目选择了STM32F103RCT6作为主控芯片,这款微控制器以其高性能、低功耗及丰富的外设接口而闻名,非常适合处理复杂的数据采集与处理任务。为了实现对室内环境条件的全面监控,系统集成了多种传感器:SHT30用于精确测量温度和湿度;火焰传感器用于检测明火的存在;MQ2烟雾传感器则用来评估空气中的烟雾浓度。这些传感器的选择基于它们在各自领域的高灵敏度和可靠性。
当任何一种传感器检测到异常情况时,如温度突然升高、湿度变化或检测到火焰和烟雾,系统将立即触发蜂鸣器发出警报,以引起周围人员的注意,并促使他们迅速采取行动。此外,为了保证即使在用户不在家的情况下也能及时获得通知,采用了ESP8266 Wi-Fi模块将所有采集到的数据上传至华为云IoT平台。这一举措不仅实现了数据的远程存储,还使得通过互联网连接的家庭成员可以随时访问最新的监测信息。
为了进一步增强用户体验并简化操作流程,项目团队开发了一款专用Android手机应用程序。这款APP能够直接从华为云服务器接收更新,并以直观的方式展示给用户,包括当前的温湿度水平、是否存在火源或烟雾等关键指标。这不仅方便了用户的日常使用,也极大地提高了响应紧急状况的速度。同时,在本地端,OLED显示屏被用来实时显示重要的环境参数,确保即便是在网络不可用的情况下,用户也能直接查看相关信息。
整个火灾感知系统的架构是围绕提高家庭安全性和便捷性来设计的。它结合了先进的硬件技术(如多传感器集成)与现代物联网解决方案(如云端数据管理和移动应用),形成了一个闭环的信息反馈体系。这样的设计不仅能有效预警火灾危险,而且为用户提供了一个全方位了解居住环境状态的窗口,无论身处何地都能保持对家庭安全的关注。通过这种方式,项目成功地将传统的火灾报警系统升级为更加智能化、互动化的智能家居组成部分。
1.3 系统功能总结
序号 | 功能模块 | 描述 | 硬件/软件支持 |
1 | 温湿度监测 | 通过SHT30传感器实时检测室内温度和相对湿度。 | SHT30传感器, STM32F103RCT6, OLED显示屏 |
2 | 火焰检测 | 使用红外火焰传感器持续监控是否存在明火或高温热源。 | 红外火焰传感器, STM32F103RCT6, 蜂鸣器 |
3 | 烟雾浓度监测 | 采用MQ2烟雾传感器检测空气中的可燃气体及烟雾颗粒浓度。 | MQ2烟雾传感器, STM32F103RCT6, 蜂鸣器 |
4 | 声光报警 | 当检测到火焰或烟雾超过预设阈值时,蜂鸣器发出声音警报,并点亮LED指示灯。 | 蜂鸣器, LED指示灯, STM32F103RCT6 |
5 | 数据上传至云端 | 通过ESP8266 Wi-Fi模块将采集的数据定期发送到华为云IoT平台。 | ESP8266, 华为云IOT服务, STM32F103RCT6 |
6 | Android手机应用交互 | 开发专用Android应用程序,用户可以通过手机实时接收家庭环境数据和紧急报警信息。 | Android APP, 华为云IOT服务, 互联网连接 |
7 | 本地数据显示 | 通过OLED显示屏实时显示当前的温湿度、烟雾浓度等重要信息。 | OLED显示屏, STM32F103RCT6 |
8 | 远程监控与控制 | 利用云端服务器实现远程数据访问和设备状态查看,支持通过手机APP进行远程操作。 | 华为云IOT服务, Android APP, 互联网连接 |
1.4 开发工具的选择
【1】设备端开发
STM32的编程语言选择C语言,C语言执行效率高,大学里主学的C语言,C语言编译出来的可执行文件最接近于机器码,汇编语言执行效率最高,但是汇编的移植性比较差,目前在一些操作系统内核里还有一些低配的单片机使用的较多,平常的单片机编程还是以C语言为主。C语言的执行效率仅次于汇编,语法理解简单、代码通用性强,也支持跨平台,在嵌入式底层、单片机编程里用的非常多,当前的设计就是采用C语言开发。
开发工具选择Keil,keil是一家世界领先的嵌入式微控制器软件开发商,在2015年,keil被ARM公司收购。因为当前芯片选择的是STM32F103系列,STMF103是属于ARM公司的芯片构架、Cortex-M3内核系列的芯片,所以使用Kile来开发STM32是有先天优势的,而keil在各大高校使用的也非常多,很多教科书里都是以keil来教学,开发51单片机、STM32单片机等等。目前作为MCU芯片开发的软件也不只是keil一家独大,IAR在MCU微处理器开发领域里也使用的非常多,IAR扩展性更强,也支持STM32开发,也支持其他芯片,比如:CC2530,51单片机的开发。从软件的使用上来讲,IAR比keil更加简洁,功能相对少一些。如果之前使用过keil,而且使用频率较多,已经习惯再使用IAR是有点不适应界面的。
【2】上位机开发
上位机的开发选择Qt框架,编程语言采用C++;Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。Qt能轻松创建具有原生C++性能的连接设备、用户界面(UI)和应用程序。它功能强大且结构紧凑,拥有直观的工具和库。
1.5 模块的技术详情介绍
【1】SHT30传感器
SHT30是一款高精度的数字温湿度传感器,由瑞士Sensirion公司生产。这款传感器广泛应用于各种环境监测系统中,如智能家居、工业控制、气象站以及农业监控等领域。SHT30以其卓越的性能、低功耗和易于集成的特点而受到用户的青睐。
SHT30传感器采用了先进的CMOSens®技术,将温度和湿度传感元件与信号处理电路集成在同一个芯片上,从而确保了高度的可靠性和长期稳定性。该传感器提供I2C接口,方便与微控制器或其他主控设备进行通信。其测量范围广泛,温度测量范围为-40°C至+125°C,湿度测量范围为0%至100% RH(相对湿度)。此外,SHT30具有很高的测量精度,典型情况下,温度精度可达±0.3°C,湿度精度可达±2% RH。
SHT30传感器具备多种功能以提高测量质量和用户体验。例如,它支持用户自定义的测量频率和分辨率设置,允许根据具体应用需求调整传感器的工作模式。传感器还内置了加热器,可用于检测结露或除湿等特殊应用场景。此外,SHT30具有自动校准功能,能够在长时间运行后保持测量数据的准确性,减少了维护成本。
为了适应不同的环境条件,SHT30传感器采用了坚固的设计,能够抵抗灰尘、水汽和其他污染物的影响。其紧凑的尺寸(2.5 x 2.5 x 0.9 mm)使其易于集成到空间受限的应用中。同时,SHT30还提供了多种封装选项,包括标准表面贴装(SMD)封装和平板式封装,满足不同安装要求。
SHT30传感器的低功耗特性也是其一大亮点,这使得它非常适合电池供电的应用。在正常工作模式下,传感器的平均电流消耗仅为0.5 μA至2.8 μA,具体取决于所选的测量频率和分辨率。此外,SHT30还支持睡眠模式,在不进行测量时进一步降低功耗,延长电池寿命。
SHT30传感器凭借其高精度、宽测量范围、易用性以及低功耗等特点,成为众多需要精确温湿度测量应用的理想选择。无论是用于家庭自动化中的舒适度监测,还是工业环境中的过程控制,SHT30都能提供可靠的数据支持。
【2】ESP8266-WIFI
ESP8266 是一款高性价比、功能强大的 Wi-Fi 模块,广泛应用于物联网(IoT)设备中,用于实现设备的无线通信功能。ESP8266 模块由乐鑫科技(Espressif Systems)设计和生产,集成了 TCP/IP 协议栈,支持 Wi-Fi 协议,可以充当无线通信设备或嵌入式微控制器的 Wi-Fi 适配器。其核心是 Tensilica L106 32 位处理器,最高主频为 80 MHz 或 160 MHz,性能足以应对绝大多数 Wi-Fi 通信需求。模块内部集成了射频收发器、PA(功率放大器)、低噪声接收器和高效天线,确保 Wi-Fi 信号的可靠性和强度。
ESP8266 支持多种通信模式,包括 Station 模式(作为客户端连接到已有 Wi-Fi 网络)、SoftAP 模式(充当接入点,让其他设备连接到 ESP8266 创建的网络)以及 Station+SoftAP 模式(同时支持客户端连接和接入点功能)。其中,Station 模式常用于 IoT 应用,让设备可以接入互联网,将数据上传到云端,实现远程监控或控制。模块支持的通信协议包括 TCP、UDP,便于不同网络应用协议的实现。此外,ESP8266 的网络通信支持多个 TCP/IP 套接字连接,并且具备 HTTP 和 MQTT 等常用协议的扩展功能。
ESP8266 的默认通信方式是基于 UART 接口的 AT 指令集,通过串口指令控制模块工作。AT 指令集功能丰富,包括 Wi-Fi 网络连接管理、TCP/UDP 连接管理、数据传输、网络扫描、获取 IP 地址等功能,能够满足绝大多数无线通信需求。此外,ESP8266 具有丰富的 GPIO 引脚和 UART、SPI、I²C 等外设接口,可以通过开发固件(如 ESP8266 SDK 或第三方开源固件)实现模块的二次开发,使其不仅仅是一个 Wi-Fi 模块,还可以作为主控芯片使用。
ESP8266 的应用十分广泛,常见于智能家居设备(如智能灯泡、插座、温湿度传感器)、远程数据采集、工业自动化控制系统等场景中。其显著的特点在于成本低、功能强大,适合 IoT 设备对网络通信的需求。通过 ESP8266 模块,设备可以轻松接入互联网,实现物联网应用的基础功能。
【3】MQ2传感器
MQ2 是一种常用的气体传感器,专门用于检测空气中的可燃气体和烟雾浓度。它基于金属氧化物半导体(MOS)的敏感原理,内部的传感材料通常是二氧化锡(SnO₂)。当二氧化锡表面接触到可燃气体(如液化石油气、丙烷、氢气等)或烟雾中的还原性气体分子时,这些气体会在传感器加热的情况下发生反应,导致表面电阻的变化,传感器即可通过测量电阻值的变化来感知气体浓度。这种变化会转换为模拟电压信号输出,便于后续的电路读取和处理。
MQ2 传感器具有较高的灵敏度和快速响应特点,特别适合用于环境空气中可燃气体泄漏和火灾烟雾检测。它的电路设计简单,通常包括一个加热元件和一个输出引脚。传感器的加热元件由内部微小电阻组成,通过外部电源加热后持续保持较高温度,增强了传感器对气体的反应速度与灵敏度。其典型输出为模拟信号,可以接入 ADC(模数转换器)模块进行数值采集与处理。MQ2 传感器模块一般包含一个数字输出端和一个模拟输出端,模拟端直接对应传感器检测到的气体浓度,数字端则用于报警设定,输出高低电平,用于连接报警装置,如蜂鸣器、LED 指示灯等。
该传感器广泛应用于家庭、工业以及商业的气体泄漏报警和环境监测中。例如,家用燃气泄漏报警、工业可燃气体检测、智能家居中的烟雾火灾预警等。MQ2 的优点在于它的高灵敏度、易于校准和低成本,适合大规模部署。它的缺点则在于对湿度、温度变化较为敏感,在复杂环境中可能需要进行补偿校准。MQ2 传感器使用时需要一个稳定的电压源,通常推荐 5V 供电,且在初次启动时需要进行预热(通常 24 小时以上)以达到最佳性能和准确度。
1.6 摘要
本项目设计并实现了一个基于 STM32 和 ESP8266 的火灾感知系统,并通过华为云 IoT 平台实现远程监控与报警功能。系统的核心控制器 STM32F103RCT6 通过 SHT30、火焰传感器和 MQ2 传感器实时检测室内的温度、湿度、火焰和烟雾浓度。当检测到火灾相关参数超过阈值时,系统会触发蜂鸣器本地报警。同时,通过 ESP8266 Wi-Fi 模块将采集数据上传至华为云 IoT 平台,使用户可以在 Android 应用程序中远程查看室内环境信息及火灾报警状态,实时掌握家庭安全情况。系统还通过 OLED 屏幕本地显示实时数据,实现数据的可视化。
本系统不仅实现了火灾的本地感知和报警,还通过云平台的集成实现了真正的远程监控和预警,满足了现代家庭对智能安防系统的需求。
1.7 参考文献
1. 曾彦钧,李越,东文等.基于NB-IoT和STM32的数据融合智慧消防系统设计[J].物联网技术,2020.
2. 王强强,李玉丽.基于物联网云平台的火灾监测报警系统设计 附视频[J].技术与市场,2024.
3. 1. 西安交通大学城市学院电气与信息工程系2. 机器人与智能制造陕西省高校工程研究中心.基于OneNET云平台的智慧消防远程监控系统的设计[J].电子设计工程,2024.
4. 胡祝格,赵敏华.基于信息融合技术的无线火灾探测报警系统[J].电子科技,2012.
5. 廖芝逸,敖银辉.基于STM32的消防远程监测系统[J].机电工程技术,2016.
6. 茹清晨.基于物联网的火灾感知系统设计与实现[D].南京信息工程大学,2022.
7. 徐崇奇,解建国,毕佳琦等.基于STM32的智能火灾监测及灭火系统设计[J].河南科技,2022.
8. 张伟,段萍,丁承君.基于STM32火灾报警系统设计[J].科技创新与应用,2016.
9. 刘燕燕,杨帮华,丁丽娜等.基于STM32的红外火灾探测系统设计[J].计算机测量与控制,2013.
10. 梁剑烽.基于物联网云平台的家居火灾监控系统的研究与实现[D].广西大学,2021.
11. Ziliu Ye, Fuwen Su et al. “Intelligent Fire-fighting robot based on STM32.” 2019 Chinese Automation Congress (CAC)(2019).
12. Yazhou Zhong, Fei Wu et al. “Design of smoke alarm system based on STM32.” International Journal of Engineering Research and(2017).
13. Fengshan Huang, Shaozi Li et al. “Design on Intelligent Smoke Alarm System.” 2022 12th International Conference on Information Technology in Medicine and Education (ITME)v(2022).
14. 丁伟杰,刘昱廷,李建英等.基于窄带物联网技术的智能火灾报警系统设计[J].电工技术,2023.
15. 赵哲,陈伟利.基于STM32单片机、树莓派和CortexA9的云端智慧消防控制系统设计[J].科学技术创新,2021.
16. 朱黎,全斐,王磊等.基于无线网络的环境监测系统[J].电子制作,2022.
17. 杜朝明,胡静,宋铁成等.基于NB-IoT的智慧消防监控系统设计与实现[J].无线互联科技,2021.
18. 赵剑毅, 梁柱等. “Fire alarm system based on STM32.” (2014).
19. 栾兵.智能火灾报警系统的设计与研究[J].电子测试,2019.
20. 胡祝格.基于多传感器信息融合技术的火灾探测报警系统设计与研究[D].西安建筑科技大学,2013.
21. 刘满喜,谢再晋,潘佳卉等.基于STM32单片机的智能灭火小车设计[J].电子设计工程,2020.
22. 杜鑫,陈洁,郭彦文等.单片机和NB-IOT的智能家居火灾检测报警系统 附视频[J].福建电脑,2024.
23. 张国伟.关于STM32火灾报警系统设计分析[J].农村经济与科技,2018.
24. 朱慧君.智能安防系统之无线火灾远程报警器的设计[D].哈尔滨理工大学,2018.
25. 郭灼豪,彭杰琛,庄乙辉等.多模态火灾检测报警系统设计[J].韶关学院学报,2022.
26. Lihui Wang, Shuai Zhao et al. “Remote multi-function fire alarm system based on Internet of things.” (2018).
27. Anyi Wang, Jinpeng Cheng. “Realization of Dynamic Information Data Transmission Function of Fire Scene Based on NB-iot.” 2020 3rd International Conference on Electron Device and Mechanical Engineering (ICEDME)(2020).
28. 王晓鹏,丁学文,王敏军等.基于STM32单片机的微型智能消防车的设计[J].计算机与网络,2021.
29. 丁杨.基于stm32单片机的智能消防机器人的应用[J].计算机产品与流通,2020.
30. 廖银霜.基于物联网的火灾探测报警系统的研究[D].贵州大学,2021.
二、硬件选型
(1) 主控芯片:STM32F103RCT6
• 选用 STM32F103RCT6 作为系统主控芯片,具备低功耗、高性能的特点,足够的 GPIO 和外设支持,有效满足多传感器接口和 Wi-Fi 通信需求。
(2) 温湿度传感器:SHT30
• SHT30 传感器用于实时检测环境温度和湿度,具备高精度、低功耗的特点,采用 I²C 接口,方便 STM32 读取数据。
(3) 火焰传感器
• 火焰传感器用于检测火焰的有无,适用于火灾检测场景,具备较高的灵敏度,可快速响应火灾现场的明火。
(4) 烟雾传感器:MQ2
• MQ2 传感器用于检测烟雾浓度,能够有效识别火灾产生的烟雾气体,接口简单,易于与 STM32 连接并获取数据。
(5) Wi-Fi 模块:ESP8266
• 选用 ESP8266 模块以实现数据的无线传输。该模块支持 TCP/UDP 通信,通过 UART 与 STM32 连接,可将数据上传至华为云 IoT 平台,满足远程监控需求。
(6) OLED 显示屏
• OLED 屏幕用于显示本地环境数据(温湿度、烟雾浓度、火焰状态等),界面直观,低功耗。
(7) 蜂鸣器
• 作为本地报警设备,蜂鸣器在检测到火灾相关参数超限时发出声音报警,以提醒用户室内可能存在火灾。
(8) 其他电路模块
• 电源模块:为系统提供稳定的电源,确保 STM32、ESP8266、传感器等模块稳定运行。
• USB-TTL 模块:用于调试 ESP8266,便于与电脑连接,测试其 AT 指令响应和 Wi-Fi 通信功能。
三、部署华为云物联网平台
华为云官网: https://www.huaweicloud.com/
打开官网,搜索物联网,就能快速找到 设备接入IoTDA
。
3.1 物联网平台介绍
华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助快速构筑物联网解决方案。
使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。
物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。
设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。
业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。
3.2 开通物联网服务
地址: https://www.huaweicloud.com/product/iothub.html
开通标准版免费单元。
开通之后,点击总览
,查看接入信息。 当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。
总结:
端口号: MQTT (1883)| MQTTS (8883)
接入地址: a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com
根据域名地址得到IP地址信息:
Microsoft Windows [版本 10.0.19044.2846]
(c) Microsoft Corporation。保留所有权利。
C:\Users\11266>ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com
正在 Ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 字节的数据:
来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31
来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31
来自 121.36.42.100 的回复: 字节=32 时间=36ms TTL=31
来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31
121.36.42.100 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 36ms,最长 = 37ms,平均 = 36ms
C:\Users\11266>
MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。
3.3 创建产品
(1)创建产品
点击右上角创建产品。
(2)填写产品信息
根据自己产品名字填写,下面的设备类型选择自定义类型。
(3)产品创建成功
(4)添加自定义模型
产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。
模型简单来说: 就是存放设备上传到云平台的数据。比如:环境温度、环境湿度、环境烟雾浓度、火焰检测状态图等等,这些都可以单独创建一个模型保存。
当前设备需要与云平台交互的属性如下: 接下来就按照下面的属性创建 华为云平台的模型。
DHT11_T 环境温度
DHT11_H 环境湿度
flame 火焰检测
MQ2 烟雾浓度
先点击自定义模型,创建一个服务ID。
接着点击新增属性。
DHT11_T 环境温度
DHT11_H 环境湿度
MQ2 烟雾浓度
flame 火焰检测
全部添加完毕之后。
3.4 添加设备
产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。
(1)注册设备
点击右上角注册设备。
(2)根据自己的设备填写
(3)保存设备信息
创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。
当前设备的信息如下:
{
"device_id": "64449f6a36eaa44b9c95d259_dev1",
"secret": "12345678"
}
(4) 设备创建完成
3.5 MQTT协议主题订阅与发布
(1)MQTT协议介绍
当前的设备是采用MQTT协议与华为云平台进行通信。
MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前MQTT拥有各种平台和设备上的客户端,已经形成了初步的生态系统。
MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;MQTT协议是工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;所以,只要具备TCP协议栈的网络设备都可以使用MQTT协议。 本次设备采用的ESP8266就具备TCP协议栈,能够建立TCP连接,所以,配合STM32代码里封装的MQTT协议,就可以与华为云平台完成通信。
华为云的MQTT协议接入帮助文档在这里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
业务流程:
(2)华为云平台MQTT协议使用限制
描述 | 限制 |
支持的MQTT协议版本 | 3.1.1 |
与标准MQTT协议的区别 | 支持Qos 0和Qos 1支持Topic自定义不支持QoS2不支持will、retain msg |
MQTTS支持的安全等级 | 采用TCP通道基础 + TLS协议(最高TLSv1.3版本) |
单帐号每秒最大MQTT连接请求数 | 无限制 |
单个设备每分钟支持的最大MQTT连接数 | 1 |
单个MQTT连接每秒的吞吐量,即带宽,包含直连设备和网关 | 3KB/s |
MQTT单个发布消息最大长度,超过此大小的发布请求将被直接拒绝 | 1MB |
MQTT连接心跳时间建议值 | 心跳时间限定为30至1200秒,推荐设置为120秒 |
产品是否支持自定义Topic | 支持 |
消息发布与订阅 | 设备只能对自己的Topic进行消息发布与订阅 |
每个订阅请求的最大订阅数 | 无限制 |
(3)主题订阅格式
帮助文档地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
对于设备而言,一般会订阅平台下发消息给设备 这个主题。
设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。
如果设备想要知道平台下发的消息,需要订阅上面图片里标注的主题。
以当前设备为例,最终订阅主题的格式如下:
$oc/devices/{device_id}/sys/messages/down
最终的格式:
$oc/devices/64449f6a36eaa44b9c95d259_dev1/sys/messages/down
(4)主题发布格式
对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。
这个操作称为:属性上报。
帮助文档地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
根据帮助文档的介绍, 当前设备发布主题,上报属性的格式总结如下:
发布的主题格式:
$oc/devices/{device_id}/sys/properties/report
最终的格式:
$oc/devices/64449f6a36eaa44b9c95d259_dev1/sys/properties/report
发布主题时,需要上传数据,这个数据格式是JSON格式。
上传的JSON数据格式如下:
{
"services": [
{
"service_id": <填服务ID>,
"properties": {
"<填属性名称1>": <填属性值>,
"<填属性名称2>": <填属性值>,
..........
}
}
]
}
根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。
根据这个格式,组合一次上传的属性数据:
{"services": [{"service_id": "stm32","properties":{"DHT11_T":18,"DHT11_H":80,"flame":1,"MQ2":70}}]}
3.6 MQTT三元组
MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。
接下来介绍,华为云平台的MQTT三元组参数如何得到。
(1)MQTT服务器地址
要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。
帮助文档地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home
MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。
根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的)
华为云的MQTT服务器地址:121.36.42.100
华为云的MQTT端口号:1883
(2)生成MQTT三元组
华为云提供了一个在线工具,用来生成MQTT鉴权三元组: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。
下面是打开的页面:
填入设备的信息: (上面两行就是设备创建完成之后保存得到的)
直接得到三元组信息。
得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。
ClientId 64449f6a36eaa44b9c95d259_dev1_0_0_2023042303
Username 64449f6a36eaa44b9c95d259_dev1
Password 8065cda74ea5d6f4e86273768375aa271e39c9525abde342d29896bcb6495d48
3.7 模拟设备登录测试
经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。
(1)填入登录信息
打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。
(2)打开网页查看
完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。
点击详情页面,可以看到上传的数据:
到此,云平台的部署已经完成,设备已经可以正常上传数据了。
(3)MQTT登录测试参数总结
MQTT服务器IP地址: 121.36.42.100
MQTT端口号: 1883
客户端ID:64449f6a36eaa44b9c95d259_dev1_0_0_2023042303
用户名:64449f6a36eaa44b9c95d259_dev1
登录密码:8065cda74ea5d6f4e86273768375aa271e39c9525abde342d29896bcb6495d48
订阅主题:$oc/devices/64449f6a36eaa44b9c95d259_dev1/sys/messages/down
发布主题:$oc/devices/64449f6a36eaa44b9c95d259_dev1/sys/properties/report
发布的消息:{"services": [{"service_id": "stm32","properties":{"DHT11_T":18,"DHT11_H":80,"flame":1,"MQ2":70}}]}
四、上位机开发
为了方便查看设备上传的数据,对设备进行远程控制,接下来利用Qt开发一款Android和windows系统的上位机。
使用华为云平台提供的API接口获取设备上传的数据,也可以给设备下发指令,控制设备。
为了方便查看设备上传的数据,对设备进行远程控制,接下来利用Qt开发一款Android和windows系统的上位机。
使用华为云平台提供的API接口获取设备上传的数据,也可以给设备下发指令,控制设备。
4.1 Qt开发环境安装
Qt的中文官网: https://www.qt.io/zh-cn/![image-20221207160550486](https://led-obs.obs.cn-north-1.myhuaweicloud.com/Blog/img/image-20221207160550486.png)
QT5.12.6的下载地址:https://download.qt.io/archive/qt/5.12/5.12.6
打开下载链接后选择下面的版本进行下载:
qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details
软件安装时断网安装,否则会提示输入账户。
如果官网下载不了,可以去网盘找到下载:https://pan.quark.cn/s/145a9b3f7f53
安装的时候,第一个复选框里勾选一个mingw 32
编译器即可,其他的不管默认就行,直接点击下一步继续安装。
说明: 我这里只是介绍PC端的环境搭建(这个比较简单)。 Android的开发环境比较麻烦,可以去我的博客里看详细文章。
选择MinGW 32-bit 编译器:
4.2 创建IAM账户
创建一个IAM账户,因为接下来开发上位机,需要使用云平台的API接口,这些接口都需要token进行鉴权。简单来说,就是身份的认证。 调用接口获取Token时,就需要填写IAM账号信息。所以,接下来演示一下过程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
获取Token时,除了AIM账号外,还需要项目凭证:
点击右上角头像我的凭证
。
4293788d412b44e38441f98adca8541e
鼠标放在左上角头像上,在下拉菜单里选择统一身份认证
。
点击右上角创建用户
。
创建成功:
4.3 获取影子数据
帮助文档:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html
设备影子介绍:
设备影子是一个用于存储和检索设备当前状态信息的JSON文档。
每个设备有且只有一个设备影子,由设备ID唯一标识
设备影子仅保存最近一次设备的上报数据和预期数据
无论该设备是否在线,都可以通过该影子获取和设置设备的属性
简单来说:设备影子就是保存,设备最新上传的一次数据。
设计的软件里,如果想要获取设备的最新状态信息,就采用设备影子接口。
如果对接口不熟悉,可以先进行在线调试:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow
点击调试:
在线调试接口,可以请求影子接口,了解请求,与返回的数据格式。
设备影子接口返回的数据如下:
{
"device_id": "64449f6a36eaa44b9c95d259_dev1",
"shadow": [
{
"service_id": "stm32",
"desired": {
"properties": null,
"event_time": null
},
"reported": {
"properties": {
"DHT11_T": 18,
"DHT11_H": 80,
"flame": 1,
"MQ2": 70
},
"event_time": "20230423T031318Z"
},
"version": 0
}
]
}
4.5 设计上位机
前面2讲解了需要用的API接口,接下来就使用Qt设计上位机,设计界面,完成整体上位机的逻辑设计。
【1】新建Qt工程
选择工程路径,放在英文路径下。
创建完毕。
新建Android的模板:
修改:
【2】打开现有的Qt工程
如果想打开已经设计好的工程,可以在保存上位机源码的目录下,找到工程文件xxx.pro,双击打开工程,详细操作看下面截图红框。
【3】设计UI界面
设计完成的界面;
【4】配置参数读取与保存
//将数据保存到文件
void Widget::SaveDataToFile()
{
/*保存数据到文件,方便下次加载*/
QFile filesrc(ConfigFile);
filesrc.open(QIODevice::WriteOnly);
QDataStream out(&filesrc);
out << Token;
filesrc.flush();
filesrc.close();
}
//从文件读取数据
void Widget::ReadDataFile(void)
{
QString data;
//读取配置文件
//判断文件是否存在
if(QFile::exists(ConfigFile))
{
QFile filenew(ConfigFile);
filenew.open(QIODevice::ReadOnly);
QDataStream in(&filenew); // 从文件读取序列化数据
in >> Token; //提取写入的数据
filenew.close();
}
}
【5】通信交互代码
//查询设备属性
void Widget::Get_device_properties()
{
//label_time
QDateTime current_date_time =QDateTime::currentDateTime();
QString current_date =current_date_time.toString("yyyy/MM/dd hh:mm:ss");
ui->label_time->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->label_time->setText(current_date);
function_select=0;
QString requestUrl;
QNetworkRequest request;
//设置请求地址
QUrl url;
//获取token请求地址
requestUrl = QString("https://a3433ab133.iotda.cn-north-4.myhuaweicloud.com:443/v5/iot/4293788d412b44e38441f98adca8541e/devices/64449f6a36eaa44b9c95d259_dev1/shadow");
//设置数据提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
//设置token
request.setRawHeader("X-Auth-Token",Token);
//构造请求
url.setUrl(requestUrl);
request.setUrl(url);
//发送请求
manager->get(request);
}
【8】设置应用图标和应用名称
【9】编译工程代码
编译windows版本:
编译Android版本:
点击绿色小三角形之后,会弹出选择手机设备列表。需要提前将Android手机通过USB连接电脑的USB口,并且打开Android手机的USB调试选项,接下来选择设备,就可以编译安装到Android手机上。
【10】更新时间日期
//label_time
QDateTime current_date_time =QDateTime::currentDateTime();
QString current_date =current_date_time.toString("yyyy/MM/dd hh:mm:ss");
ui->label_time->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->label_time->setText(current_date);
【11】 运行效果
【12】源码目录
安装好Qt环境之后,双击打开即可。
注意: Qt工程需要放在英文路径下打开。
五、ESP8266模块调试过程
通过 USB-TTL 模块连接电脑,可以对 ESP8266 模块进行调试和功能测试,确保模块正常工作。
以下是详细的调试步骤,包括连接、环境配置、常用测试命令及预期结果。
1. 准备工作
• 硬件设备:
• ESP8266 模块
• USB-TTL 转换器模块
• 面包板和连接线
• 软件:
• 串口调试工具(例如:XCOM、SecureCRT、Arduino IDE 的串口监视器、或其他串口调试工具)
2. 连接 ESP8266 与 USB-TTL
确保连接无误以避免模块损坏。ESP8266 的工作电压是 3.3V,不要直接连接到 5V。
连接引脚
ESP8266 引脚 | USB-TTL 引脚 |
VCC | 3.3V |
GND | GND |
TX | RX (接收) |
RX | TX (发送) |
CH_PD (EN) | 3.3V |
• 注意:ESP8266 的
CH_PD
(EN) 引脚需要连接到 3.3V 电源,以使模块处于激活状态。• 确认模块连接好后,将 USB-TTL 插入电脑 USB 端口。
3. 打开串口调试工具
• 打开串口调试工具,将串口波特率设置为 115200 或 9600(ESP8266 默认常用的波特率)。
• 设置 串口参数:数据位
8
、停止位1
、无校验位。• 选择 USB-TTL 所在的串口号(COM 端口),然后点击 打开串口。
4. 发送 AT 指令测试
在串口调试工具中发送 AT 指令,逐步确认 ESP8266 的功能是否正常。
4.1 测试模块的响应
1. 发送:
AT
• 作用:检查模块是否正常工作。
• 预期结果:返回
OK
• 说明:如果未收到
OK
,检查连接,确认波特率设置正确。
4.2 检查模块信息
1. 发送:
AT+GMR
• 作用:查看固件版本信息。
• 预期结果:返回模块的固件版本信息。
• 说明:确保固件版本信息正常显示,若返回错误或无响应,可能固件有问题或模块不兼容。
4.3 设置模块为 Station 模式(STA)
1. 发送:
AT+CWMODE=1
•
1
:Station 模式(连接 Wi-Fi)•
2
:SoftAP 模式(开启热点)•
3
:SoftAP+Station 模式(同时作为热点和 Wi-Fi 连接设备)
• 作用:设置 ESP8266 工作模式为 Station 模式(连接 Wi-Fi 网络)。
• 预期结果:返回
OK
• 说明:ESP8266 支持三种模式:
4.4 搜索附近的 Wi-Fi 网络
1. 发送:
AT+CWLAP
• 作用:扫描并列出周围的 Wi-Fi 网络。
• 预期结果:返回网络列表,包括 SSID、信号强度、加密方式等信息。
• 说明:若返回
ERROR
,可能是 Wi-Fi 功能损坏或模块硬件问题。
4.5 连接 Wi-Fi 网络
1. 发送:
AT+CWJAP="SSID","PASSWORD"
• 作用:连接到指定的 Wi-Fi 网络,替换
"SSID"
和"PASSWORD"
为实际的网络名称和密码。• 预期结果:返回
WIFI CONNECTED
和OK
• 说明:若返回
FAIL
,检查 Wi-Fi 名称和密码是否正确,以及 Wi-Fi 信号是否稳定。
4.6 检查 IP 地址
1. 发送:
AT+CIFSR
• 作用:获取 ESP8266 的 IP 地址。
• 预期结果:显示分配到的 IP 地址(例如:
192.168.1.100
)。• 说明:若未分配到 IP 地址,确认 Wi-Fi 连接状态,确保模块已成功连接到 Wi-Fi。
5. TCP 客户端连接测试
ESP8266 支持通过 AT 指令连接到远程服务器进行通信,模拟数据上传。
5.1 启用单连接模式
1. 发送:
AT+CIPMUX=0
• 作用:将 ESP8266 设置为单连接模式。
• 预期结果:返回
OK
• 说明:单连接模式下,ESP8266 只能建立一个 TCP/UDP 连接。
5.2 连接到 TCP 服务器
1. 发送:
AT+CIPSTART="TCP","server_ip",port
• 作用:连接到指定的 TCP 服务器(如:
AT+CIPSTART="TCP","192.168.1.200",8080
)。• 预期结果:返回
CONNECT
表示连接成功,或者ALREADY CONNECTED
。• 说明:若返回
ERROR
,检查 IP 地址、端口号是否正确,确认服务器正常工作。
5.3 发送数据测试
1. 发送:
AT+CIPSEND=length
• 作用:准备发送指定长度的数据(如
AT+CIPSEND=10
)。• 预期结果:返回
>
,表示可以输入数据。• 说明:若返回
ERROR
,可能是连接未建立或发送指令格式错误。
2. 发送数据内容:例如 HelloWorld
• 预期结果:返回
SEND OK
• 说明:如果收到
SEND OK
表示数据发送成功,服务器端应能接收到数据内容。
5.4 关闭连接
1. 发送:
AT+CIPCLOSE
• 作用:断开 TCP 连接。
• 预期结果:返回
CLOSED
• 说明:确认连接已成功关闭,释放模块资源。
6. 常见问题及解决
1. 模块无响应:
• 确认电源稳定,模块电压为 3.3V,电流供应足够(ESP8266 工作时电流需求高)。
• 检查串口波特率,尝试 9600 或 115200。
2. 连接 Wi-Fi 失败:
• 确认 Wi-Fi 名称和密码输入正确。
• 确保模块处于有效的 Wi-Fi 信号范围内。
3. TCP 连接失败:
• 确认服务器 IP 地址和端口号正确。
• 检查网络设置,确保防火墙未阻止连接。
以上过程可以验证 ESP8266 模块基本功能是否正常工作,并可以通过串口工具发送和接收数据,完成基本的 Wi-Fi 和网络通信测试。
六、STM32代码开发
6.1 ESP8266配置代码
ESP8266 配置成 STA 模式(连接 Wi-Fi 网络)并作为 TCP 客户端连接华为云服务器的代码如下。Wi-Fi 连接信息(SSID 和密码)以及华为云的 IP 地址和端口号已经明确。代码还包括 ESP8266 的初始化、连接到 Wi-Fi、建立 TCP 连接、以及发送数据的过程。
#include "stm32f1xx_hal.h"
#include <string.h>
#include <stdio.h>
// 定义ESP8266的UART接口和相关引脚配置
#define ESP8266_UART &huart2 // 假设使用UART2
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASSWORD "your_wifi_password"
#define CLOUD_SERVER_IP "your_cloud_server_ip" // 华为云服务器 IP
#define CLOUD_SERVER_PORT "your_cloud_server_port" // 华为云服务器端口
// 缓冲区大小
#define RX_BUFFER_SIZE 1024
uint8_t rx_buffer[RX_BUFFER_SIZE];
// 函数声明
void ESP8266_Init(void);
void ESP8266_SendCommand(const char* cmd, const char* ack, uint16_t timeout);
void ESP8266_ConnectWiFi(void);
void ESP8266_ConnectToServer(void);
void ESP8266_SendDataToCloud(const char* data);
void ESP8266_Init(void) {
// 复位 ESP8266 模块
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 假设使用 GPIOB 0 引脚复位
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(500);
// 确保模块启动成功
ESP8266_SendCommand("AT\r\n", "OK", 2000);
// 设置工作模式为 STA 模式 (Station 模式)
ESP8266_SendCommand("AT+CWMODE=1\r\n", "OK", 2000);
}
void ESP8266_ConnectWiFi(void) {
char cmd[100];
// 配置连接 WiFi 的命令
snprintf(cmd, sizeof(cmd), "AT+CWJAP=\"%s\",\"%s\"\r\n", WIFI_SSID, WIFI_PASSWORD);
ESP8266_SendCommand(cmd, "OK", 5000);
}
void ESP8266_ConnectToServer(void) {
char cmd[100];
// 设置多连接模式为单一连接
ESP8266_SendCommand("AT+CIPMUX=0\r\n", "OK", 2000);
// 连接到华为云服务器,设置为 TCP 客户端模式
snprintf(cmd, sizeof(cmd), "AT+CIPSTART=\"TCP\",\"%s\",%s\r\n", CLOUD_SERVER_IP, CLOUD_SERVER_PORT);
ESP8266_SendCommand(cmd, "CONNECT", 5000);
}
void ESP8266_SendDataToCloud(const char* data) {
char cmd[50];
snprintf(cmd, sizeof(cmd), "AT+CIPSEND=%d\r\n", strlen(data));
ESP8266_SendCommand(cmd, ">", 2000); // 等待发送数据指令的响应
HAL_UART_Transmit(ESP8266_UART, (uint8_t*)data, strlen(data), HAL_MAX_DELAY);
HAL_UART_Transmit(ESP8266_UART, (uint8_t*)"\r\n", 2, HAL_MAX_DELAY);
ESP8266_SendCommand("", "SEND OK", 2000);
}
void ESP8266_SendCommand(const char* cmd, const char* ack, uint16_t timeout) {
uint8_t temp_buffer[RX_BUFFER_SIZE] = {0};
uint16_t index = 0;
uint32_t start_time = HAL_GetTick();
// 发送 AT 指令
HAL_UART_Transmit(ESP8266_UART, (uint8_t*)cmd, strlen(cmd), HAL_MAX_DELAY);
// 等待指定的响应字符串
while ((HAL_GetTick() - start_time) < timeout) {
if (HAL_UART_Receive(ESP8266_UART, &temp_buffer[index], 1, 100) == HAL_OK) {
index++;
if (strstr((char*)temp_buffer, ack) != NULL) {
return; // 收到正确响应
}
}
}
// 如果超时,处理错误
Error_Handler();
}
// main.c 调用的主函数示例
void main() {
HAL_Init();
SystemClock_Config();
ESP8266_Init(); // 初始化 ESP8266 模块
ESP8266_ConnectWiFi(); // 连接到 WiFi 网络
ESP8266_ConnectToServer(); // 建立到云服务器的 TCP 连接
while (1) {
// 发送数据
char data[] = "{\"temperature\":24.5,\"humidity\":60,\"smoke\":30,\"flame\":1}";
ESP8266_SendDataToCloud(data);
HAL_Delay(1000); // 间隔1秒发送一次
}
}
void SystemClock_Config(void) {
// 时钟配置代码
}
void Error_Handler(void) {
// 错误处理
while (1);
}
代码说明
1. ESP8266_Init:配置 ESP8266 工作模式为 STA 模式,并进行复位和检查。
2. ESP8266_ConnectWiFi:根据 Wi-Fi 名称和密码连接到指定的 Wi-Fi 网络。
3. ESP8266_ConnectToServer:设置 ESP8266 的 TCP 客户端模式,连接到指定的华为云服务器 IP 和端口。
4. ESP8266_SendDataToCloud:负责将格式化的数据发送到云端服务器。
5. ESP8266_SendCommand:发送 AT 指令并检查响应,确保每一步指令执行成功。
6.2 主函数里的项目逻辑代码
模块代码可以去网盘里下载:https://pan.quark.cn/s/145a9b3f7f53
本项目,主要包括传感器采集、数据处理、显示、报警、WiFi上传、云平台对接等功能。
以下是项目的 main.c
文件的代码框架。
#include "stm32f1xx_hal.h"
#include "sht30.h" // 写好的SHT30驱动文件
#include "mq2.h" // 写好的MQ2驱动文件
#include "flame_sensor.h" // 写好的火焰传感器驱动文件
#include "esp8266.h" // 写好的ESP8266 WiFi模块驱动文件
#include "oled_display.h" // 写好的OLED显示屏驱动文件
#include "buzzer.h" // 写好的蜂鸣器驱动文件
// 全局变量
float temperature = 0.0;
float humidity = 0.0;
float smoke_level = 0.0;
uint8_t flame_detected = 0;
void SystemClock_Config(void);
void Error_Handler(void);
// 数据采集与处理函数
void DataCollection(void) {
// 读取温湿度数据
SHT30_Read(&temperature, &humidity);
// 读取火焰传感器状态
flame_detected = FlameSensor_Read();
// 读取烟雾传感器浓度
smoke_level = MQ2_Read();
// 将数据显示在OLED上
OLED_DisplayFloat("Temp:", temperature);
OLED_DisplayFloat("Humi:", humidity);
OLED_DisplayFloat("Smoke:", smoke_level);
OLED_DisplayInt("Flame:", flame_detected);
}
// 报警判断与触发函数
void AlarmCheck(void) {
if (flame_detected || smoke_level > 100.0) { // 假设烟雾浓度超过100即报警
Buzzer_On(); // 触发蜂鸣器报警
} else {
Buzzer_Off(); // 关闭蜂鸣器
}
}
// 数据上传到云平台函数
void UploadToCloud(void) {
char data_buffer[128];
// 格式化数据
snprintf(data_buffer, sizeof(data_buffer),
"{\"temperature\":%.2f,\"humidity\":%.2f,\"smoke\":%.2f,\"flame\":%d}",
temperature, humidity, smoke_level, flame_detected);
// 使用ESP8266上传数据到华为云IOT
ESP8266_SendDataToCloud(data_buffer);
}
int main(void) {
// 初始化
HAL_Init();
SystemClock_Config();
SHT30_Init();
MQ2_Init();
FlameSensor_Init();
OLED_Init();
Buzzer_Init();
ESP8266_Init();
while (1) {
DataCollection(); // 数据采集
AlarmCheck(); // 报警检测与触发
UploadToCloud(); // 上传数据到云端
HAL_Delay(1000); // 1秒采集一次数据
}
}
void SystemClock_Config(void) {
// 系统时钟配置代码
}
void Error_Handler(void) {
// 错误处理代码
while (1);
}
6.3 代码逻辑说明
1. 初始化:包含各传感器、OLED显示屏、蜂鸣器和WiFi模块的初始化。
2. 数据采集 (
DataCollection
):依次读取温湿度、火焰状态和烟雾浓度,并在OLED屏上实时显示。3. 报警检测 (
AlarmCheck
):根据火焰状态和烟雾浓度判断是否触发蜂鸣器报警。4. 数据上传 (
UploadToCloud
):将采集的数据格式化成 JSON,通过ESP8266上传到华为云IoT平台。5. 主循环:每1秒采集一次数据,检测是否报警,并上传数据。
七、总结
本项目设计并实现一个基于STM32F103RCT6微控制器的智能火灾感知系统,该系统通过集成多种传感器来实时监测室内环境参数,并在检测到潜在火灾危险时及时发出警报。系统主要由以下几部分组成:温湿度传感器(SHT30)、火焰传感器、烟雾传感器(MQ2)、蜂鸣器报警装置、OLED显示屏以及Wi-Fi模块(ESP8266)。当系统检测到异常情况如高温、明火或烟雾浓度超标时,会立即触发本地声光报警,并通过ESP8266 Wi-Fi模块将数据上传至华为云IoT平台。此外,为了提高系统的便捷性和用户体验,还开发了一款配套的Android手机应用程序,允许用户远程监控家庭环境状态,并接收即时的火灾报警信息。
该火灾感知系统不仅能够提供准确可靠的环境监测服务,还能利用物联网技术实现远程管理和控制,显著提升了家庭的安全防护能力。通过结合云端服务器和移动应用的支持,用户无论身处何地都能随时了解家中状况,从而有效预防和应对火灾风险。此项目展示了智能家居与物联网技术相结合所带来的巨大潜力,为构建更加安全舒适的居住环境提供了有效的解决方案。