文章目录
一、前言
1.1 项目介绍
【1】项目开发背景
在当今工业自动化和智能化迅速发展的背景下,仓储系统作为物流和供应链管理中的关键环节,其环境安全与智能监控显得尤为重要。工业仓库常常储存大量易燃、易爆、易腐蚀或对环境要求严格的物资,一旦发生温湿度异常、气体泄漏或火灾等突发事件,将可能导致巨大经济损失甚至人员伤亡。因此,构建一个实时、高效、智能的仓库环境监控系统,成为工业信息化管理的重要组成部分。
传统的仓库环境监控方式多依赖人工巡检和基础报警装置,不仅效率低下,且响应速度慢,无法满足现代仓储对安全性、实时性和智能化的要求。尤其在大型工业园区和分布式仓储中心,传统方式难以实现集中管理与远程监控,严重制约了企业的数字化发展进程。因此,需一种低成本、模块化、高集成度的环境智能监控系统,以实现对仓储环境的全面感知、智能响应和远程管理。
本项目以STM32F103C8T6单片机为核心控制器,结合温湿度、烟雾、火焰及有害气体等多种传感器,搭建一个可实时采集环境数据的智能感知系统。系统配备ESP8266 WiFi模块,通过MQTT协议将数据上传至华为云物联网平台,支持远程监控和历史数据分析。同时,结合本地LCD显示与风扇控制、蜂鸣器报警等执行模块,实现对异常情况的快速响应与联动控制。上位机软件则采用Qt5开发,提供图形化界面,便于操作人员实时查看数据和分析环境变化趋势。
本设计不仅具有较强的实用性与可扩展性,还符合当前工业4.0和智能制造的发展方向,能够有效提升仓库管理的智能化水平,为实现安全、高效、绿色的仓储环境提供坚实的技术保障。
【2】设计实现的功能
(1)实时监测仓库环境参数:通过传感器采集温度、湿度、烟雾浓度、火焰信号和有害气体(如甲醛、氨气等)浓度,实现对仓库环境的全面感知。
(2)本地LCD屏幕显示环境信息:通过1.44寸TFT LCD液晶屏实时显示当前的温湿度、烟雾浓度、气体泄漏等关键数据,便于现场人员查看。
(3)环境异常自动报警与风扇联动控制:当检测到温度过高、烟雾超标、火焰出现或气体泄漏时,系统自动触发蜂鸣器报警,并控制继电器启动风扇,进行通风处理。
(4)WIFI无线通信与数据上云:通过ESP8266模块将采集到的环境数据通过MQTT协议实时上传至华为云IoT平台,支持远程数据监控。
(5)支持上位机环境监控平台:通过Qt5 + C++开发上位机软件,接收和显示来自仓库端的实时数据,并提供历史数据查询与分析功能,辅助管理人员进行环境评估和决策。
【3】项目硬件模块组成
(1)主控模块:STM32F103C8T6单片机,用于协调各传感器的数据采集、逻辑控制与通信处理。
(2)温湿度检测模块:SHT30数字温湿度传感器,采用I2C通信接口,实现精准环境温湿度测量。
(3)烟雾检测模块:MQ2气体传感器,通过模拟信号输出监测烟雾浓度,用于火灾预警。
(4)火焰检测模块:红外火焰传感器,输出高低电平信号,用于检测火源存在。
(5)有害气体检测模块:MQ135空气质量传感器,输出模拟信号,用于检测空气中的有害气体如甲醛、氨气等。
(6)通信模块:ESP8266 WiFi模块,通过串口通信与STM32连接,采用MQTT协议将数据上传至华为云IoT平台。
(7)显示模块:1.44寸TFT LCD液晶屏,SPI接口,用于本地显示各项环境参数数据。
(8)风扇控制模块:继电器驱动电路,控制12V直流风扇,实现自动通风功能。
(9)报警模块:高电平触发的有源蜂鸣器,用于在检测到环境异常时发出声响警报。
(10)上位机软件支持模块:PC端通过串口或WiFi接收数据,配合Qt5 + C++开发的可视化界面进行数据展示与分析。
【4】设计意义
随着工业自动化水平的不断提高,仓库作为生产和物流环节中的重要组成部分,其环境安全问题越来越受到重视。温湿度、烟雾、火焰及有害气体等环境因素直接关系到仓库存储物品的质量安全,尤其是对一些易燃易爆、易腐蚀物品的存储而言,环境监控显得尤为关键。因此,设计一套基于STM32的工业仓库环境智能监控系统,不仅能有效提升环境数据的感知能力,还能实现对潜在风险的及时预警和联动控制,保障仓库环境的稳定和安全。
本设计采用多种环境传感器,实现了对温湿度、烟雾浓度、火焰及空气质量的实时监测,结合继电器驱动风扇进行主动通风处理,并配备有源蜂鸣器实现本地报警,从而提升了系统的响应速度与应急处理能力。通过本地LCD显示模块,工作人员可以随时掌握环境状态,无需依赖额外设备,大大提高了现场工作的便捷性与效率。
此外,系统通过ESP8266模块实现了数据的远程无线传输,采用MQTT协议将环境数据上传至华为云物联网平台,为远程实时监控和历史数据分析提供了技术支持。管理人员无需亲临现场即可通过上位机平台查看仓库的环境变化情况,从而为科学决策和故障预防提供依据。
整体而言,本项目的设计紧贴实际需求,方案成熟可靠,硬件结构清晰,成本可控,具有良好的实用性和推广价值。它不仅体现了物联网与嵌入式技术在工业环境安全中的融合应用,也为后续智能仓储系统的发展提供了有益的技术参考。
【5】市面上同类产品研究现状
工业仓库的环境监控是保障物资安全、防止火灾爆炸、确保作业环境舒适的关键环节。随着物联网(IoT)、传感器技术和边缘计算的发展,此类系统正朝着智能化、网络化、集成化的方向快速演进。STM32系列微控制器因其高性能、低功耗、丰富外设和成熟的生态系统,成为此类嵌入式系统的主流选择。
国内研究现状与典型案例
海尔智能仓储环境监控系统:
- 案例描述: 海尔在其大型物流仓库中部署了基于传感器网络的智能环境监控系统。系统集成了温湿度传感器(类似SHT30)、烟雾探测器(类似MQ2)、可燃气体探测器(类似MQ135)以及视频监控。数据通过ZigBee/WiFi(如ESP8266)汇聚到网关(常采用高性能STM32F4/F7系列),再上传至私有云平台。系统实现了实时监控、阈值报警、自动通风(风机控制)和消防联动。上位机平台提供可视化展示和数据分析。
- 与您设计的关联: 核心功能(监测、报警、通风、联网、上位机)高度一致。海尔方案可能更复杂(如集成视频、多节点组网),采用更高性能STM32作为网关,但底层传感节点很可能使用类似STM32F1/C8T6级别的MCU。使用WiFi和云平台(私有云 vs 华为云)是共同点。
- 异同点: 海尔系统规模更大、集成度更高(可能包含RFID、AGV调度等),成本也更高。您的设计更侧重于经济型、模块化的单点/小型仓库解决方案,直接使用ESP8266+STM32F103C8T6完成传感、处理、通信。
京东“亚洲一号”智能物流园环境监控:
- 案例描述: 京东的标杆性智能仓库广泛部署了环境感知系统。除了基础的温湿度、烟雾、气体监测,还特别关注库区内的粉尘浓度(对精密电子产品尤为重要)和特定区域(如冷库、电池存储区)的环境参数。系统采用工业级传感器,数据通过工业以太网或无线网络(含WiFi)传输到中央监控室和云端(京东云)。上位机系统基于Web技术开发,提供大屏可视化和智能预警。
- 与您设计的关联: 核心监测参数(温湿度、烟雾、有害气体)相同,强调报警和联网(云+上位机)。上位机进行数据可视化与分析是共同目标。
- 异同点: 京东系统规模庞大,采用更昂贵的工业级传感器和网络设备(如工业以太网交换机),侧重于高可靠性和与整个物流自动化系统的深度集成。您的设计更轻量级,使用消费/工规级传感器和成本更优的WiFi模块(ESP8266),适合中小型仓库。
基于华为云IoT的中小企业仓库监控方案 (如:某正泰电器区域仓库):
- 案例描述: 众多方案提供商(如一些物联网初创公司或集成商)为中小企业仓库提供基于STM32+华为云IoT平台的标准化环境监控解决方案。典型配置包括STM32F1/F4主控、各类模拟/数字传感器、ESP8266/ESP32 WiFi模块、继电器控制通风/报警设备。数据通过MQTT协议上报华为云IoT,用户可通过手机App或简易Web上位机查看实时数据和报警信息,部分支持历史数据查询。
- 与您设计的关联: 这是与您设计最接近的案例! 核心硬件架构(STM32F1 + SHT30 + MQ2/MQ135 + 火焰传感器 + ESP8266 + 继电器/蜂鸣器 + LCD)、通信协议(MQTT)、云平台(华为云IoT)、核心功能(监测、报警、通风、远程查看)几乎完全一致。上位机可能更偏向于轻量级Web或App。
- 异同点: 商业方案通常提供更完善的云端规则引擎(处理复杂报警逻辑)、设备管理、OTA升级功能。您的设计采用了本地LCD显示和计划使用Qt开发更强大的PC上位机,这在本地交互和深度数据分析上可能更具优势。
国内趋势总结:
- 普及化与云化: 环境监控已成为现代化智能仓库的标配,上云(华为云、阿里云、腾讯云等)是主流趋势。
- 国产化与成本优化: 大量采用国产MCU(如STM32替代)、传感器模块(如炜盛科技的MQ系列)和通信模块(ESP系列),降低成本,推动在中小企业应用。
- 集成化: 环境监控系统越来越多地与安防(视频)、消防、能源管理、仓储管理系统(WMS)集成。
- 智能化: 开始引入简单的AI算法进行异常模式识别(如基于历史数据的温湿度预测、烟雾误报过滤)。
国外研究现状与典型案例
西门子仓库环境与能源管理系统 (如:西门子安贝格工厂内部物流):
- 案例描述: 西门子在其先进的工厂和为客户提供的解决方案中,将环境监控深度整合到其工业自动化体系(如基于SIMATIC控制器)。系统使用高精度、高可靠性的工业传感器(如Siemens自己的或Honeywell、Vaisala品牌),通过PROFINET或工业无线网络传输数据到SCADA系统(如WinCC)和MindSphere工业云平台。分析功能强大,可与楼宇管理系统(BMS)联动,实现精细化的环境控制和能源优化。
- 与您设计的关联: 目标一致(保障环境安全),都包含传感、联网、上位机分析。自动控制(通风)也是共同点。
- 异同点: 西门子方案是重型工业级方案,成本高昂,采用专属协议(PROFINET)和高端PLC/控制器,传感器精度和可靠性要求极高,云端平台(MindSphere)功能复杂。您的设计是轻量级、基于开放协议(MQTT)和通用MCU(STM32)的经济型方案。
亚马逊物流中心环境监控 (Kiva系统集成):
- 案例描述: 亚马逊庞大的物流网络对其仓库环境有严格要求,特别是温控区域(如生鲜、药品)。其系统高度自动化,环境传感器数据被集成到庞大的中央控制系统(AWS IoT Core是其核心技术栈之一)。数据用于实时监控、触发HVAC系统调节、确保机器人(Kiva/新形态)工作环境安全,并通过AWS服务进行大数据分析预测维护和优化能耗。
- 与您设计的关联: 都强调环境监测对仓储安全的重要性,都使用云平台(AWS vs 华为云)进行数据汇聚和分析。
- 异同点: 亚马逊系统规模巨大,深度依赖AWS生态系统,与机器人自动化系统紧密耦合。其传感器网络可能更复杂(如分布式温度监测网格)。您的设计是独立、专注环境监控本身的基础系统。
罗克韦尔自动化 FactoryTalk 智能传感器方案:
- 案例描述: 罗克韦尔提供支持IO-Link通信协议的智能传感器(包括温湿度、气体、压力等)和配套的网关、软件(FactoryTalk Hub)。这些传感器将原始数据和处理后的信息通过IO-Link发送到网关(可能基于ARM处理器,性能类似STM32F4/H7),再通过以太网/MQTT上传至SCADA或云平台。优势在于简化布线、远程配置诊断、获取更丰富数据。
- 与您设计的关联: 最终目标相似(环境监控联网化),都涉及传感器数据采集、边缘处理/网关、云/上位机连接。
- 异同点: 罗克韦尔方案强调智能传感器和IO-Link工业通信协议,提高了数据质量和可管理性,但传感器和协议成本显著高于您设计中使用的模拟/简单数字传感器和直接I2C/ADC读取方式。您的设计更注重成本效益和通用性。
国外趋势总结:
- 工业4.0/IIoT驱动: 环境监控作为IIoT的重要应用场景,深度融入数字化工厂架构。
- 强调开放标准与互操作性: OPC UA, MQTT, IO-Link等开放标准被广泛采用,促进不同厂商设备集成。
- 边缘智能: 在网关上或智能传感器端进行更多数据预处理、滤波和本地决策,减少云端负担和延迟。
- 预测性维护与高级分析: 利用云端大数据和AI/ML技术,对环境系统设备(如风机、传感器本身)进行健康状态监测和预测性维护,并优化环境控制策略。
结论:
国内外在工业仓库环境智能监控领域的研究和应用已相当深入,大型企业和工业自动化巨头主导着高端、集成化的解决方案。同时,基于通用MCU(如STM32)、标准传感器、WiFi模块和公有云平台(如华为云IoT、AWS IoT Core)的经济型方案,因其成本优势和快速部署能力,在国内中小企业市场得到了广泛应用和推广。
您的设计方案精准定位在这一经济实用的细分市场,采用了经过验证的主流技术和组件(STM32F103C8T6, SHT30, MQ系列, ESP8266, MQTT, 华为云IoT),并兼顾了本地显示(LCD)和深度远程分析(Qt上位机)的需求,具备较高的实用价值和市场潜力。其核心价值在于以较低的成本实现工业仓库环境监控的关键功能闭环,符合当前国内中小企业智能化升级的需求趋势。
【6】摘要
本项目设计并实现了一种基于STM32F103C8T6单片机的工业仓库环境智能监控系统,在实现对仓库内部温湿度、烟雾、火焰以及有害气体等环境参数的实时监测与异常处理。系统通过SHT30、MQ2、火焰传感器及MQ135等传感器采集环境数据,利用继电器控制风扇通风并通过蜂鸣器进行声光报警。当环境参数异常时,系统可自动触发报警机制并联动风扇进行应急处理。同时,借助ESP8266 WiFi模块,系统将监测数据通过MQTT协议上传至华为云物联网平台,实现远程环境监控与数据分析。上位机采用Qt5与C++开发,提供友好的可视化界面用于数据查看和历史记录管理。此外,系统配备本地LCD屏幕用于环境信息显示。该系统具有响应速度快、功能完整、部署灵活、可扩展性强等优点,适用于各类工业仓库的环境安全监测需求。
关键字:
STM32;环境监控;仓库安全;物联网;MQTT;ESP8266;华为云;温湿度;烟雾检测;火焰报警
1.2 设计思路
本项目的设计思路围绕“实时监测、智能响应、远程传输、可视化显示”四个核心目标展开,采用模块化设计方法,将环境采集、控制执行、通信传输和人机交互等功能分别划分为独立模块,并通过主控芯片STM32F103C8T6进行统一协调与管理。
在环境参数采集方面,系统选用了具有代表性的传感器:SHT30用于温湿度测量,MQ2用于烟雾检测,红外火焰传感器用于火源识别,MQ135用于有害气体浓度检测。这些传感器通过I2C或模拟信号与STM32连接,实现多源数据的高效采集。主控芯片周期性读取传感器数据并进行逻辑判断,一旦某项参数超过设定阈值,即触发异常处理机制。
在响应控制部分,系统设置了蜂鸣器和风扇两个执行装置。当检测到烟雾、火焰或有害气体浓度异常时,系统立即启动蜂鸣器发出警报,同时控制继电器驱动风扇运行,以进行环境通风和应急处理。这种本地联动响应机制确保了在断网或延迟情况下,系统仍具备快速处理能力。
为实现远程监控功能,系统集成了ESP8266 WiFi模块,采用MQTT协议将采集到的环境数据上传至华为云物联网平台。该方案具备通信效率高、协议轻量级、易于部署等优势,能够实现对多个仓库的集中监控和远程数据管理。
在人机交互方面,系统通过1.44寸TFT LCD显示屏将当前的环境参数信息实时呈现在现场人员面前,方便快速了解仓库状态。同时,配套的PC端上位机软件基于Qt5与C++开发,提供图形化界面,能够实时接收和展示数据,并支持历史数据浏览与分析,进一步提升了系统的智能化水平与管理效率。
整体而言,本项目采用分层控制、模块集成的设计方式,确保系统运行稳定、功能协同、扩展便捷,具有良好的工程实用性与开发参考价值。
1.3 系统功能总结
功能类别 | 具体功能描述 | 对应模块与器件 |
---|---|---|
环境数据采集 | 实时采集温度与湿度数据 | SHT30数字温湿度传感器(I2C) |
烟雾检测 | 检测仓库内部烟雾浓度,用于火灾预警 | MQ2烟雾传感器(模拟信号) |
火焰检测 | 通过红外识别火焰是否存在,判断是否发生明火 | 红外火焰传感器(高低电平输出) |
有害气体检测 | 检测空气中有害气体浓度(如甲醛、氨气等) | MQ135气体传感器(模拟信号) |
本地报警 | 检测到异常环境数据后启动蜂鸣器进行报警提醒 | 高电平触发有源蜂鸣器 |
自动通风控制 | 报警时自动启动风扇进行通风排气 | 继电器 + 12V直流风扇 |
数据本地显示 | 将实时温湿度、烟雾、火焰、气体状态显示在LCD屏上 | 1.44寸TFT LCD液晶屏(SPI接口) |
无线数据上传 | 将采集到的数据通过WiFi模块上传至华为云IoT平台 | ESP8266 WiFi模块 + MQTT协议 |
云端远程监控 | 管理人员可通过云平台远程查看实时与历史环境数据 | 华为云IoT平台 |
上位机交互平台 | 上位机软件支持数据接收、展示、历史分析和报警提示 | Qt5 + C++ 开发的可视化上位机程序 |
1.4 开发工具的选择
【1】设备端开发
硬件设备端的开发主要依赖于C语言,利用该语言直接操作硬件寄存器,确保系统运行的高效性和低延迟。C语言在嵌入式开发中具有广泛的应用,它能够直接访问硬件,满足对资源消耗和响应速度的严格要求。为了编写高效、稳定的代码,开发工具选择了Keil uVision 5作为主要的开发环境。Keil是一个专业的嵌入式开发工具,广泛应用于基于ARM架构的微控制器(如STM32)开发。Keil提供了完善的调试、编译和仿真支持,能够帮助在软件开发过程中高效地进行调试、单步执行以及断点设置,确保开发的稳定性和高效性。
STM32F103RCT6是项目中使用的主控芯片,它基于ARM Cortex-M3架构,拥有强大的计算能力和丰富的外设接口。在硬件编程中,寄存器级编程是常用的方式,这要求开发者对芯片的硬件寄存器有深入的理解。在Keil环境中,通过STM32的寄存器直接控制GPIO、ADC、I2C、SPI等硬件接口,以满足各个硬件模块(如传感器、执行器、显示屏等)与主控芯片的交互。使用寄存器编程能够提供更高效、精确的控制,避免了外部库的开销,同时也能深入调控硬件特性,提升系统性能。
【2】上位机开发
本项目的上位机开发基于Qt 5框架,使用**C++**作为主要编程语言。Qt是一个跨平台的应用开发框架,广泛用于开发GUI应用程序。Qt提供了丰富的GUI组件和工具,能够高效地实现图形界面的设计与开发。C++则作为Qt的底层语言,具有高效的性能和良好的控制力,非常适合用于处理设备与系统之间的数据交互、通信协议的实现和复杂的计算任务。在项目中,Qt被用于开发Windows平台的桌面应用程序以及Android平台的手机APP。Qt框架的跨平台特性使得开发者能够使用同一套代码在不同操作系统上进行构建和部署,大大提高了开发效率。
为了方便开发和调试,上位机的开发采用了Qt Creator作为主要的集成开发环境(IDE)。Qt Creator是一款由Qt官方提供的开发工具,专为Qt应用程序开发设计,支持C++、QML和JavaScript等语言。Qt Creator提供了丰富的功能,如代码编辑、调试、构建、版本控制集成等,能够显著提升开发者的生产力。在本项目中,Qt Creator为开发者提供了自动化构建、界面设计工具(如Qt Designer)和调试工具(如QDebug和QML调试工具),使得开发过程更加高效和流畅。
上位机与硬件设备端的通信采用了基于TCP/IP协议的数据传输方式。为了实现这一功能,Qt提供了丰富的网络编程支持,尤其是QTcpSocket和QTcpServer类,使得上位机能够轻松地与硬件设备建立TCP连接,进行数据收发。上位机通过WIFI连接ESP8266-WIFI模块,ESP8266模块创建TCP服务器,上位机应用则作为客户端连接到服务器,进行实时的数据传输与控制命令的下发。
为了满足不同用户的需求,本项目需要支持Windows平台的桌面应用和Android平台的移动APP。Qt的跨平台特性使得开发人员能够在一个代码库下完成多平台应用的开发和移植。开发者仅需要编写一次应用逻辑和用户界面,就可以通过Qt的跨平台构建工具生成Windows和Android两个平台的可执行文件。此外,Qt提供了丰富的文档和社区支持,帮助开发者解决平台差异和兼容性问题,确保应用在不同平台上都能稳定运行。
总体而言,上位机开发环境采用了Qt 5框架和C++语言,结合Qt Creator集成开发环境,提供了一个高效、稳定、跨平台的开发工具链。通过Qt强大的GUI设计、网络通信、多线程支持以及数据库管理功能,开发者能够轻松实现与硬件设备的交互、控制设备、处理传感器数据,并为用户提供直观、流畅的操作体验。
1.5 模块的技术详情介绍
【1】ESP8266-WIFI模块
ESP8266-WIFI模块是一款功能强大的WiFi通信模块,广泛应用于物联网(IoT)设备中。它由Espressif Systems公司设计,并且由于其低功耗、较小的体积和较低的成本,成为了许多智能硬件项目的首选通信模块。ESP8266不仅具备WiFi无线连接功能,还具有较高的处理能力和丰富的接口资源,使其成为实现无线通信的理想选择。
ESP8266模块内置了一个完整的WiFi栈,可以直接作为WiFi客户端或AP(Access Point)工作,支持无线网络的连接、数据传输等多种功能。在设计中,ESP8266支持多种网络协议,最常见的是TCP/IP协议,允许设备与外部服务器或移动应用进行数据交换。其强大的功能使得它不仅可以连接到传统的路由器,还可以直接创建一个WiFi热点,支持设备与手机或其他WiFi设备的通信。
在硬件设计中,ESP8266模块的另一大优势是其与微控制器的高兼容性。模块通常通过串口(UART)与主控芯片进行通信,因此可以方便地与各种微控制器(如STM32、Arduino等)连接,进行数据传输。在本项目中,ESP8266模块通过串口与STM32单片机相连接,负责将本地采集的健康数据上传到Android手机APP中。数据传输采用的是TCP/IP协议,保证了通信的稳定性和可靠性。
ESP8266模块的低功耗特性也使其适用于嵌入式系统和移动设备中,尤其是在电池供电的项目中,能够有效延长设备的使用时间。通过合理的睡眠模式和待机模式,ESP8266能够在无需频繁通信时降低功耗,从而优化系统的能源使用。
ESP8266-WIFI模块因其高集成度、低成本、强大的WiFi功能及广泛的兼容性,成为了物联网领域中一个不可或缺的通信模块。它不仅为各种嵌入式系统提供了便捷的无线网络连接方案,还极大简化了开发过程,使得开发者能够专注于核心功能的实现。本项目采用ESP8266模块,便捷地实现了STM32与Android手机APP之间的实时数据传输,为健康检测仪提供了可靠的无线通信能力。
【2】MQ135传感器
MQ135气体传感器是一款常用于空气质量检测的模拟型传感器模块,能够检测多种有害气体的存在与浓度,包括氨气(NH₃)、硫化物(如H₂S)、苯蒸气、烟雾、酒精、甲醛(HCHO)、二氧化碳(CO₂)等。由于其灵敏度高、响应速度快、使用方便,广泛应用于空气净化器、环境监测仪、智能家居及工业安全系统中。
该模块的核心元件是MQ135气敏电阻,其内部由氧化锡(SnO₂)为敏感材料组成。当目标气体浓度增加时,传感器内部的电导率会发生变化,从而在输出端产生相应的电压变化。模块一般带有模拟电压输出(AO),有些版本还配有数字比较电路和可调电位器,可通过DO引脚输出高低电平信号,用于阈值判断。
MQ135的工作电压通常为5V,预热时间较长(一般为24~48小时),这对于其稳定性和准确性有重要影响。在使用过程中,建议搭配STM32等微控制器的ADC模块读取其模拟输出电压,然后结合校准公式或查表方式换算出相对气体浓度值。由于传感器对温度和湿度较敏感,因此建议在使用时进行环境补偿或通过多点校准提高精度。
MQ135气体传感器具有成本低、应用灵活、支持多种有害气体检测的优点,非常适合用于本项目的工业仓库空气质量监控场景,能够在第一时间发现有害气体泄漏,为环境安全提供有效保障。
【3】SHT30模块
SHT30数字温湿度传感器是一款高精度、稳定性强的环境温湿度检测传感器模块,广泛应用于气象监测、智能家居、工业自动化等领域。该传感器由Sensirion公司设计,集成了温度和湿度测量功能,并内置数字信号处理电路,直接输出数字化测量数据,极大地简化了与微控制器的接口设计。
SHT30采用I2C通信接口,支持标准的I2C协议,方便与STM32等主控芯片连接。其测量范围宽泛,温度测量范围一般为-40℃至+125℃,湿度测量范围为0%RH至100%RH,且测量精度高,温度误差通常在±0.3℃左右,湿度误差约为±2%RH,满足工业级环境监测需求。传感器响应速度快,具备自我校准功能,保证了数据的准确性和稳定性。
该模块内部还集成了防干扰电路和补偿算法,有效抵抗环境干扰,保证测量数据的可靠性。同时,SHT30传感器功耗低,适合长期在线监测使用。通过读取其数字寄存器中的数据,主控芯片可以方便地获取温湿度值,无需复杂的模拟信号处理,提高系统整体的设计效率和稳定性。
SHT30数字温湿度传感器模块凭借其高精度、数字输出、易集成的特点,是工业仓库环境智能监控系统中实现温湿度实时监测的理想选择,为保障仓库环境的安全与稳定提供了坚实的传感技术支持。
1.6 华为云服务器的属性
本项目中上传到华为云物联网平台的属性字段应涵盖所有关键的环境监测数据和系统状态信息,确保云端能够完整、准确地展示与分析仓库当前环境状况。
上传到华为云的属性字段(字段名及类型):
- temperature(float)
当前温度值(单位:℃),来自SHT30温湿度传感器。 - humidity(float)
当前相对湿度值(单位:%RH),来自SHT30传感器。 - smoke_level(int 或 float)
烟雾浓度等级或模拟值,来自MQ2传感器。 - gas_level(int 或 float)
有害气体浓度等级或模拟值,来自MQ135传感器。 - flame_detected(bool 或 int)
火焰检测状态,0表示未检测到火焰,1表示检测到火焰(来自红外火焰传感器的数字信号)。 - fan_status(bool 或 int)
风扇运行状态,0表示关闭,1表示已启动(继电器控制状态)。 - buzzer_status(bool 或 int)
蜂鸣器状态,0表示关闭,1表示报警中。 - alarm_status(int)
报警状态码,用于表示报警原因(例如:0=正常,1=温湿度超限,2=烟雾报警,3=火焰报警,4=气体泄漏等)。 - timestamp(string 或 long)
数据采集时间戳,建议统一采用UTC格式,便于云端记录与分析历史数据。
可选扩展字段:
- device_id(string):设备编号,便于云端识别多个监控终端。
- signal_strength(int):WiFi信号强度,用于监控通信质量。
这些字段可根据华为云IoT平台的设备模型(产品模型)进行定义与映射,通过MQTT协议定期或实时上报。字段名称可自定义,但需在设备产品建模阶段统一设定,并与STM32端代码保持一致。上传格式通常为JSON格式的数据结构,例如:
{
"temperature": 25.3,
"humidity": 60.5,
"smoke_level": 220,
"gas_level": 180,
"flame_detected": 0,
"fan_status": 1,
"buzzer_status": 1,
"alarm_status": 2,
"timestamp": "2025-06-26T21:15:00Z"
}
二、部署华为云物联网平台
华为云官网: https://www.huaweicloud.com/
打开官网,搜索物联网,就能快速找到 设备接入IoTDA
。
2.1 物联网平台介绍
华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。
使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。
物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。
设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。
业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。
2.2 开通物联网服务
地址: https://www.huaweicloud.com/product/iothub.html
开通免费单元。
点击立即创建
。
正在创建标准版实例,需要等待片刻。
创建完成之后,点击详情。 可以看到标准版实例的设备接入端口和地址。
下面框起来的就是端口号
和域名
点击实例名称,可以查看当前免费单元
的配置情况。
开通之后,点击接入信息
,也能查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。
总结:
端口号: MQTT (1883)| MQTTS (8883)
接入地址: dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com
根据域名地址得到IP地址信息:
打开Windows电脑的命令行控制台终端,使用ping
命令。ping
一下即可。
Microsoft Windows [版本 10.0.19045.5011]
(c) Microsoft Corporation。保留所有权利。
C:\Users\Lenovo>ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com
正在 Ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44
117.78.5.125 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 37ms,最长 = 37ms,平均 = 37ms
C:\Users\Lenovo>
MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口合适
。
2.3 创建产品
链接:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product?instanceId=03c5c68c-e588-458c-90c3-9e4c640be7af
(1)创建产品
(2)填写产品信息
根据自己产品名字填写,下面的设备类型选择自定义类型。
(3)产品创建成功
创建完成之后点击查看详情。
(4)添加自定义模型
产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。
模型简单来说: 就是存放设备上传到云平台的数据。
你可以根据自己的产品进行创建。
比如:
烟雾可以叫 MQ2
温度可以叫 Temperature
湿度可以叫 humidity
火焰可以叫 flame
其他的传感器自己用单词简写命名即可。 这就是你的单片机设备端上传到服务器的数据名字。
先点击自定义模型。
再创建一个服务ID。
接着点击新增属性。
2.4 添加设备
产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。
(1)注册设备
(2)根据自己的设备填写
(3)保存设备信息
创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。
(4)设备创建完成
(5)设备详情
2.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/663cb18871d845632a0912e7_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/663cb18871d845632a0912e7_dev1/sys/properties/report
发布主题时,需要上传数据,这个数据格式是JSON格式。
上传的JSON数据格式如下:
{
"services": [
{
"service_id": <填服务ID>,
"properties": {
"<填属性名称1>": <填属性值>,
"<填属性名称2>": <填属性值>,
..........
}
}
]
}
根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。
根据这个格式,组合一次上传的属性数据:
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}
2.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服务器地址:117.78.5.125
华为云的MQTT端口号:1883
如何得到IP地址?如何域名转IP? 打开Windows的命令行输入以下命令。
ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
(2)生成MQTT三元组
华为云提供了一个在线工具,用来生成MQTT鉴权三元组: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。
下面是打开的页面:
填入设备的信息: (上面两行就是设备创建完成之后保存得到的)
直接得到三元组信息。
得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。
ClientId 663cb18871d845632a0912e7_dev1_0_0_2024050911
Username 663cb18871d845632a0912e7_dev1
Password 71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237
2.7 模拟设备登录测试
经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。
MQTT软件下载地址【免费】: https://download.csdn.net/download/xiaolong1126626497/89928772
(1)填入登录信息
打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。
(2)打开网页查看
完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。
点击详情页面,可以看到上传的数据:
到此,云平台的部署已经完成,设备已经可以正常上传数据了。
(3)MQTT登录测试参数总结
MQTT服务器: 117.78.5.125
MQTT端口号: 183
//物联网服务器的设备信息
#define MQTT_ClientID "663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define MQTT_UserName "663cb18871d845632a0912e7_dev1"
#define MQTT_PassWord "71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"
//订阅与发布的主题
#define SET_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down" //订阅
#define POST_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report" //发布
发布的数据:
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}
2.8 创建IAM账户
创建一个IAM账户,因为接下来开发上位机,需要使用云平台的API接口,这些接口都需要token进行鉴权。简单来说,就是身份的认证。 调用接口获取Token时,就需要填写IAM账号信息。所以,接下来演示一下过程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
**【1】获取项目凭证 ** 点击左上角用户名,选择下拉菜单里的我的凭证
项目凭证:
28add376c01e4a61ac8b621c714bf459
【2】创建IAM用户
鼠标放在左上角头像上,在下拉菜单里选择统一身份认证
。
点击左上角创建用户
。
创建成功:
【3】创建完成
用户信息如下:
主用户名 l19504562721
IAM用户 ds_abc
密码 DS12345678
2.9 获取影子数据
帮助文档: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": "663cb18871d845632a0912e7_dev1",
"shadow": [
{
"service_id": "stm32",
"desired": {
"properties": null,
"event_time": null
},
"reported": {
"properties": {
"DHT11_T": 18,
"DHT11_H": 90,
"BH1750": 38,
"MQ135": 70
},
"event_time": "20240509T113448Z"
},
"version": 3
}
]
}
调试成功之后,可以得到访问影子数据的真实链接,接下来的代码开发中,就采用Qt写代码访问此链接,获取影子数据,完成上位机开发。
链接如下:
https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow
三、Qt开发入门与环境搭建
当前项目的上位机是采用Qt开发的,这一章节主要是介绍Qt开发环境的安装,以及Qt开发环境入门的使用。如果你Qt没有任何基础,建议仔细看一遍。
3.1 Qt是什么?
Qt 是一个功能强大、跨平台的应用程序开发框架,主要用于创建图形用户界面(GUI)应用程序,但它不仅仅局限于GUI编程。它由挪威的奇趣科技(TrollTech)最初于1991年开发,并在后续的发展历程中经历了多次所有权变更,包括诺基亚和Digia等公司接手,现在Qt属于The Qt Company所有。
Qt 主要特点和优势包括:
(1)跨平台:Qt 支持多种操作系统,开发者可以使用同一份源代码在不同平台上编译运行,如Windows、Linux、macOS、Android以及各种嵌入式系统(如RTOS),实现“一次编写,到处编译”。
(2)C++ 开发:Qt 的核心是基于C++编程语言构建,提供了一套丰富的类库,通过面向对象的设计方式简化了开发过程。
(3)图形用户界面:Qt 提供了完整的GUI组件集,包含窗口、按钮、标签、文本框等各种标准控件,以及布局管理器、样式表等功能,使得开发者能够高效地创建美观且功能完善的桌面应用或移动应用界面。
(4)工具链完整:Qt 包含一系列集成开发环境(IDE)和辅助工具,例如Qt Creator是一个全能的跨平台IDE,Qt Designer用于可视化拖拽设计UI界面,Qt Linguist支持国际化资源文件的翻译,还有Qt Assistant和大量文档资源方便开发者的使用。
(5)非GUI功能丰富:除了GUI功能外,Qt 还提供了众多非图形化功能模块,如网络通信、数据库访问、XML处理、多媒体处理(音频视频)、文件I/O、线程与并发处理、OpenGL和3D图形渲染等。
(6)元对象系统:Qt 使用元对象系统(Meta-Object System, MOC)实现了信号与槽机制(Signals and Slots),这是一种高级事件处理机制,允许在不同对象之间安全地进行异步通信。
(7)可扩展性与灵活性:Qt 架构高度灵活,支持插件体系结构,开发者可以根据需要自定义组件并轻松地集成到Qt应用中。
Qt 以其强大的跨平台能力和全面的功能集合成为许多企业和个人开发者选择用来开发高性能、高稳定性的应用程序的重要工具之一,被广泛应用于各类桌面软件、嵌入式设备、移动应用以及服务器端组件等领域。
3.2 Qt版本介绍
在Qt发行版本中将要涉及两个版本:Qt商业授权和Qt开源授权。
(1)Qt商业授权是设计商业软件的开发环境,这些商业软件使用了传统的商业来发布,它包含了一些更新的功能、技术上的支持和大量的解决方案,开发了使用于行业的一些特定的组件,有一些特殊的功能只在商业用户中使用。
(2)Qt开源授权是用来开发开源的软件,它提供了一些免费的支持,并遵循QPL协议。
开放源代码是免费的软件,不牵涉用户的某些权益。任何人都有使用开源软件和参与它的修改的机会,这就意味着其他的人同样可获得你开发的代码。目前 Qt 的开源授权有两种,一种是 GPL 授权,另一种是 LGPL 授权。
3.3 Qt开发环境安装
Qt的中文官网: https://www.qt.io/zh-cn/
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://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
安装的时候,第一个复选框里勾选一个mingw 32
编译器即可,其他的不管默认就行,直接点击下一步继续安装。
选择MinGW 32-bit 编译器:
3.4 开发第一个QT程序
在QT开发过程中,可以手动编写代码也可以使用UI设计师直接拖拽控件的方式编写界面和布局,在实际的开发过程中一般是两种方式结合使用,提高开发效率。
本小节用一个简单的 “Hello QT” 程序介绍一下使用QtCreator新建工程的步骤。
(1)打开QtCreator软件,选择New Project,新建一个工程。
(2)项目模板选择QT Widgets Application
(3)设置项目名称和存放路径
注意:QT项目路径和名称不能出现中文字符。
(4)编译工具套件选择
编译工具套件可以后面自己增加,比如增加Android的。套件是指 Qt 程序从编译链接到运行环境的全部工具和 Qt 类库的集合。
(5)设置生成的类信息
在类信息设置界面选择基类,目前有三种基类:QMainWindow,QWidget,QDialog。在基类里选择QMainWindow,类名和文件名会根据基类自动修改,一般不需要修改,默认即可。
(6)项目管理
在项目管理界面可以设置作为子项目,以及加入版本控制系统。这两个功能暂时用不到,都用默认的 ,然后点击 “完成”。
(7)创建完成
(8) 编辑代码
展开main.cpp文件,添加内容如下:
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//MainWindow w;
//w.show();
QLabel *label =new QLabel("Hello Qt!");
label->setGeometry(400,100,100,20);
label->show();
return a.exec();
}
代码解析:
1) #include <QApplication>和 #include <QLabel>是QT的类声明头文件,对于每个QT类都有一个与该类同名的头文件,在这个头文件包含了对该类的定义。
2) main(int argc, char *argv[]) :main函数的标准写法。
3) QApplication a(argc, argv):创建一个QApplication对象,用于管理应用程序的资源,QApplication类的构造函数需要两个参数。
4) QLabel *label =new QLabel("Hello Qt!") :创建QLabel窗口部件,QLabel是一个Qt提供的窗口部件,可以用来显示一行文本。
5) label->setGeometry(400,100,100,20) : 设置控件显示的位置。
6) label->show():使Qlabel创建的窗口可见,就是显示设置的文本。
7) return a.exec():应用程序将控制权传递给QT,让程序进入消息循环。等待可能的菜单,工具条,鼠标等的输入,进行响应。
(9)行程序
运行程序可以点击左下角的三角形符号或者按下快捷键Ctrl+R。
3.5 调试输出
QT中使用QDebug类输出调试信息。主要用于调试代码,类似于std::cout的替代品,支持QT的数据类型。使用前需要包含头文件。
调试输出的分类
qDebug | 调试信息提示 |
---|---|
qWarning | 一般的警告提示 |
qCritical | 严重错误提示 |
qFatal | 致命错误提示 |
示例代码:
qDebug("调试信息输出");
qWarning("一般警告信息输出");
qCritical("严重错误输出");
qFatal("致命错误输出");
qDebug输出的信息会打印到QT软件下边的输出面板。
在上节的HelloQt工程上加上调试输出代码,增加的main.cpp代码如下:
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//MainWindow w;
//w.show();
qDebug()<<"QT调试信息输出";
int data_int=8888;
qDebug()<<data_int;
float data_float=123.888;
qDebug()<<data_float;
return a.exec();
}
运行程序,观察输出的调试信息:
3.6 QT Creator常用的快捷键
掌握一些适用的快捷键,可以提高程序开发的效率。
(1)F1 键,快速切换光标选中的函数或者类的帮助信息,按一次半屏显示,按下两次全屏显示。
(2)F2 键,快速切换到光标选中的函数或者类的源码定义处。
(3)F4键,快速在源文件和头文件之间切换。
(4)Ctrl(按住)+ Tab,快速切换已打开的文件
(5)Ctrl+ I ,缩进光标选中行代码(自动与上层代码对齐)。
(6)Ctrl + / ,快速注释或者取消注释光标选中行。
(7)快速修改全局变量名
鼠标光标选中变量名,按下Ctrl+Shift+R,当变量名称出现红色框表示已经激活全局修改功能。修改一处,整个工程对应变量名称全部会修改。修改完毕之后,光标移开,再按下Ctrl+Shift+R保存修改。
(8)快速修改全局函数名
快捷方式与变量修改一样按下Ctrl+Shift+R,一处修改整个工程对应的函数名称也会跟着改。选中函数后,按下Ctrl+Shift+R后整个工程的对应的函数名会高亮,并且在软件下方弹出修改框。
3.7 QT帮助文档
Qt 帮助文档太多,难以全部翻译成中文,即使翻译了一部分,翻译花的时间太多,翻译更新的时效性也难以保证,最终还是得看英文帮助,QtCreator 集成了帮助系统,查找非常方便。
打开QtCreator,选择菜单栏的最左边的帮助选项,界面如下:
(1)查看Qlabel控件的帮助信息:
3.8 UI设计师使用
上节的Hello QT程序使用纯C++代码编写,这一节使用QT界面设计模式实现与上一节Hello QT程序
一样的功能。仿照着上节新创建一个工程。双击打开mainwindow.ui
文件,进入到UI设计界面。
(1)拖一个Label控件到编辑区,双击Label控件可以修改文本内容。
(2)运行程序可以点击左下角的三角形符号或者按下快捷键Ctrl+R。
(3)UI设计师界面功能介绍
3.9 按钮控件组
QT Creator UI设计师界面的按钮组截图如下:
以下是对按钮组控件的一些功能介绍:
(1)Push Button按压按钮:最普通的按钮,按(点击)按钮命令计算机执行一些动作,或者回答问题,比如windows开始菜单里的重启,注销,关机等按钮。
(2)Tool Button工具按钮:工具按钮通常是一个集合,一般集成在工具栏里。比如打开,保存,复制,粘贴,剪切等常用的操作。
(3)Radio Button单选按钮:单选按钮通常是两个以上的形式出现在一块,按钮之间有互斥关系,每次只能选中一个。比如:一个人的性别只能选择一个,不能同时是男性又是女性。
(4)Check Box复选框:复选框与单选按钮概念相反,复选框通常表示多个可以同时存在的选项,比如一个人可以同时拥有多个爱好,比如读书、看电影、爬山、游泳等。
(5)Command Link Button命令链接按钮:一般用来打开的窗口或者网页链接。
(6)Dialog Button Box标准按钮盒:标准按钮盒通常用于对话框程序;比如:常见的确认对话框有 “确定”“取消”等标准按钮,Qt 将这些典型的按钮做成标准按钮盒,并将相应的信号加以封装,方便程序员使用。
3.10 布局控件组
开发一个图形界面应用程序,界面的布局影响到界面的美观。前面的程序中都是使用UI界面拖控件,如果有多个按钮,会出现大小难调整、位置难对齐等问题。Qt 提供的“布局管理“就很好的解决了控件摆放的问题。
以下是UI设计师界面的布局相关控件组:
功能介绍:
(1)Vertical Layout:垂直布局
(2)Horizontal Layout:水平布局
(3)Grid Layout:网格布局
(4)Form Layout:窗体中布局
(5)Horizontal Spacers:水平空格,在布局中用来占位。
(6)Vertical Spacer:垂直空格,在布局中用来占位。
3.11 基本布局控件
在UI设计界面添加一个布局控件,然后将需要布局的其他控件放入布局控件中即可完成布局,布局控件可以互相嵌套使用。(本节只介绍基本布局控件的使用)
以下是4种布局控件的效果:
3.12 UI设计师的布局功能
在UI设计界面的左上角有一排快捷的布局选项,使用时选中两个以上的控件,点击其中一种布局方式就可以切换布局。
以下为布局的简单示例图:
(1)为布局的选项。
(2)控件层次图,可以看到控件的布局摆放层次。
如果想要控制某个控件的固定大小,不随着布局改变大小,可以限定最大最小尺寸。选中控件鼠标右键–>大小限定->设置大小。
水平布局与垂直布局:
水平布局将控件按照水平方式摆放,垂直布局将控件按照垂直方式摆放。鼠标拖动红色布局框上的黑色方点,可以调整布局框的大小。随着布局框的尺寸变化,包含的控件高度不会变化,宽度会随着布局框变化。选中其中一个控件然后鼠标右键>点击大小限定,可以限定控件的最大和最小尺寸。
分裂器水平布局与垂直布局:
分裂器方式布局,包含控件的高度和宽度都会随着布局框的拉伸而改变。选中其中一个控件然后鼠标右键>点击大小限定,可以限定控件的最大和最小尺寸。
窗体中布局与栅格布局:
栅格(网格)布局器的基本单元是单元格,而窗体中布局(表单)的基本单元是行。随着布局框的尺寸变化,包含的控件高度不会变化,宽度会随着布局框变化。
设置主窗体布局方式:
设置主窗体的布局方式后,包含在主窗体内的控件会随着窗体的拉伸自动调整大小。
四、上位机开发
4.1 Qt开发环境安装
Qt的中文官网: https://www.qt.io/zh-cn/
QT5.12.6的下载地址:https://download.qt.io/archive/qt/5.12/5.12.6
打开下载链接后选择下面的版本进行下载:
如果下载不了,可以在网盘里找到安装包下载: 飞书文档记录的网盘地址:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
软件安装时断网安装,否则会提示输入账户。
安装的时候,第一个复选框里的编译器可以全选,直接点击下一步继续安装。
选择编译器: (一定要看清楚了)
4.2 新建上位机工程
前面2讲解了需要用的API接口,接下来就使用Qt设计上位机,设计界面,完成整体上位机的逻辑设计。
【1】新建工程
【2】设置项目的名称。
【3】选择编译系统
【4】选择默认继承的类
【5】选择编译器
【6】点击完成
【7】工程创建完成
4.3 切换编译器
在左下角是可以切换编译器的。 可以选择用什么样的编译器编译程序。
目前新建工程的时候选择了2种编译器。 一种是mingw32
这个编译Windows下运行的程序。 一种是Android
编译器,可以生成Android
手机APP。
不过要注意:Android的编译器需要配置一些环境才可以正常使用,这个大家可以网上找找教程配置一下就行了。
windows的编译器就没有这么麻烦,安装好Qt就可以编译使用。
下面我这里就选择的 mingw32
这个编译器,编译Windows下运行的程序。
4.4 编译测试功能
创建完毕之后,编译测试一下功能是否OK。
点击左下角的绿色三角形按钮
。
正常运行就可以看到弹出一个白色的框框。这就表示工程环境没有问题了。 接下来就可以放心的设计界面了。
4.5 设计UI界面与工程配置
【1】打开UI文件
打开默认的界面如下:
【2】开始设计界面
根据自己需求设计界面。
4.6 设计代码
【1】获取token
调用华为云的API都需要填token参数,先看帮助文章,了解如何获取token。
帮助文档:https://support.huaweicloud.com/api-iam/iam_30_0001.html
根据帮助文档,写完成下面代码编写:
这段代码的功能是通过华为云IAM服务获取Token,以便后续调用华为云API时使用。以下是代码的详细功能解释:
1. 设置功能标识
function_select = 3;
function_select
是一个标识变量,用于区分当前请求的功能类型。这里设置为3,表示当前请求是获取Token。
2. 构造请求URL
QString requestUrl;
QNetworkRequest request;
// 设置请求地址
QUrl url;
// 获取token请求地址
requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
.arg(SERVER_ID);
- 构造获取Token的请求URL,URL格式为:
https://iam.{SERVER_ID}.myhuaweicloud.com/v3/auth/tokens
。 SERVER_ID
是华为云服务器的区域ID(如cn-north-1
),通过QString
的arg
方法动态替换到URL中。
3. 设置请求头
// 设置数据提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));
- 设置HTTP请求头,指定请求体的数据格式为
application/json;charset=UTF-8
,表示发送的数据是JSON格式。
4. 设置请求URL
// 构造请求
url.setUrl(requestUrl);
request.setUrl(url);
- 将构造好的URL设置到
QUrl
对象中,并将其绑定到QNetworkRequest
对象。
5. 构造请求体
QString text = QString("{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":"
"{\"user\":{\"domain\": {"
"\"name\":\"%1\"},\"name\": \"%2\",\"password\": \"%3\"}}},"
"\"scope\":{\"project\":{\"name\":\"%4\"}}}}")
.arg(MAIN_USER)
.arg(IAM_USER)
.arg(IAM_PASSWORD)
.arg(SERVER_ID);
- 构造JSON格式的请求体,用于向华为云IAM服务请求Token。请求体包含以下字段:
auth
:认证信息。identity
:身份信息。methods
:认证方法,这里使用密码认证(password
)。password
:密码认证的具体信息。user
:用户信息。domain
:用户所属的域名。name
:域名名称(MAIN_USER
)。
name
:用户名(IAM_USER
)。password
:用户密码(IAM_PASSWORD
)。
scope
:请求的范围。project
:项目信息。name
:项目名称(SERVER_ID
)。
- 使用
QString
的arg
方法动态替换请求体中的变量(如MAIN_USER
、IAM_USER
等)。
6. 发送HTTP POST请求
// 发送请求
manager->post(request, text.toUtf8());
- 使用
QNetworkAccessManager
的post
方法发送HTTP POST请求。 request
是构造好的请求对象,text.toUtf8()
是将请求体转换为UTF-8编码的字节数组。
7. 总结
这段代码的核心功能是:
- 构造获取Token的HTTP请求:包括请求URL、请求头和请求体。
- 发送请求:通过
QNetworkAccessManager
发送POST请求,向华为云IAM服务请求Token。 - Token的作用:获取到的Token将用于后续调用华为云API时的身份验证。
通过这段代码,QT上位机能够获取华为云的Token,为后续的设备数据查询、控制等操作提供身份验证支持。
【2】获取影子数据
前面章节介绍了影子数据获取接口。下面是对应编写的代码:
这段代码的功能是向华为云IoT平台查询设备的属性信息(设备状态)。以下是对代码的详细功能含义解释:
代码功能含义解释:
(1)function_select = 0;
- 这行代码设置
function_select
为0,表示当前操作是查询设备属性。这个变量用于标识不同的操作,可以帮助后续根据不同的操作类型执行不同的处理逻辑。
(2)QString requestUrl; QNetworkRequest request;
requestUrl
:用于存储请求的URL地址,后续将构造一个用于查询设备属性的URL。request
:用来封装HTTP请求的对象,包含请求的所有信息,包括请求头、URL等。
(3)QUrl url;
url
:用于存储并处理请求的URL对象,确保请求使用正确的地址。
(4)构造请求URL:
requestUrl = QString("https://%1:443/v5/iot/%2/devices/%3/shadow")
.arg(IP_ADDR)
.arg(PROJECT_ID)
.arg(device_id);
这行代码构建了一个URL,用于查询设备的状态(属性)。URL包括了:
IP_ADDR:华为云IoT平台的IP地址或域名。
PROJECT_ID:项目的ID,用于区分不同的项目。
device_id:设备的唯一标识符,用于查询指定设备的属性。
:443
指定使用HTTPS协议(端口443)进行安全通信。
最终构造出的URL形如:https://<IP_ADDR>:443/v5/iot/<PROJECT_ID>/devices/<device_id>/shadow
,这是查询设备状态的API接口。
(1)request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
- 设置请求头的内容类型为
application/json
,表明请求体中的数据格式是JSON。
(2)request.setRawHeader("X-Auth-Token", Token);
- 设置请求头中的
X-Auth-Token
字段,传递身份验证令牌(Token
)。这个令牌用于验证请求的合法性,确保只有授权的用户可以查询设备的状态。
(3)url.setUrl(requestUrl);
- 将前面构建好的请求URL赋值给
url
对象,确保后续的请求使用正确的URL。
(4)request.setUrl(url);
- 将
url
对象设置到request
对象中,准备发送请求。
(5)manager->get(request);
- 使用
QNetworkAccessManager
的get
方法发送GET请求,查询设备的属性。request
中包含了URL、请求头以及Token等信息,服务器接收到请求后将返回设备的属性信息(如设备状态、属性值等)。
代码整体功能:
该代码实现了通过华为云IoT平台的API查询设备的属性信息。具体步骤包括:
- 构造查询设备属性的API请求URL。
- 设置请求头,指定数据格式为JSON,并传递Token进行身份验证。
- 使用
QNetworkAccessManager
发送GET请求,向服务器请求设备的状态数据。 - 服务器将返回设备的属性数据,供后续处理。
总结:
这段代码的功能是向华为云IoT平台查询指定设备的属性信息,并通过GET请求将设备的状态返回给客户端。通过Token进行身份验证,确保请求的合法性。
【3】解析数据更新界面
根据接口返回的数据更新界面。
【4】判断设备是否离线
这段代码用于判断设备是否离线。通过获取设备上传到服务器数据的时间与本地的系统时间差进行对比。
这段代码的核心功能是通过比较设备上传数据的时间和本地系统时间来判断设备是否处于离线状态,以下是其详细解释:
(1)功能分析
显示最新更新时间
ui->label_update_time->setText("最新时间:" + update_time);
将设备上传的最新时间 update_time
显示在界面上的 label_update_time
控件中,格式为 最新时间:yyyy-MM-dd HH:mm:ss
。
方便用户了解设备数据的最近更新时间。
获取本地当前时间
QDateTime currentDateTime = QDateTime::currentDateTime();
使用 QDateTime::currentDateTime()
获取系统当前时间,作为对比基准。
计算时间差
qint64 secondsDiff = currentDateTime.secsTo(dateTime);
secsTo
: 计算 currentDateTime
和设备上传时间 dateTime
之间的时间差(单位:秒)。
dateTime
是通过解析 JSON 数据提取到的设备数据上传时间,并已转换为本地时间格式。
判断设备状态
if (qAbs(secondsDiff) >= 5 * 60)
使用 qAbs
获取时间差的绝对值。
如果时间差超过 5 分钟(300秒),表示设备长时间未上传数据,判定为“离线”。
(2)离线处理
更新状态显示
ui->label_dev_state->setText("设备状态:离线");
在界面 label_dev_state
控件中显示设备当前状态为“离线”。
(3)在线处理
状态更新ui->label_dev_state->setText("设备状态:在线");
如果时间差小于 5 分钟,显示“设备状态:在线”。
【5】获取设备最新数据上传时间
这是解析华为云API接口返回的数据,解析出来里面设备数据的时间,进行显示。
这段代码的主要作用是解析华为云 API 返回的 JSON 数据中的设备数据时间字段,转换为本地时间格式,并最终以用户友好的标准格式输出到界面。
(1)详细代码解析
(1)提取时间字段
QString event_time = obj3.take("event_time").toString();
qDebug() << "event_time:" << event_time;
obj3.take("event_time")
:从 JSON 数据中的 reported
对象提取 event_time
字段,值为一个字符串,表示设备上传数据的时间。
toString()
:将提取的字段值转换为 QString
类型,便于后续操作。
调试输出:使用 qDebug()
输出提取的时间值,例如:20231121T120530Z
。
2. 转换为 QDateTime
对象
QDateTime dateTime = QDateTime::fromString(event_time, "yyyyMMddTHHmmssZ");
QDateTime::fromString
:
使用指定格式解析 event_time
字符串为 QDateTime
对象。
格式说明:
yyyyMMdd
: 年、月、日(如20231121
)。T
: 时间部分的分隔符(固定为T
)。HHmmss
: 时、分、秒(如120530
)。Z
: 表示时间是 UTC 时间。如果时间字符串格式不匹配,会返回一个无效的
QDateTime
对象。
3. 转换时区到本地时间
dateTime.setTimeSpec(Qt::UTC);
dateTime = dateTime.toLocalTime();
setTimeSpec(Qt::UTC)
:
- 明确告知
dateTime
对象,当前时间是 UTC 时间。 - 确保时间转换准确,避免因为默认时区不明确导致的误差。
toLocalTime()
:
- 将时间从 UTC 转换为本地时区时间,例如中国标准时间(CST, UTC+8)。
4. 格式化输出为标准时间字符串
QString update_time = dateTime.toString("yyyy-MM-dd HH:mm:ss");
toString()
:将 QDateTime
转换为指定格式的字符串。
格式说明:
yyyy-MM-dd
: 年-月-日。HH:mm:ss
: 小时:分钟:秒。
示例结果:2023-11-21 20:05:30
。
用户显示友好性:转换后的格式易读,符合国际通用的日期时间表示规范。
(2)代码运行效果
假设 API 返回的时间字段值为 20231121T120530Z
。
转换流程:
- 解析为
QDateTime
对象:2023-11-21 12:05:30 (UTC)
; - 转换为本地时间:
2023-11-21 20:05:30 (CST)
。 - 格式化输出:
"2023-11-21 20:05:30"
。
输出到界面时,显示为:
最新时间: 2023-11-21 20:05:30
4.5 编译Windows上位机
点击软件左下角的绿色三角形按钮进行编译运行。
4.6 配置Android环境
如果想编译Android手机APP,必须要先自己配置好自己的Android环境。(搭建环境的过程可以自行百度搜索学习)
然后才可以进行下面的步骤。
【1】选择Android编译器
选择编译器。
切换编译器。
【2】创建Android配置文件
创建完成。
【3】配置Android图标与名称
根据自己的需求配置 Android图标与名称。
【3】编译Android上位机
Qt本身是跨平台的,直接选择Android的编译器,就可以将程序编译到Android平台。
然后点击构建。
成功之后,在目录下可以看到生成的apk
文件,也就是Android手机的安装包,电脑端使用QQ
发送给手机QQ,手机登录QQ接收,就能直接安装。
生成的apk
的目录在哪里呢? 编译完成之后,在控制台会输出APK文件的路径。
知道目录在哪里之后,在Windows的文件资源管理器里,找到路径,具体看下图,找到生成的apk文件。
File: D:/QtProject/build-333_QtProject-Android_for_arm64_v8a_Clang_Qt_5_12_6_for_Android_ARM64_v8a-Release/android-build//build/outputs/apk/debug/android-build-debug.apk
4.7 设备仿真调试
通过MQTT客户端模拟设备登录华为云服务器。进行设备联调,实现数据上传和下发测试。
五、STM32代码设计
5.1 硬件连线说明
1. 主控芯片:STM32F103C8T6
作为系统核心,负责传感器数据采集、控制逻辑处理、通信传输及执行模块驱动。
2. 温湿度传感器SHT30(I2C接口)
- SCL连接STM32的PB6(I2C1_SCL)
- SDA连接STM32的PB7(I2C1_SDA)
- 电源VCC接5V或3.3V,GND接地
I2C总线用于数字温湿度数据通信。
3. 烟雾传感器MQ2(模拟信号输出)
- 模拟输出端连接STM32的PA0(ADC1_IN0)
- VCC接5V,GND接地
通过ADC采集烟雾浓度的模拟电压值。
4. 火焰传感器(数字高低电平输出)
- 信号输出连接STM32的PA1(GPIO输入)
- VCC接5V,GND接地
高电平表示检测到火焰,低电平表示无火焰。
5. 有害气体传感器MQ135(模拟信号输出)
- 模拟输出端连接STM32的PA2(ADC1_IN2)
- VCC接5V,GND接地
通过ADC采集气体浓度模拟电压值。
6. WiFi模块ESP8266(串口通信)
- ESP8266 TX连接STM32的PA3(USART2_RX)
- ESP8266 RX连接STM32的PA2(USART2_TX)
- VCC接3.3V,GND接地
通过串口与ESP8266通信,实现数据传输。注意电平匹配,必要时使用电平转换。
7. LCD显示屏(1.44寸TFT SPI接口)
- SPI接口连接STM32的:
- SCK → PA5 (SPI1_SCK)
- MOSI → PA7 (SPI1_MOSI)
- MISO(如用) → PA6 (SPI1_MISO,通常LCD不使用MISO)
- CS(片选) → PB0 (GPIO输出)
- DC(数据/命令) → PB1 (GPIO输出)
- RESET → PB10 (GPIO输出)
- VCC接3.3V,GND接地
8. 继电器风扇控制模块
- 继电器控制信号连接STM32的PB12(GPIO输出)
- 继电器电源与12V风扇供电独立,GND与STM32共地
控制继电器通断以启动或关闭风扇。
9. 蜂鸣器报警模块
- 控制引脚连接STM32的PB13(GPIO输出)
- VCC接5V,GND接地
通过高电平控制蜂鸣器发声报警。
5.2 传感器代码
// STM32F103C8T6 寄存器编程示例代码(部分)
// 实现:SHT30(I2C),MQ2和MQ135(ADC),火焰传感器(GPIO输入)
#include "stm32f10x.h"
// I2C1初始化(用于SHT30)
void I2C1_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使能GPIOB时钟
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // 使能I2C1时钟
// PB6=SCL,PB7=SDA 配置为开漏复用推挽输出
GPIOB->CRL &= ~((0xF << 24) | (0xF << 28));
GPIOB->CRL |= ((0xB << 24) | (0xB << 28)); // 速度50MHz,开漏复用推挽
I2C1->CR1 = I2C_CR1_SWRST; // 软件复位
I2C1->CR1 &= ~I2C_CR1_SWRST; // 释放复位
I2C1->CR2 = 36; // APB1频率36MHz
I2C1->CCR = 180; // 标准模式100kHz
I2C1->TRISE = 37; // 最大上升时间
I2C1->CR1 |= I2C_CR1_PE; // 使能I2C1
}
// I2C启动信号
void I2C_Start(void)
{
I2C1->CR1 |= I2C_CR1_START;
while (!(I2C1->SR1 & I2C_SR1_SB));
}
// I2C停止信号
void I2C_Stop(void)
{
I2C1->CR1 |= I2C_CR1_STOP;
}
// 发送地址(写)
void I2C_SendAddress_Write(uint8_t addr)
{
I2C1->DR = addr & 0xFE;
while (!(I2C1->SR1 & I2C_SR1_ADDR));
(void)I2C1->SR2;
}
// 发送地址(读)
void I2C_SendAddress_Read(uint8_t addr)
{
I2C1->DR = addr | 0x01;
while (!(I2C1->SR1 & I2C_SR1_ADDR));
(void)I2C1->SR2;
}
// 发送一个字节
void I2C_SendData(uint8_t data)
{
I2C1->DR = data;
while (!(I2C1->SR1 & I2C_SR1_TXE));
}
// 接收一个字节,ack=1时应答,ack=0不应答
uint8_t I2C_ReceiveData(uint8_t ack)
{
if (ack)
{
I2C1->CR1 |= I2C_CR1_ACK;
}
else
{
I2C1->CR1 &= ~I2C_CR1_ACK;
}
while (!(I2C1->SR1 & I2C_SR1_RXNE));
return I2C1->DR;
}
// 延时函数,简单软件延时
void Delay(uint32_t count)
{
while(count--) __NOP();
}
// 读取SHT30温湿度
// 返回值:0成功,-1失败;温度和湿度通过指针返回
int SHT30_Read(float *temperature, float *humidity)
{
uint8_t addr = 0x44 << 1; // SHT30默认地址0x44,左移1位
uint8_t buf[6];
uint16_t rawT, rawH;
uint8_t i;
I2C_Start();
I2C_SendAddress_Write(addr);
I2C_SendData(0x2C);
I2C_SendData(0x06); // 单次高重复度测量命令
I2C_Stop();
Delay(50000); // 延时测量约15ms
I2C_Start();
I2C_SendAddress_Read(addr);
for(i=0; i<5; i++)
{
buf[i] = I2C_ReceiveData(1);
}
buf[5] = I2C_ReceiveData(0);
I2C_Stop();
// 简单CRC校验可选,忽略
rawT = (buf[0]<<8) | buf[1];
rawH = (buf[3]<<8) | buf[4];
*temperature = -45 + 175 * ((float)rawT / 65535.0f);
*humidity = 100 * ((float)rawH / 65535.0f);
return 0;
}
// ADC初始化(用于MQ2和MQ135模拟信号采集)
void ADC1_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 使能GPIOA时钟
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // 使能ADC1时钟
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
// PA0和PA2配置为模拟输入
GPIOA->CRL &= ~((0xF << 0) | (0xF << 8));
ADC1->CR2 |= ADC_CR2_ADON; // 使能ADC
ADC1->SMPR2 |= ADC_SMPR2_SMP0 | ADC_SMPR2_SMP2; // 通道0和2采样时间
ADC1->CR2 |= ADC_CR2_CONT; // 连续转换模式
ADC1->CR2 |= ADC_CR2_CAL; // 校准
while (ADC1->CR2 & ADC_CR2_CAL);
ADC1->CR2 |= ADC_CR2_ADON; // 启动ADC
}
// 读取ADC通道,channel = 0~15
uint16_t ADC_Read(uint8_t channel)
{
ADC1->SQR3 = channel & 0x1F;
ADC1->CR2 |= ADC_CR2_SWSTART;
while(!(ADC1->SR & ADC_SR_EOC));
return ADC1->DR;
}
// GPIO初始化(火焰传感器输入,蜂鸣器和风扇控制输出)
void GPIO_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 使能GPIOA
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使能GPIOB
// PA1输入,火焰传感器数字信号,浮空输入
GPIOA->CRL &= ~(0xF << 4);
GPIOA->CRL |= (0x4 << 4); // 输入浮空
// PB12输出,继电器控制风扇,推挽输出
GPIOB->CRH &= ~(0xF << 16);
GPIOB->CRH |= (0x3 << 16); // 50MHz推挽输出
// PB13输出,蜂鸣器控制,推挽输出
GPIOB->CRH &= ~(0xF << 20);
GPIOB->CRH |= (0x3 << 20); // 50MHz推挽输出
}
// 读取火焰传感器状态(返回1有火焰,0无火焰)
uint8_t FlameSensor_Read(void)
{
return (GPIOA->IDR & (1 << 1)) ? 1 : 0;
}
// 控制风扇继电器(1开启,0关闭)
void Fan_Control(uint8_t on)
{
if(on)
GPIOB->BSRR = (1 << 12);
else
GPIOB->BRR = (1 << 12);
}
// 控制蜂鸣器(1响,0灭)
void Buzzer_Control(uint8_t on)
{
if(on)
GPIOB->BSRR = (1 << 13);
else
GPIOB->BRR = (1 << 13);
}
5.3 项目核心代码
#include "stm32f10x.h"
// 外部模块函数声明(假设已实现)
extern void I2C1_Init(void);
extern int SHT30_Read(float *temperature, float *humidity);
extern void ADC1_Init(void);
extern uint16_t ADC_Read(uint8_t channel);
extern void GPIO_Init(void);
extern uint8_t FlameSensor_Read(void);
extern void Fan_Control(uint8_t on);
extern void Buzzer_Control(uint8_t on);
extern void ESP8266_UART_Init(void);
extern void MQTT_Publish_Data(float temp, float hum, uint16_t smoke, uint16_t gas, uint8_t flame, uint8_t fan, uint8_t buzzer);
// 系统阈值定义
#define TEMP_THRESHOLD 50.0f
#define HUM_THRESHOLD 80.0f
#define SMOKE_THRESHOLD 2000
#define GAS_THRESHOLD 2000
int main(void)
{
float temperature = 0, humidity = 0;
uint16_t smoke_adc = 0, gas_adc = 0;
uint8_t flame = 0;
uint8_t alarm_flag = 0;
// 初始化外设
I2C1_Init();
ADC1_Init();
GPIO_Init();
ESP8266_UART_Init();
while(1)
{
// 读取温湿度
if(SHT30_Read(&temperature, &humidity) != 0)
{
// 读取失败,继续下一轮
continue;
}
// 读取模拟量传感器
smoke_adc = ADC_Read(0); // MQ2传感器,PA0通道
gas_adc = ADC_Read(2); // MQ135传感器,PA2通道
// 读取火焰传感器数字输入
flame = FlameSensor_Read();
// 判断是否有异常报警
alarm_flag = 0;
if(temperature > TEMP_THRESHOLD || humidity > HUM_THRESHOLD) alarm_flag = 1;
if(smoke_adc > SMOKE_THRESHOLD) alarm_flag = 1;
if(gas_adc > GAS_THRESHOLD) alarm_flag = 1;
if(flame == 1) alarm_flag = 1;
// 控制执行器
if(alarm_flag)
{
Fan_Control(1);
Buzzer_Control(1);
}
else
{
Fan_Control(0);
Buzzer_Control(0);
}
// 通过MQTT上传数据到华为云
MQTT_Publish_Data(temperature, humidity, smoke_adc, gas_adc, flame,
alarm_flag ? 1 : 0, alarm_flag ? 1 : 0);
}
}
5.4 程序下载
也有视频教程:
讲解如何编译代码,下载STM32程序: https://www.bilibili.com/video/BV1Cw4m1e7Yc
打STM32的keil工程,编译代码、然后,使用USB线将开发板的左边的USB口(串口1)与电脑的USB连接,打开程序下载软件下载程序。
具体下载过程看下面图:
打开程序下载软件:[软件就在资料包里的软件工具目录下]
5.5 程序正常运行效果
设备运行过程中会通过串口打印调试信息,我们可以通过串口打印了解程序是否正常。
程序下载之后,可以打开串口调试助手查看程序运行的状态信息。[软件就在资料包里的软件工具目录下]
5.6 取模软件的使用
显示屏上会显示中文,字母,数字等数据,可以使用下面的取模软件进行取模设置。
[软件就在资料包里的软件工具目录下]
打开软件之后:
六、总结
本项目基于STM32F103C8T6单片机设计并实现了工业仓库环境智能监控系统。系统集成了温湿度传感器SHT30、烟雾传感器MQ2、火焰传感器及有害气体传感器MQ135,能够实时采集仓库环境的关键参数。通过对传感器数据的实时分析,系统能够快速判断环境是否存在异常,并在异常情况下自动启动风扇通风及蜂鸣器报警,保障仓库安全。
系统采用ESP8266 WiFi模块,利用MQTT协议将环境数据上传至华为云物联网平台,实现远程实时监控与历史数据管理,极大地提升了管理效率和安全保障水平。同时,配备的1.44寸TFT LCD液晶屏为现场工作人员提供直观的环境状态显示,方便即时了解仓库情况。
在软件设计方面,采用STM32寄存器级编程,提升了系统响应速度与稳定性。通过模块化设计思想,各功能模块实现解耦,便于后续维护与升级。上位机软件采用Qt5和C++开发,完成了数据的可视化展示和历史分析功能,增强了系统的实用性和用户体验。
综上所述,本系统设计合理,功能完善,具备良好的实时性、稳定性和扩展性。它不仅满足了工业仓库环境监控的需求,也为类似的物联网应用提供了参考与借鉴价值。未来可结合更多传感器和智能算法,进一步提升系统的智能化和自动化水平。