一、前言
1.1 項目介紹
【1】項目開發(fā)背景
在當今工業(yè)自動化和智能化迅速發(fā)展的背景下,倉儲系統(tǒng)作為物流和供應鏈管理中的關(guān)鍵環(huán)節(jié),其環(huán)境安全與智能監(jiān)控顯得尤為重要。工業(yè)倉庫常常儲存大量易燃、易爆、易腐蝕或?qū)Νh(huán)境要求嚴格的物資,一旦發(fā)生溫濕度異常、氣體泄漏或火災等突發(fā)事件,將可能導致巨大經(jīng)濟損失甚至人員傷亡。因此,構(gòu)建一個實時、高效、智能的倉庫環(huán)境監(jiān)控系統(tǒng),成為工業(yè)信息化管理的重要組成部分。
傳統(tǒng)的倉庫環(huán)境監(jiān)控方式多依賴人工巡檢和基礎(chǔ)報警裝置,不僅效率低下,且響應速度慢,無法滿足現(xiàn)代倉儲對安全性、實時性和智能化的要求。尤其在大型工業(yè)園區(qū)和分布式倉儲中心,傳統(tǒng)方式難以實現(xiàn)集中管理與遠程監(jiān)控,嚴重制約了企業(yè)的數(shù)字化發(fā)展進程。因此,需一種低成本、模塊化、高集成度的環(huán)境智能監(jiān)控系統(tǒng),以實現(xiàn)對倉儲環(huán)境的全面感知、智能響應和遠程管理。
本項目以STM32F103C8T6單片機為核心控制器,結(jié)合溫濕度、煙霧、火焰及有害氣體等多種傳感器,搭建一個可實時采集環(huán)境數(shù)據(jù)的智能感知系統(tǒng)。系統(tǒng)配備ESP8266 WiFi模塊,通過MQTT協(xié)議將數(shù)據(jù)上傳至華為云物聯(lián)網(wǎng)平臺,支持遠程監(jiān)控和歷史數(shù)據(jù)分析。同時,結(jié)合本地LCD顯示與風扇控制、蜂鳴器報警等執(zhí)行模塊,實現(xiàn)對異常情況的快速響應與聯(lián)動控制。上位機軟件則采用Qt5開發(fā),提供圖形化界面,便于操作人員實時查看數(shù)據(jù)和分析環(huán)境變化趨勢。
本設計不僅具有較強的實用性與可擴展性,還符合當前工業(yè)4.0和智能制造的發(fā)展方向,能夠有效提升倉庫管理的智能化水平,為實現(xiàn)安全、高效、綠色的倉儲環(huán)境提供堅實的技術(shù)保障。
【2】設計實現(xiàn)的功能
(1)實時監(jiān)測倉庫環(huán)境參數(shù):通過傳感器采集溫度、濕度、煙霧濃度、火焰信號和有害氣體(如甲醛、氨氣等)濃度,實現(xiàn)對倉庫環(huán)境的全面感知。
(2)本地LCD屏幕顯示環(huán)境信息:通過1.44寸TFT LCD液晶屏實時顯示當前的溫濕度、煙霧濃度、氣體泄漏等關(guān)鍵數(shù)據(jù),便于現(xiàn)場人員查看。
(3)環(huán)境異常自動報警與風扇聯(lián)動控制:當檢測到溫度過高、煙霧超標、火焰出現(xiàn)或氣體泄漏時,系統(tǒng)自動觸發(fā)蜂鳴器報警,并控制繼電器啟動風扇,進行通風處理。
(4)WIFI無線通信與數(shù)據(jù)上云:通過ESP8266模塊將采集到的環(huán)境數(shù)據(jù)通過MQTT協(xié)議實時上傳至華為云IoT平臺,支持遠程數(shù)據(jù)監(jiān)控。
(5)支持上位機環(huán)境監(jiān)控平臺:通過Qt5 + C++開發(fā)上位機軟件,接收和顯示來自倉庫端的實時數(shù)據(jù),并提供歷史數(shù)據(jù)查詢與分析功能,輔助管理人員進行環(huán)境評估和決策。
【3】項目硬件模塊組成
(1)主控模塊:STM32F103C8T6單片機,用于協(xié)調(diào)各傳感器的數(shù)據(jù)采集、邏輯控制與通信處理。
(2)溫濕度檢測模塊:SHT30數(shù)字溫濕度傳感器,采用I2C通信接口,實現(xiàn)精準環(huán)境溫濕度測量。
(3)煙霧檢測模塊:MQ2氣體傳感器,通過模擬信號輸出監(jiān)測煙霧濃度,用于火災預警。
(4)火焰檢測模塊:紅外火焰?zhèn)鞲衅?/a>,輸出高低電平信號,用于檢測火源存在。
(5)有害氣體檢測模塊:MQ135空氣質(zhì)量傳感器,輸出模擬信號,用于檢測空氣中的有害氣體如甲醛、氨氣等。
(6)通信模塊:ESP8266 WiFi模塊,通過串口通信與STM32連接,采用MQTT協(xié)議將數(shù)據(jù)上傳至華為云IoT平臺。
(7)顯示模塊:1.44寸TFT LCD液晶屏,SPI接口,用于本地顯示各項環(huán)境參數(shù)數(shù)據(jù)。
(8)風扇控制模塊:繼電器驅(qū)動電路,控制12V直流風扇,實現(xiàn)自動通風功能。
(9)報警模塊:高電平觸發(fā)的有源蜂鳴器,用于在檢測到環(huán)境異常時發(fā)出聲響警報。
(10)上位機軟件支持模塊:PC端通過串口或WiFi接收數(shù)據(jù),配合Qt5 + C++開發(fā)的可視化界面進行數(shù)據(jù)展示與分析。
【4】設計意義
隨著工業(yè)自動化水平的不斷提高,倉庫作為生產(chǎn)和物流環(huán)節(jié)中的重要組成部分,其環(huán)境安全問題越來越受到重視。溫濕度、煙霧、火焰及有害氣體等環(huán)境因素直接關(guān)系到倉庫存儲物品的質(zhì)量安全,尤其是對一些易燃易爆、易腐蝕物品的存儲而言,環(huán)境監(jiān)控顯得尤為關(guān)鍵。因此,設計一套基于STM32的工業(yè)倉庫環(huán)境智能監(jiān)控系統(tǒng),不僅能有效提升環(huán)境數(shù)據(jù)的感知能力,還能實現(xiàn)對潛在風險的及時預警和聯(lián)動控制,保障倉庫環(huán)境的穩(wěn)定和安全。
本設計采用多種環(huán)境傳感器,實現(xiàn)了對溫濕度、煙霧濃度、火焰及空氣質(zhì)量的實時監(jiān)測,結(jié)合繼電器驅(qū)動風扇進行主動通風處理,并配備有源蜂鳴器實現(xiàn)本地報警,從而提升了系統(tǒng)的響應速度與應急處理能力。通過本地LCD顯示模塊,工作人員可以隨時掌握環(huán)境狀態(tài),無需依賴額外設備,大大提高了現(xiàn)場工作的便捷性與效率。
此外,系統(tǒng)通過ESP8266模塊實現(xiàn)了數(shù)據(jù)的遠程無線傳輸,采用MQTT協(xié)議將環(huán)境數(shù)據(jù)上傳至華為云物聯(lián)網(wǎng)平臺,為遠程實時監(jiān)控和歷史數(shù)據(jù)分析提供了技術(shù)支持。管理人員無需親臨現(xiàn)場即可通過上位機平臺查看倉庫的環(huán)境變化情況,從而為科學決策和故障預防提供依據(jù)。
整體而言,本項目的設計緊貼實際需求,方案成熟可靠,硬件結(jié)構(gòu)清晰,成本可控,具有良好的實用性和推廣價值。它不僅體現(xiàn)了物聯(lián)網(wǎng)與嵌入式技術(shù)在工業(yè)環(huán)境安全中的融合應用,也為后續(xù)智能倉儲系統(tǒng)的發(fā)展提供了有益的技術(shù)參考。
【5】市面上同類產(chǎn)品研究現(xiàn)狀
工業(yè)倉庫的環(huán)境監(jiān)控是保障物資安全、防止火災爆炸、確保作業(yè)環(huán)境舒適的關(guān)鍵環(huán)節(jié)。隨著物聯(lián)網(wǎng)(IoT)、傳感器技術(shù)和邊緣計算的發(fā)展,此類系統(tǒng)正朝著智能化、網(wǎng)絡化、集成化的方向快速演進。STM32系列微控制器因其高性能、低功耗、豐富外設和成熟的生態(tài)系統(tǒng),成為此類嵌入式系統(tǒng)的主流選擇。
國內(nèi)研究現(xiàn)狀與典型案例
- 海爾智能倉儲環(huán)境監(jiān)控系統(tǒng):
- 案例描述: 海爾在其大型物流倉庫中部署了基于傳感器網(wǎng)絡的智能環(huán)境監(jiān)控系統(tǒng)。系統(tǒng)集成了溫濕度傳感器(類似SHT30)、煙霧探測器(類似MQ2)、可燃氣體探測器(類似MQ135)以及視頻監(jiān)控。數(shù)據(jù)通過ZigBee/WiFi(如ESP8266)匯聚到網(wǎng)關(guān)(常采用高性能STM32F4/F7系列),再上傳至私有云平臺。系統(tǒng)實現(xiàn)了實時監(jiān)控、閾值報警、自動通風(風機控制)和消防聯(lián)動。上位機平臺提供可視化展示和數(shù)據(jù)分析。
- 與您設計的關(guān)聯(lián): 核心功能(監(jiān)測、報警、通風、聯(lián)網(wǎng)、上位機)高度一致。海爾方案可能更復雜(如集成視頻、多節(jié)點組網(wǎng)),采用更高性能STM32作為網(wǎng)關(guān),但底層傳感節(jié)點很可能使用類似STM32F1/C8T6級別的MCU。使用WiFi和云平臺(私有云 vs 華為云)是共同點。
- 異同點: 海爾系統(tǒng)規(guī)模更大、集成度更高(可能包含RFID、AGV調(diào)度等),成本也更高。您的設計更側(cè)重于經(jīng)濟型、模塊化的單點/小型倉庫解決方案,直接使用ESP8266+STM32F103C8T6完成傳感、處理、通信。
- 京東“亞洲一號”智能物流園環(huán)境監(jiān)控:
- 案例描述: 京東的標桿性智能倉庫廣泛部署了環(huán)境感知系統(tǒng)。除了基礎(chǔ)的溫濕度、煙霧、氣體監(jiān)測,還特別關(guān)注庫區(qū)內(nèi)的粉塵濃度(對精密電子產(chǎn)品尤為重要)和特定區(qū)域(如冷庫、電池存儲區(qū))的環(huán)境參數(shù)。系統(tǒng)采用工業(yè)級傳感器,數(shù)據(jù)通過工業(yè)以太網(wǎng)或無線網(wǎng)絡(含WiFi)傳輸?shù)街醒氡O(jiān)控室和云端(京東云)。上位機系統(tǒng)基于Web技術(shù)開發(fā),提供大屏可視化和智能預警。
- 與您設計的關(guān)聯(lián): 核心監(jiān)測參數(shù)(溫濕度、煙霧、有害氣體)相同,強調(diào)報警和聯(lián)網(wǎng)(云+上位機)。上位機進行數(shù)據(jù)可視化與分析是共同目標。
- 異同點: 京東系統(tǒng)規(guī)模龐大,采用更昂貴的工業(yè)級傳感器和網(wǎng)絡設備(如工業(yè)以太網(wǎng)交換機),側(cè)重于高可靠性和與整個物流自動化系統(tǒng)的深度集成。您的設計更輕量級,使用消費/工規(guī)級傳感器和成本更優(yōu)的WiFi模塊(ESP8266),適合中小型倉庫。
- 基于華為云IoT的中小企業(yè)倉庫監(jiān)控方案 (如:某正泰電器區(qū)域倉庫):
- 案例描述: 眾多方案提供商(如一些物聯(lián)網(wǎng)初創(chuàng)公司或集成商)為中小企業(yè)倉庫提供基于STM32+華為云IoT平臺的標準化環(huán)境監(jiān)控解決方案。典型配置包括STM32F1/F4主控、各類模擬/數(shù)字傳感器、ESP8266/ESP32 WiFi模塊、繼電器控制通風/報警設備。數(shù)據(jù)通過MQTT協(xié)議上報華為云IoT,用戶可通過手機App或簡易Web上位機查看實時數(shù)據(jù)和報警信息,部分支持歷史數(shù)據(jù)查詢。
- 與您設計的關(guān)聯(lián): 這是與您設計最接近的案例! 核心硬件架構(gòu)(STM32F1 + SHT30 + MQ2/MQ135 + 火焰?zhèn)鞲衅?+ ESP8266 + 繼電器/蜂鳴器 + LCD)、通信協(xié)議(MQTT)、云平臺(華為云IoT)、核心功能(監(jiān)測、報警、通風、遠程查看)幾乎完全一致。上位機可能更偏向于輕量級Web或App。
- 異同點: 商業(yè)方案通常提供更完善的云端規(guī)則引擎(處理復雜報警邏輯)、設備管理、OTA升級功能。您的設計采用了本地LCD顯示和計劃使用Qt開發(fā)更強大的PC上位機,這在本地交互和深度數(shù)據(jù)分析上可能更具優(yōu)勢。
國內(nèi)趨勢總結(jié):
- 普及化與云化: 環(huán)境監(jiān)控已成為現(xiàn)代化智能倉庫的標配,上云(華為云、阿里云、騰訊云等)是主流趨勢。
- 國產(chǎn)化與成本優(yōu)化: 大量采用國產(chǎn)MCU(如STM32替代)、傳感器模塊(如煒盛科技的MQ系列)和通信模塊(ESP系列),降低成本,推動在中小企業(yè)應用。
- 集成化: 環(huán)境監(jiān)控系統(tǒng)越來越多地與安防(視頻)、消防、能源管理、倉儲管理系統(tǒng)(WMS)集成。
- 智能化: 開始引入簡單的AI算法進行異常模式識別(如基于歷史數(shù)據(jù)的溫濕度預測、煙霧誤報過濾)。
國外研究現(xiàn)狀與典型案例
- 西門子倉庫環(huán)境與能源管理系統(tǒng) (如:西門子安貝格工廠內(nèi)部物流):
- 案例描述: 西門子在其先進的工廠和為客戶提供的解決方案中,將環(huán)境監(jiān)控深度整合到其工業(yè)自動化體系(如基于SIMATIC控制器)。系統(tǒng)使用高精度、高可靠性的工業(yè)傳感器(如Siemens自己的或Honeywell、Vaisala品牌),通過PROFINET或工業(yè)無線網(wǎng)絡傳輸數(shù)據(jù)到SCADA系統(tǒng)(如WinCC)和MindSphere工業(yè)云平臺。分析功能強大,可與樓宇管理系統(tǒng)(BMS)聯(lián)動,實現(xiàn)精細化的環(huán)境控制和能源優(yōu)化。
- 與您設計的關(guān)聯(lián): 目標一致(保障環(huán)境安全),都包含傳感、聯(lián)網(wǎng)、上位機分析。自動控制(通風)也是共同點。
- 異同點: 西門子方案是重型工業(yè)級方案,成本高昂,采用專屬協(xié)議(PROFINET)和高端PLC/控制器,傳感器精度和可靠性要求極高,云端平臺(MindSphere)功能復雜。您的設計是輕量級、基于開放協(xié)議(MQTT)和通用MCU(STM32)的經(jīng)濟型方案。
- 亞馬遜物流中心環(huán)境監(jiān)控 (Kiva系統(tǒng)集成):
- 案例描述: 亞馬遜龐大的物流網(wǎng)絡對其倉庫環(huán)境有嚴格要求,特別是溫控區(qū)域(如生鮮、藥品)。其系統(tǒng)高度自動化,環(huán)境傳感器數(shù)據(jù)被集成到龐大的中央控制系統(tǒng)(AWS IoT Core是其核心技術(shù)棧之一)。數(shù)據(jù)用于實時監(jiān)控、觸發(fā)HVAC系統(tǒng)調(diào)節(jié)、確保機器人(Kiva/新形態(tài))工作環(huán)境安全,并通過AWS服務進行大數(shù)據(jù)分析預測維護和優(yōu)化能耗。
- 與您設計的關(guān)聯(lián): 都強調(diào)環(huán)境監(jiān)測對倉儲安全的重要性,都使用云平臺(AWS vs 華為云)進行數(shù)據(jù)匯聚和分析。
- 異同點: 亞馬遜系統(tǒng)規(guī)模巨大,深度依賴AWS生態(tài)系統(tǒng),與機器人自動化系統(tǒng)緊密耦合。其傳感器網(wǎng)絡可能更復雜(如分布式溫度監(jiān)測網(wǎng)格)。您的設計是獨立、專注環(huán)境監(jiān)控本身的基礎(chǔ)系統(tǒng)。
- 羅克韋爾自動化 FactoryTalk 智能傳感器方案:
- 案例描述: 羅克韋爾提供支持IO-Link通信協(xié)議的智能傳感器(包括溫濕度、氣體、壓力等)和配套的網(wǎng)關(guān)、軟件(FactoryTalk Hub)。這些傳感器將原始數(shù)據(jù)和處理后的信息通過IO-Link發(fā)送到網(wǎng)關(guān)(可能基于ARM處理器,性能類似STM32F4/H7),再通過以太網(wǎng)/MQTT上傳至SCADA或云平臺。優(yōu)勢在于簡化布線、遠程配置診斷、獲取更豐富數(shù)據(jù)。
- 與您設計的關(guān)聯(lián): 最終目標相似(環(huán)境監(jiān)控聯(lián)網(wǎng)化),都涉及傳感器數(shù)據(jù)采集、邊緣處理/網(wǎng)關(guān)、云/上位機連接。
- 異同點: 羅克韋爾方案強調(diào)智能傳感器和IO-Link工業(yè)通信協(xié)議,提高了數(shù)據(jù)質(zhì)量和可管理性,但傳感器和協(xié)議成本顯著高于您設計中使用的模擬/簡單數(shù)字傳感器和直接I2C/ADC讀取方式。您的設計更注重成本效益和通用性。
國外趨勢總結(jié):
- 工業(yè)4.0/IIoT驅(qū)動: 環(huán)境監(jiān)控作為IIoT的重要應用場景,深度融入數(shù)字化工廠架構(gòu)。
- 強調(diào)開放標準與互操作性: OPC UA, MQTT, IO-Link等開放標準被廣泛采用,促進不同廠商設備集成。
- 邊緣智能: 在網(wǎng)關(guān)上或智能傳感器端進行更多數(shù)據(jù)預處理、濾波和本地決策,減少云端負擔和延遲。
- 預測性維護與高級分析: 利用云端大數(shù)據(jù)和AI/ML技術(shù),對環(huán)境系統(tǒng)設備(如風機、傳感器本身)進行健康狀態(tài)監(jiān)測和預測性維護,并優(yōu)化環(huán)境控制策略。
結(jié)論:
國內(nèi)外在工業(yè)倉庫環(huán)境智能監(jiān)控領(lǐng)域的研究和應用已相當深入,大型企業(yè)和工業(yè)自動化巨頭主導著高端、集成化的解決方案。同時,基于通用MCU(如STM32)、標準傳感器、WiFi模塊和公有云平臺(如華為云IoT、AWS IoT Core)的經(jīng)濟型方案,因其成本優(yōu)勢和快速部署能力,在國內(nèi)中小企業(yè)市場得到了廣泛應用和推廣。
您的設計方案精準定位在這一經(jīng)濟實用的細分市場,采用了經(jīng)過驗證的主流技術(shù)和組件(STM32F103C8T6, SHT30, MQ系列, ESP8266, MQTT, 華為云IoT),并兼顧了本地顯示(LCD)和深度遠程分析(Qt上位機)的需求,具備較高的實用價值和市場潛力。其核心價值在于以較低的成本實現(xiàn)工業(yè)倉庫環(huán)境監(jiān)控的關(guān)鍵功能閉環(huán),符合當前國內(nèi)中小企業(yè)智能化升級的需求趨勢。
【6】摘要
本項目設計并實現(xiàn)了一種基于STM32F103C8T6單片機的工業(yè)倉庫環(huán)境智能監(jiān)控系統(tǒng),在實現(xiàn)對倉庫內(nèi)部溫濕度、煙霧、火焰以及有害氣體等環(huán)境參數(shù)的實時監(jiān)測與異常處理。系統(tǒng)通過SHT30、MQ2、火焰?zhèn)鞲衅骷癕Q135等傳感器采集環(huán)境數(shù)據(jù),利用繼電器控制風扇通風并通過蜂鳴器進行聲光報警。當環(huán)境參數(shù)異常時,系統(tǒng)可自動觸發(fā)報警機制并聯(lián)動風扇進行應急處理。同時,借助ESP8266 WiFi模塊,系統(tǒng)將監(jiān)測數(shù)據(jù)通過MQTT協(xié)議上傳至華為云物聯(lián)網(wǎng)平臺,實現(xiàn)遠程環(huán)境監(jiān)控與數(shù)據(jù)分析。上位機采用Qt5與C++開發(fā),提供友好的可視化界面用于數(shù)據(jù)查看和歷史記錄管理。此外,系統(tǒng)配備本地LCD屏幕用于環(huán)境信息顯示。該系統(tǒng)具有響應速度快、功能完整、部署靈活、可擴展性強等優(yōu)點,適用于各類工業(yè)倉庫的環(huán)境安全監(jiān)測需求。
關(guān)鍵字:
STM32;環(huán)境監(jiān)控;倉庫安全;物聯(lián)網(wǎng);MQTT;ESP8266;華為云;溫濕度;煙霧檢測;火焰報警
1.2 設計思路
本項目的設計思路圍繞“實時監(jiān)測、智能響應、遠程傳輸、可視化顯示”四個核心目標展開,采用模塊化設計方法,將環(huán)境采集、控制執(zhí)行、通信傳輸和人機交互等功能分別劃分為獨立模塊,并通過主控芯片STM32F103C8T6進行統(tǒng)一協(xié)調(diào)與管理。
在環(huán)境參數(shù)采集方面,系統(tǒng)選用了具有代表性的傳感器:SHT30用于溫濕度測量,MQ2用于煙霧檢測,紅外火焰?zhèn)鞲衅饔糜诨鹪醋R別,MQ135用于有害氣體濃度檢測。這些傳感器通過I2C或模擬信號與STM32連接,實現(xiàn)多源數(shù)據(jù)的高效采集。主控芯片周期性讀取傳感器數(shù)據(jù)并進行邏輯判斷,一旦某項參數(shù)超過設定閾值,即觸發(fā)異常處理機制。
在響應控制部分,系統(tǒng)設置了蜂鳴器和風扇兩個執(zhí)行裝置。當檢測到煙霧、火焰或有害氣體濃度異常時,系統(tǒng)立即啟動蜂鳴器發(fā)出警報,同時控制繼電器驅(qū)動風扇運行,以進行環(huán)境通風和應急處理。這種本地聯(lián)動響應機制確保了在斷網(wǎng)或延遲情況下,系統(tǒng)仍具備快速處理能力。
為實現(xiàn)遠程監(jiān)控功能,系統(tǒng)集成了ESP8266 WiFi模塊,采用MQTT協(xié)議將采集到的環(huán)境數(shù)據(jù)上傳至華為云物聯(lián)網(wǎng)平臺。該方案具備通信效率高、協(xié)議輕量級、易于部署等優(yōu)勢,能夠?qū)崿F(xiàn)對多個倉庫的集中監(jiān)控和遠程數(shù)據(jù)管理。
在人機交互方面,系統(tǒng)通過1.44寸TFT LCD顯示屏將當前的環(huán)境參數(shù)信息實時呈現(xiàn)在現(xiàn)場人員面前,方便快速了解倉庫狀態(tài)。同時,配套的PC端上位機軟件基于Qt5與C++開發(fā),提供圖形化界面,能夠?qū)崟r接收和展示數(shù)據(jù),并支持歷史數(shù)據(jù)瀏覽與分析,進一步提升了系統(tǒng)的智能化水平與管理效率。
整體而言,本項目采用分層控制、模塊集成的設計方式,確保系統(tǒng)運行穩(wěn)定、功能協(xié)同、擴展便捷,具有良好的工程實用性與開發(fā)參考價值。
1.3 系統(tǒng)功能總結(jié)
功能類別 | 具體功能描述 | 對應模塊與器件 |
---|---|---|
環(huán)境數(shù)據(jù)采集 | 實時采集溫度與濕度數(shù)據(jù) | SHT30數(shù)字溫濕度傳感器(I2C) |
煙霧檢測 | 檢測倉庫內(nèi)部煙霧濃度,用于火災預警 | MQ2煙霧傳感器(模擬信號) |
火焰檢測 | 通過紅外識別火焰是否存在,判斷是否發(fā)生明火 | 紅外火焰?zhèn)鞲衅鳎ǜ叩碗娖捷敵觯?/td> |
有害氣體檢測 | 檢測空氣中有害氣體濃度(如甲醛、氨氣等) | MQ135氣體傳感器(模擬信號) |
本地報警 | 檢測到異常環(huán)境數(shù)據(jù)后啟動蜂鳴器進行報警提醒 | 高電平觸發(fā)有源蜂鳴器 |
自動通風控制 | 報警時自動啟動風扇進行通風排氣 | 繼電器 + 12V直流風扇 |
數(shù)據(jù)本地顯示 | 將實時溫濕度、煙霧、火焰、氣體狀態(tài)顯示在LCD屏上 | 1.44寸TFT LCD液晶屏(SPI接口) |
無線數(shù)據(jù)上傳 | 將采集到的數(shù)據(jù)通過WiFi模塊上傳至華為云IoT平臺 | ESP8266 WiFi模塊 + MQTT協(xié)議 |
云端遠程監(jiān)控 | 管理人員可通過云平臺遠程查看實時與歷史環(huán)境數(shù)據(jù) | 華為云IoT平臺 |
上位機交互平臺 | 上位機軟件支持數(shù)據(jù)接收、展示、歷史分析和報警提示 | Qt5 + C++ 開發(fā)的可視化上位機程序 |
1.4 開發(fā)工具的選擇
【1】設備端開發(fā)
硬件設備端的開發(fā)主要依賴于C語言,利用該語言直接操作硬件寄存器,確保系統(tǒng)運行的高效性和低延遲。C語言在嵌入式開發(fā)中具有廣泛的應用,它能夠直接訪問硬件,滿足對資源消耗和響應速度的嚴格要求。為了編寫高效、穩(wěn)定的代碼,開發(fā)工具選擇了Keil uVision 5作為主要的開發(fā)環(huán)境。Keil是一個專業(yè)的嵌入式開發(fā)工具,廣泛應用于基于ARM架構(gòu)的微控制器(如STM32)開發(fā)。Keil提供了完善的調(diào)試、編譯和仿真支持,能夠幫助在軟件開發(fā)過程中高效地進行調(diào)試、單步執(zhí)行以及斷點設置,確保開發(fā)的穩(wěn)定性和高效性。
STM32F103RCT6是項目中使用的主控芯片,它基于ARM Cortex-M3架構(gòu),擁有強大的計算能力和豐富的外設接口。在硬件編程中,寄存器級編程是常用的方式,這要求開發(fā)者對芯片的硬件寄存器有深入的理解。在Keil環(huán)境中,通過STM32的寄存器直接控制GPIO、ADC、I2C、SPI等硬件接口,以滿足各個硬件模塊(如傳感器、執(zhí)行器、顯示屏等)與主控芯片的交互。使用寄存器編程能夠提供更高效、精確的控制,避免了外部庫的開銷,同時也能深入調(diào)控硬件特性,提升系統(tǒng)性能。
【2】上位機開發(fā)
本項目的上位機開發(fā)基于Qt 5框架,使用**C++**作為主要編程語言。Qt是一個跨平臺的應用開發(fā)框架,廣泛用于開發(fā)GUI應用程序。Qt提供了豐富的GUI組件和工具,能夠高效地實現(xiàn)圖形界面的設計與開發(fā)。C++則作為Qt的底層語言,具有高效的性能和良好的控制力,非常適合用于處理設備與系統(tǒng)之間的數(shù)據(jù)交互、通信協(xié)議的實現(xiàn)和復雜的計算任務。在項目中,Qt被用于開發(fā)Windows平臺的桌面應用程序以及Android平臺的手機APP。Qt框架的跨平臺特性使得開發(fā)者能夠使用同一套代碼在不同操作系統(tǒng)上進行構(gòu)建和部署,大大提高了開發(fā)效率。
為了方便開發(fā)和調(diào)試,上位機的開發(fā)采用了Qt Creator作為主要的集成開發(fā)環(huán)境(IDE)。Qt Creator是一款由Qt官方提供的開發(fā)工具,專為Qt應用程序開發(fā)設計,支持C++、QML和JavaScript等語言。Qt Creator提供了豐富的功能,如代碼編輯、調(diào)試、構(gòu)建、版本控制集成等,能夠顯著提升開發(fā)者的生產(chǎn)力。在本項目中,Qt Creator為開發(fā)者提供了自動化構(gòu)建、界面設計工具(如Qt Designer)和調(diào)試工具(如QDebug和QML調(diào)試工具),使得開發(fā)過程更加高效和流暢。
上位機與硬件設備端的通信采用了基于TCP/IP協(xié)議的數(shù)據(jù)傳輸方式。為了實現(xiàn)這一功能,Qt提供了豐富的網(wǎng)絡編程支持,尤其是QTcpSocket和QTcpServer類,使得上位機能夠輕松地與硬件設備建立TCP連接,進行數(shù)據(jù)收發(fā)。上位機通過WIFI連接ESP8266-WIFI模塊,ESP8266模塊創(chuàng)建TCP服務器,上位機應用則作為客戶端連接到服務器,進行實時的數(shù)據(jù)傳輸與控制命令的下發(fā)。
為了滿足不同用戶的需求,本項目需要支持Windows平臺的桌面應用和Android平臺的移動APP。Qt的跨平臺特性使得開發(fā)人員能夠在一個代碼庫下完成多平臺應用的開發(fā)和移植。開發(fā)者僅需要編寫一次應用邏輯和用戶界面,就可以通過Qt的跨平臺構(gòu)建工具生成Windows和Android兩個平臺的可執(zhí)行文件。此外,Qt提供了豐富的文檔和社區(qū)支持,幫助開發(fā)者解決平臺差異和兼容性問題,確保應用在不同平臺上都能穩(wěn)定運行。
總體而言,上位機開發(fā)環(huán)境采用了Qt 5框架和C++語言,結(jié)合Qt Creator集成開發(fā)環(huán)境,提供了一個高效、穩(wěn)定、跨平臺的開發(fā)工具鏈。通過Qt強大的GUI設計、網(wǎng)絡通信、多線程支持以及數(shù)據(jù)庫管理功能,開發(fā)者能夠輕松實現(xiàn)與硬件設備的交互、控制設備、處理傳感器數(shù)據(jù),并為用戶提供直觀、流暢的操作體驗。
1.5 模塊的技術(shù)詳情介紹
【1】ESP8266-WIFI模塊
ESP8266-WIFI模塊是一款功能強大的WiFi通信模塊,廣泛應用于物聯(lián)網(wǎng)(IoT)設備中。它由Espressif Systems公司設計,并且由于其低功耗、較小的體積和較低的成本,成為了許多智能硬件項目的首選通信模塊。ESP8266不僅具備WiFi無線連接功能,還具有較高的處理能力和豐富的接口資源,使其成為實現(xiàn)無線通信的理想選擇。
ESP8266模塊內(nèi)置了一個完整的WiFi棧,可以直接作為WiFi客戶端或AP(Access Point)工作,支持無線網(wǎng)絡的連接、數(shù)據(jù)傳輸?shù)榷喾N功能。在設計中,ESP8266支持多種網(wǎng)絡協(xié)議,最常見的是TCP/IP協(xié)議,允許設備與外部服務器或移動應用進行數(shù)據(jù)交換。其強大的功能使得它不僅可以連接到傳統(tǒng)的路由器,還可以直接創(chuàng)建一個WiFi熱點,支持設備與手機或其他WiFi設備的通信。
在硬件設計中,ESP8266模塊的另一大優(yōu)勢是其與微控制器的高兼容性。模塊通常通過串口(UART)與主控芯片進行通信,因此可以方便地與各種微控制器(如STM32、Arduino等)連接,進行數(shù)據(jù)傳輸。在本項目中,ESP8266模塊通過串口與STM32單片機相連接,負責將本地采集的健康數(shù)據(jù)上傳到Android手機APP中。數(shù)據(jù)傳輸采用的是TCP/IP協(xié)議,保證了通信的穩(wěn)定性和可靠性。
ESP8266模塊的低功耗特性也使其適用于嵌入式系統(tǒng)和移動設備中,尤其是在電池供電的項目中,能夠有效延長設備的使用時間。通過合理的睡眠模式和待機模式,ESP8266能夠在無需頻繁通信時降低功耗,從而優(yōu)化系統(tǒng)的能源使用。
ESP8266-WIFI模塊因其高集成度、低成本、強大的WiFi功能及廣泛的兼容性,成為了物聯(lián)網(wǎng)領(lǐng)域中一個不可或缺的通信模塊。它不僅為各種嵌入式系統(tǒng)提供了便捷的無線網(wǎng)絡連接方案,還極大簡化了開發(fā)過程,使得開發(fā)者能夠?qū)W⒂诤诵墓δ艿膶崿F(xiàn)。本項目采用ESP8266模塊,便捷地實現(xiàn)了STM32與Android手機APP之間的實時數(shù)據(jù)傳輸,為健康檢測儀提供了可靠的無線通信能力。
【2】MQ135傳感器
MQ135氣體傳感器是一款常用于空氣質(zhì)量檢測的模擬型傳感器模塊,能夠檢測多種有害氣體的存在與濃度,包括氨氣(NH?)、硫化物(如H?S)、苯蒸氣、煙霧、酒精、甲醛(HCHO)、二氧化碳(CO?)等。由于其靈敏度高、響應速度快、使用方便,廣泛應用于空氣凈化器、環(huán)境監(jiān)測儀、智能家居及工業(yè)安全系統(tǒng)中。
該模塊的核心元件是MQ135氣敏電阻,其內(nèi)部由氧化錫(SnO?)為敏感材料組成。當目標氣體濃度增加時,傳感器內(nèi)部的電導率會發(fā)生變化,從而在輸出端產(chǎn)生相應的電壓變化。模塊一般帶有模擬電壓輸出(AO),有些版本還配有數(shù)字比較電路和可調(diào)電位器,可通過DO引腳輸出高低電平信號,用于閾值判斷。
MQ135的工作電壓通常為5V,預熱時間較長(一般為24~48小時),這對于其穩(wěn)定性和準確性有重要影響。在使用過程中,建議搭配STM32等微控制器的ADC模塊讀取其模擬輸出電壓,然后結(jié)合校準公式或查表方式換算出相對氣體濃度值。由于傳感器對溫度和濕度較敏感,因此建議在使用時進行環(huán)境補償或通過多點校準提高精度。
MQ135氣體傳感器具有成本低、應用靈活、支持多種有害氣體檢測的優(yōu)點,非常適合用于本項目的工業(yè)倉庫空氣質(zhì)量監(jiān)控場景,能夠在第一時間發(fā)現(xiàn)有害氣體泄漏,為環(huán)境安全提供有效保障。
【3】SHT30模塊
SHT30數(shù)字溫濕度傳感器是一款高精度、穩(wěn)定性強的環(huán)境溫濕度檢測傳感器模塊,廣泛應用于氣象監(jiān)測、智能家居、工業(yè)自動化等領(lǐng)域。該傳感器由Sensirion公司設計,集成了溫度和濕度測量功能,并內(nèi)置數(shù)字信號處理電路,直接輸出數(shù)字化測量數(shù)據(jù),極大地簡化了與微控制器的接口設計。
SHT30采用I2C通信接口,支持標準的I2C協(xié)議,方便與STM32等主控芯片連接。其測量范圍寬泛,溫度測量范圍一般為-40℃至+125℃,濕度測量范圍為0%RH至100%RH,且測量精度高,溫度誤差通常在±0.3℃左右,濕度誤差約為±2%RH,滿足工業(yè)級環(huán)境監(jiān)測需求。傳感器響應速度快,具備自我校準功能,保證了數(shù)據(jù)的準確性和穩(wěn)定性。
該模塊內(nèi)部還集成了防干擾電路和補償算法,有效抵抗環(huán)境干擾,保證測量數(shù)據(jù)的可靠性。同時,SHT30傳感器功耗低,適合長期在線監(jiān)測使用。通過讀取其數(shù)字寄存器中的數(shù)據(jù),主控芯片可以方便地獲取溫濕度值,無需復雜的模擬信號處理,提高系統(tǒng)整體的設計效率和穩(wěn)定性。
SHT30數(shù)字溫濕度傳感器模塊憑借其高精度、數(shù)字輸出、易集成的特點,是工業(yè)倉庫環(huán)境智能監(jiān)控系統(tǒng)中實現(xiàn)溫濕度實時監(jiān)測的理想選擇,為保障倉庫環(huán)境的安全與穩(wěn)定提供了堅實的傳感技術(shù)支持。
1.6 華為云服務器的屬性
本項目中上傳到華為云物聯(lián)網(wǎng)平臺的屬性字段應涵蓋所有關(guān)鍵的環(huán)境監(jiān)測數(shù)據(jù)和系統(tǒng)狀態(tài)信息,確保云端能夠完整、準確地展示與分析倉庫當前環(huán)境狀況。
上傳到華為云的屬性字段(字段名及類型):
- temperature(float)
當前溫度值(單位:℃),來自SHT30溫濕度傳感器。 - humidity(float)
當前相對濕度值(單位:%RH),來自SHT30傳感器。 - smoke_level(int 或 float)
煙霧濃度等級或模擬值,來自MQ2傳感器。 - gas_level(int 或 float)
有害氣體濃度等級或模擬值,來自MQ135傳感器。 - flame_detected(bool 或 int)
火焰檢測狀態(tài),0表示未檢測到火焰,1表示檢測到火焰(來自紅外火焰?zhèn)鞲衅鞯臄?shù)字信號)。 - fan_status(bool 或 int)
風扇運行狀態(tài),0表示關(guān)閉,1表示已啟動(繼電器控制狀態(tài))。 - buzzer_status(bool 或 int)
蜂鳴器狀態(tài),0表示關(guān)閉,1表示報警中。 - alarm_status(int)
報警狀態(tài)碼,用于表示報警原因(例如:0=正常,1=溫濕度超限,2=煙霧報警,3=火焰報警,4=氣體泄漏等)。 - timestamp(string 或 long)
數(shù)據(jù)采集時間戳,建議統(tǒng)一采用UTC格式,便于云端記錄與分析歷史數(shù)據(jù)。
可選擴展字段:
- device_id(string):設備編號,便于云端識別多個監(jiān)控終端。
- signal_strength(int):WiFi信號強度,用于監(jiān)控通信質(zhì)量。
這些字段可根據(jù)華為云IoT平臺的設備模型(產(chǎn)品模型)進行定義與映射,通過MQTT協(xié)議定期或?qū)崟r上報。字段名稱可自定義,但需在設備產(chǎn)品建模階段統(tǒng)一設定,并與STM32端代碼保持一致。上傳格式通常為JSON格式的數(shù)據(jù)結(jié)構(gòu),例如:
{
"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"
}
二、部署華為云物聯(lián)網(wǎng)平臺
華為云官網(wǎng): https://www.huaweicloud.com/
打開官網(wǎng),搜索物聯(lián)網(wǎng),就能快速找到 設備接入IoTDA
。
2.1 物聯(lián)網(wǎng)平臺介紹
華為云物聯(lián)網(wǎng)平臺(IoT 設備接入云服務)提供海量設備的接入和管理能力,將物理設備聯(lián)接到云,支撐設備數(shù)據(jù)采集上云和云端下發(fā)命令給設備進行遠程控制,配合華為云其他產(chǎn)品,幫助我們快速構(gòu)筑物聯(lián)網(wǎng)解決方案。
使用物聯(lián)網(wǎng)平臺構(gòu)建一個完整的物聯(lián)網(wǎng)解決方案主要包括3部分:物聯(lián)網(wǎng)平臺、業(yè)務應用和設備。
物聯(lián)網(wǎng)平臺作為連接業(yè)務應用和設備的中間層,屏蔽了各種復雜的設備接口,實現(xiàn)設備的快速接入;同時提供強大的開放能力,支撐行業(yè)用戶構(gòu)建各種物聯(lián)網(wǎng)解決方案。
設備可以通過固網(wǎng)、2G/3G/4G/5G、NB-IoT、Wifi等多種網(wǎng)絡接入物聯(lián)網(wǎng)平臺,并使用LWM2M/CoAP、MQTT、HTTPS協(xié)議將業(yè)務數(shù)據(jù)上報到平臺,平臺也可以將控制命令下發(fā)給設備。
業(yè)務應用通過調(diào)用物聯(lián)網(wǎng)平臺提供的API,實現(xiàn)設備數(shù)據(jù)采集、命令下發(fā)、設備管理等業(yè)務場景。
2.2 開通物聯(lián)網(wǎng)服務
地址: https://www.huaweicloud.com/product/iothub.html
開通免費單元。
點擊立即創(chuàng)建
。
正在創(chuàng)建標準版實例,需要等待片刻。
創(chuàng)建完成之后,點擊詳情。 可以看到標準版實例的設備接入端口和地址。
下面框起來的就是端口號
和域名
點擊實例名稱,可以查看當前免費單元
的配置情況。
開通之后,點擊接入信息
,也能查看接入信息。 我們當前設備準備采用MQTT協(xié)議接入華為云平臺,這里可以看到MQTT協(xié)議的地址和端口號等信息。
總結(jié):
端口號: MQTT (1883)| MQTTS (8883)
接入地址: dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com
根據(jù)域名地址得到IP地址信息:
打開Windows電腦的命令行控制臺終端,使用ping
命令。ping
一下即可。
Microsoft Windows [版本 10.0.19045.5011]
(c) Microsoft Corporation。保留所有權(quán)利。
C:UsersLenovo>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 字節(jié)的數(shù)據(jù):
來自 117.78.5.125 的回復: 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復: 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復: 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復: 字節(jié)=32 時間=37ms TTL=44
117.78.5.125 的 Ping 統(tǒng)計信息:
數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
最短 = 37ms,最長 = 37ms,平均 = 37ms
C:UsersLenovo>
MQTT協(xié)議接入端口號有兩個,1883是非加密端口,8883是證書加密端口,單片機無法加載證書,所以使用1883端口合適
。
2.3 創(chuàng)建產(chǎn)品
鏈接:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product?instanceId=03c5c68c-e588-458c-90c3-9e4c640be7af
(1)創(chuàng)建產(chǎn)品
(2)填寫產(chǎn)品信息
根據(jù)自己產(chǎn)品名字填寫,下面的設備類型選擇自定義類型。
(3)產(chǎn)品創(chuàng)建成功
創(chuàng)建完成之后點擊查看詳情。
(4)添加自定義模型
產(chǎn)品創(chuàng)建完成之后,點擊進入產(chǎn)品詳情頁面,翻到最下面可以看到模型定義。
模型簡單來說: 就是存放設備上傳到云平臺的數(shù)據(jù)。
你可以根據(jù)自己的產(chǎn)品進行創(chuàng)建。
比如:
煙霧可以叫 MQ2
溫度可以叫 Temperature
濕度可以叫 humidity
火焰可以叫 flame
其他的傳感器自己用單詞簡寫命名即可。 這就是你的單片機設備端上傳到服務器的數(shù)據(jù)名字。
先點擊自定義模型。
再創(chuàng)建一個服務ID。
接著點擊新增屬性。
2.4 添加設備
產(chǎn)品是屬于上層的抽象模型,接下來在產(chǎn)品模型下添加實際的設備。添加的設備最終需要與真實的設備關(guān)聯(lián)在一起,完成數(shù)據(jù)交互。
(1)注冊設備
(2)根據(jù)自己的設備填寫
(3)保存設備信息
創(chuàng)建完畢之后,點擊保存并關(guān)閉,得到創(chuàng)建的設備密匙信息。該信息在后續(xù)生成MQTT三元組的時候需要使用。
(4)設備創(chuàng)建完成
(5)設備詳情
2.5 MQTT協(xié)議主題訂閱與發(fā)布
(1)MQTT協(xié)議介紹
當前的設備是采用MQTT協(xié)議與華為云平臺進行通信。
MQTT是一個物聯(lián)網(wǎng)傳輸協(xié)議,它被設計用于輕量級的發(fā)布/訂閱式消息傳輸,旨在為低帶寬和不穩(wěn)定的網(wǎng)絡環(huán)境中的物聯(lián)網(wǎng)設備提供可靠的網(wǎng)絡服務。MQTT是專門針對物聯(lián)網(wǎng)開發(fā)的輕量級傳輸協(xié)議。MQTT協(xié)議針對低帶寬網(wǎng)絡,低計算能力的設備,做了特殊的優(yōu)化,使得其能適應各種物聯(lián)網(wǎng)應用場景。目前MQTT擁有各種平臺和設備上的客戶端,已經(jīng)形成了初步的生態(tài)系統(tǒng)。
MQTT是一種消息隊列協(xié)議,使用發(fā)布/訂閱消息模式,提供一對多的消息發(fā)布,解除應用程序耦合,相對于其他協(xié)議,開發(fā)更簡單;MQTT協(xié)議是工作在TCP/IP協(xié)議上;由TCP/IP協(xié)議提供穩(wěn)定的網(wǎng)絡連接;所以,只要具備TCP協(xié)議棧的網(wǎng)絡設備都可以使用MQTT協(xié)議。 本次設備采用的ESP8266就具備TCP協(xié)議棧,能夠建立TCP連接,所以,配合STM32代碼里封裝的MQTT協(xié)議,就可以與華為云平臺完成通信。
華為云的MQTT協(xié)議接入幫助文檔在這里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
業(yè)務流程:
(2)華為云平臺MQTT協(xié)議使用限制
描述 | 限制 |
---|---|
支持的MQTT協(xié)議版本 | 3.1.1 |
與標準MQTT協(xié)議的區(qū)別 | 支持Qos 0和Qos 1支持Topic自定義不支持QoS2不支持will、retain msg |
MQTTS支持的安全等級 | 采用TCP通道基礎(chǔ) + TLS協(xié)議(最高TLSv1.3版本) |
單帳號每秒最大MQTT連接請求數(shù) | 無限制 |
單個設備每分鐘支持的最大MQTT連接數(shù) | 1 |
單個MQTT連接每秒的吞吐量,即帶寬,包含直連設備和網(wǎng)關(guān) | 3KB/s |
MQTT單個發(fā)布消息最大長度,超過此大小的發(fā)布請求將被直接拒絕 | 1MB |
MQTT連接心跳時間建議值 | 心跳時間限定為30至1200秒,推薦設置為120秒 |
產(chǎn)品是否支持自定義Topic | 支持 |
消息發(fā)布與訂閱 | 設備只能對自己的Topic進行消息發(fā)布與訂閱 |
每個訂閱請求的最大訂閱數(shù) | 無限制 |
(3)主題訂閱格式
幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
對于設備而言,一般會訂閱平臺下發(fā)消息給設備 這個主題。
設備想接收平臺下發(fā)的消息,就需要訂閱平臺下發(fā)消息給設備 的主題,訂閱后,平臺下發(fā)消息給設備,設備就會收到消息。
如果設備想要知道平臺下發(fā)的消息,需要訂閱上面圖片里標注的主題。
以當前設備為例,最終訂閱主題的格式如下:
$oc/devices/{device_id}/sys/messages/down
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down
(4)主題發(fā)布格式
對于設備來說,主題發(fā)布表示向云平臺上傳數(shù)據(jù),將最新的傳感器數(shù)據(jù),設備狀態(tài)上傳到云平臺。
這個操作稱為:屬性上報。
幫助文檔地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
根據(jù)幫助文檔的介紹, 當前設備發(fā)布主題,上報屬性的格式總結(jié)如下:
發(fā)布的主題格式:
$oc/devices/{device_id}/sys/properties/report
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
發(fā)布主題時,需要上傳數(shù)據(jù),這個數(shù)據(jù)格式是JSON格式。
上傳的JSON數(shù)據(jù)格式如下:
{
"services": [
{
"service_id": <填服務ID>,
"properties": {
"<填屬性名稱1>": <填屬性值>,
"<填屬性名稱2>": <填屬性值>,
..........
}
}
]
}
根據(jù)JSON格式,一次可以上傳多個屬性字段。 這個JSON格式里的,服務ID,屬性字段名稱,屬性值類型,在前面創(chuàng)建產(chǎn)品的時候就已經(jīng)介紹了,不記得可以翻到前面去查看。
根據(jù)這個格式,組合一次上傳的屬性數(shù)據(jù):
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}
2.6 MQTT三元組
MQTT協(xié)議登錄需要填用戶ID,設備ID,設備密碼等信息,就像我們平時登錄QQ,微信一樣要輸入賬號密碼才能登錄。MQTT協(xié)議登錄的這3個參數(shù),一般稱為MQTT三元組。
接下來介紹,華為云平臺的MQTT三元組參數(shù)如何得到。
(1)MQTT服務器地址
要登錄MQTT服務器,首先記得先知道服務器的地址是多少,端口是多少。
幫助文檔地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home
MQTT協(xié)議的端口支持1883和8883,它們的區(qū)別是:8883 是加密端口更加安全。但是單片機上使用比較困難,所以當前的設備是采用1883端口進連接的。
根據(jù)上面的域名和端口號,得到下面的IP地址和端口號信息: 如果設備支持填寫域名可以直接填域名,不支持就直接填寫IP地址。 (IP地址就是域名解析得到的)
華為云的MQTT服務器地址:117.78.5.125
華為云的MQTT端口號:1883
如何得到IP地址?如何域名轉(zhuǎn)IP? 打開Windows的命令行輸入以下命令。
ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
(2)生成MQTT三元組
華為云提供了一個在線工具,用來生成MQTT鑒權(quán)三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打開這個工具,填入設備的信息(也就是剛才創(chuàng)建完設備之后保存的信息),點擊生成,就可以得到MQTT的登錄信息了。
下面是打開的頁面:
填入設備的信息: (上面兩行就是設備創(chuàng)建完成之后保存得到的)
直接得到三元組信息。
得到三元組之后,設備端通過MQTT協(xié)議登錄鑒權(quán)的時候,填入?yún)?shù)即可。
ClientId 663cb18871d845632a0912e7_dev1_0_0_2024050911
Username 663cb18871d845632a0912e7_dev1
Password 71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237
2.7 模擬設備登錄測試
經(jīng)過上面的步驟介紹,已經(jīng)創(chuàng)建了產(chǎn)品,設備,數(shù)據(jù)模型,得到MQTT登錄信息。 接下來就用MQTT客戶端軟件模擬真實的設備來登錄平臺。測試與服務器通信是否正常。
MQTT軟件下載地址【免費】: https://download.csdn.net/download/xiaolong1126626497/89928772
(1)填入登錄信息
打開MQTT客戶端軟件,對號填入相關(guān)信息(就是上面的文本介紹)。然后,點擊登錄,訂閱主題,發(fā)布主題。
(2)打開網(wǎng)頁查看
完成上面的操作之后,打開華為云網(wǎng)頁后臺,可以看到設備已經(jīng)在線了。
點擊詳情頁面,可以看到上傳的數(shù)據(jù):
到此,云平臺的部署已經(jīng)完成,設備已經(jīng)可以正常上傳數(shù)據(jù)了。
(3)MQTT登錄測試參數(shù)總結(jié)
MQTT服務器: 117.78.5.125
MQTT端口號: 183
//物聯(lián)網(wǎng)服務器的設備信息
#define MQTT_ClientID "663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define MQTT_UserName "663cb18871d845632a0912e7_dev1"
#define MQTT_PassWord "71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"
//訂閱與發(fā)布的主題
#define SET_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down" //訂閱
#define POST_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report" //發(fā)布
發(fā)布的數(shù)據(jù):
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}
2.8 創(chuàng)建IAM賬戶
創(chuàng)建一個IAM賬戶,因為接下來開發(fā)上位機,需要使用云平臺的API接口,這些接口都需要token進行鑒權(quán)。簡單來說,就是身份的認證。 調(diào)用接口獲取Token時,就需要填寫IAM賬號信息。所以,接下來演示一下過程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
**【1】獲取項目憑證 ** 點擊左上角用戶名,選擇下拉菜單里的我的憑證
項目憑證:
28add376c01e4a61ac8b621c714bf459
【2】創(chuàng)建IAM用戶
鼠標放在左上角頭像上,在下拉菜單里選擇統(tǒng)一身份認證
。
點擊左上角創(chuàng)建用戶
。
創(chuàng)建成功:
【3】創(chuàng)建完成
用戶信息如下:
主用戶名 l19504562721
IAM用戶 ds_abc
密碼 DS12345678
2.9 獲取影子數(shù)據(jù)
幫助文檔:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html
設備影子介紹:
設備影子是一個用于存儲和檢索設備當前狀態(tài)信息的JSON文檔。
每個設備有且只有一個設備影子,由設備ID唯一標識
設備影子僅保存最近一次設備的上報數(shù)據(jù)和預期數(shù)據(jù)
無論該設備是否在線,都可以通過該影子獲取和設置設備的屬性
簡單來說:設備影子就是保存,設備最新上傳的一次數(shù)據(jù)。
我們設計的軟件里,如果想要獲取設備的最新狀態(tài)信息,就采用設備影子接口。
如果對接口不熟悉,可以先進行在線調(diào)試:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow
在線調(diào)試接口,可以請求影子接口,了解請求,與返回的數(shù)據(jù)格式。
調(diào)試完成看右下角的響應體,就是返回的影子數(shù)據(jù)。
設備影子接口返回的數(shù)據(jù)如下:
{
"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
}
]
}
調(diào)試成功之后,可以得到訪問影子數(shù)據(jù)的真實鏈接,接下來的代碼開發(fā)中,就采用Qt寫代碼訪問此鏈接,獲取影子數(shù)據(jù),完成上位機開發(fā)。
鏈接如下:
https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow
三、Qt開發(fā)入門與環(huán)境搭建
當前項目的上位機是采用Qt開發(fā)的,這一章節(jié)主要是介紹Qt開發(fā)環(huán)境的安裝,以及Qt開發(fā)環(huán)境入門的使用。如果你Qt沒有任何基礎(chǔ),建議仔細看一遍。
3.1 Qt是什么?
Qt 是一個功能強大、跨平臺的應用程序開發(fā)框架,主要用于創(chuàng)建圖形用戶界面(GUI)應用程序,但它不僅僅局限于GUI編程。它由挪威的奇趣科技(TrollTech)最初于1991年開發(fā),并在后續(xù)的發(fā)展歷程中經(jīng)歷了多次所有權(quán)變更,包括諾基亞和Digia等公司接手,現(xiàn)在Qt屬于The Qt Company所有。
Qt 主要特點和優(yōu)勢包括:
(1)跨平臺:Qt 支持多種操作系統(tǒng),開發(fā)者可以使用同一份源代碼在不同平臺上編譯運行,如Windows、Linux、macOS、Android以及各種嵌入式系統(tǒng)(如RTOS),實現(xiàn)“一次編寫,到處編譯”。
(2)C++ 開發(fā):Qt 的核心是基于C++編程語言構(gòu)建,提供了一套豐富的類庫,通過面向?qū)ο蟮脑O計方式簡化了開發(fā)過程。
(3)圖形用戶界面:Qt 提供了完整的GUI組件集,包含窗口、按鈕、標簽、文本框等各種標準控件,以及布局管理器、樣式表等功能,使得開發(fā)者能夠高效地創(chuàng)建美觀且功能完善的桌面應用或移動應用界面。
(4)工具鏈完整:Qt 包含一系列集成開發(fā)環(huán)境(IDE)和輔助工具,例如Qt Creator是一個全能的跨平臺IDE,Qt Designer用于可視化拖拽設計UI界面,Qt Linguist支持國際化資源文件的翻譯,還有Qt Assistant和大量文檔資源方便開發(fā)者的使用。
(5)非GUI功能豐富:除了GUI功能外,Qt 還提供了眾多非圖形化功能模塊,如網(wǎng)絡通信、數(shù)據(jù)庫訪問、XML處理、多媒體處理(音頻視頻)、文件I/O、線程與并發(fā)處理、OpenGL和3D圖形渲染等。
(6)元對象系統(tǒng):Qt 使用元對象系統(tǒng)(Meta-Object System, MOC)實現(xiàn)了信號與槽機制(Signals and Slots),這是一種高級事件處理機制,允許在不同對象之間安全地進行異步通信。
(7)可擴展性與靈活性:Qt 架構(gòu)高度靈活,支持插件體系結(jié)構(gòu),開發(fā)者可以根據(jù)需要自定義組件并輕松地集成到Qt應用中。
Qt 以其強大的跨平臺能力和全面的功能集合成為許多企業(yè)和個人開發(fā)者選擇用來開發(fā)高性能、高穩(wěn)定性的應用程序的重要工具之一,被廣泛應用于各類桌面軟件、嵌入式設備、移動應用以及服務器端組件等領(lǐng)域。
3.2 Qt版本介紹
在Qt發(fā)行版本中將要涉及兩個版本:Qt商業(yè)授權(quán)和Qt開源授權(quán)。
(1)Qt商業(yè)授權(quán)是設計商業(yè)軟件的開發(fā)環(huán)境,這些商業(yè)軟件使用了傳統(tǒng)的商業(yè)來發(fā)布,它包含了一些更新的功能、技術(shù)上的支持和大量的解決方案,開發(fā)了使用于行業(yè)的一些特定的組件,有一些特殊的功能只在商業(yè)用戶中使用。
(2)Qt開源授權(quán)是用來開發(fā)開源的軟件,它提供了一些免費的支持,并遵循QPL協(xié)議。
開放源代碼是免費的軟件,不牽涉用戶的某些權(quán)益。任何人都有使用開源軟件和參與它的修改的機會,這就意味著其他的人同樣可獲得你開發(fā)的代碼。目前 Qt 的開源授權(quán)有兩種,一種是 GPL 授權(quán),另一種是 LGPL 授權(quán)。
3.3 Qt開發(fā)環(huán)境安裝
Qt的中文官網(wǎng): 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
軟件安裝時斷網(wǎng)安裝,否則會提示輸入賬戶。
如果下載不了,可以在網(wǎng)盤里找到安裝包下載: 飛書文檔記錄的網(wǎng)盤地址:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
安裝的時候,第一個復選框里勾選一個mingw 32
編譯器即可,其他的不管默認就行,直接點擊下一步繼續(xù)安裝。
選擇MinGW 32-bit 編譯器:
3.4 開發(fā)第一個QT程序
在QT開發(fā)過程中,可以手動編寫代碼也可以使用UI設計師直接拖拽控件的方式編寫界面和布局,在實際的開發(fā)過程中一般是兩種方式結(jié)合使用,提高開發(fā)效率。
本小節(jié)用一個簡單的 “Hello QT” 程序介紹一下使用QtCreator新建工程的步驟。
(1)打開QtCreator軟件,選擇New Project,新建一個工程。
(2)項目模板選擇QT Widgets Application
(3)設置項目名稱和存放路徑
注意:QT項目路徑和名稱不能出現(xiàn)中文字符。
(4)編譯工具套件選擇
編譯工具套件可以后面自己增加,比如增加Android的。套件是指 Qt 程序從編譯鏈接到運行環(huán)境的全部工具和 Qt 類庫的集合。
(5)設置生成的類信息
在類信息設置界面選擇基類,目前有三種基類:QMainWindow,QWidget,QDialog。在基類里選擇QMainWindow,類名和文件名會根據(jù)基類自動修改,一般不需要修改,默認即可。
(6)項目管理
在項目管理界面可以設置作為子項目,以及加入版本控制系統(tǒng)。這兩個功能暫時用不到,都用默認的 ,然后點擊 “完成”。
(7)創(chuàng)建完成
(8) 編輯代碼
展開main.cpp文件,添加內(nèi)容如下:
#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函數(shù)的標準寫法。
3) QApplication a(argc, argv):創(chuàng)建一個QApplication對象,用于管理應用程序的資源,QApplication類的構(gòu)造函數(shù)需要兩個參數(shù)。
4) QLabel *label =new QLabel("Hello Qt!") :創(chuàng)建QLabel窗口部件,QLabel是一個Qt提供的窗口部件,可以用來顯示一行文本。
5) label->setGeometry(400,100,100,20) : 設置控件顯示的位置。
6) label->show():使Qlabel創(chuàng)建的窗口可見,就是顯示設置的文本。
7) return a.exec():應用程序?qū)⒖刂茩?quán)傳遞給QT,讓程序進入消息循環(huán)。等待可能的菜單,工具條,鼠標等的輸入,進行響應。
(9)行程序
運行程序可以點擊左下角的三角形符號或者按下快捷鍵Ctrl+R。
3.5 調(diào)試輸出
QT中使用QDebug類輸出調(diào)試信息。主要用于調(diào)試代碼,類似于std::cout的替代品,支持QT的數(shù)據(jù)類型。使用前需要包含頭文件。
調(diào)試輸出的分類
qDebug | 調(diào)試信息提示 |
---|---|
qWarning | 一般的警告提示 |
qCritical | 嚴重錯誤提示 |
qFatal | 致命錯誤提示 |
示例代碼:
qDebug("調(diào)試信息輸出");
qWarning("一般警告信息輸出");
qCritical("嚴重錯誤輸出");
qFatal("致命錯誤輸出");
qDebug輸出的信息會打印到QT軟件下邊的輸出面板。
在上節(jié)的HelloQt工程上加上調(diào)試輸出代碼,增加的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調(diào)試信息輸出";
int data_int=8888;
qDebug()<<data_int;
float data_float=123.888;
qDebug()<<data_float;
return a.exec();
}
運行程序,觀察輸出的調(diào)試信息:
3.6 QT Creator常用的快捷鍵
掌握一些適用的快捷鍵,可以提高程序開發(fā)的效率。
(1)F1 鍵,快速切換光標選中的函數(shù)或者類的幫助信息,按一次半屏顯示,按下兩次全屏顯示。
(2)F2 鍵,快速切換到光標選中的函數(shù)或者類的源碼定義處。
(3)F4鍵,快速在源文件和頭文件之間切換。
(4)Ctrl(按住)+ Tab,快速切換已打開的文件
(5)Ctrl+ I ,縮進光標選中行代碼(自動與上層代碼對齊)。
(6)Ctrl + / ,快速注釋或者取消注釋光標選中行。
(7)快速修改全局變量名
鼠標光標選中變量名,按下Ctrl+Shift+R,當變量名稱出現(xiàn)紅色框表示已經(jīng)激活全局修改功能。修改一處,整個工程對應變量名稱全部會修改。修改完畢之后,光標移開,再按下Ctrl+Shift+R保存修改。
(8)快速修改全局函數(shù)名
快捷方式與變量修改一樣按下Ctrl+Shift+R,一處修改整個工程對應的函數(shù)名稱也會跟著改。選中函數(shù)后,按下Ctrl+Shift+R后整個工程的對應的函數(shù)名會高亮,并且在軟件下方彈出修改框。
3.7 QT幫助文檔
Qt 幫助文檔太多,難以全部翻譯成中文,即使翻譯了一部分,翻譯花的時間太多,翻譯更新的時效性也難以保證,最終還是得看英文幫助,QtCreator 集成了幫助系統(tǒng),查找非常方便。
打開QtCreator,選擇菜單欄的最左邊的幫助選項,界面如下:
(1)查看Qlabel控件的幫助信息:
3.8 UI設計師使用
上節(jié)的Hello QT程序使用純C++代碼編寫,這一節(jié)使用QT界面設計模式實現(xiàn)與上一節(jié)Hello QT程序
一樣的功能。仿照著上節(jié)新創(chuàng)建一個工程。雙擊打開mainwindow.ui
文件,進入到UI設計界面。
(1)拖一個Label控件到編輯區(qū),雙擊Label控件可以修改文本內(nèi)容。
(2)運行程序可以點擊左下角的三角形符號或者按下快捷鍵Ctrl+R。
(3)UI設計師界面功能介紹
3.9 按鈕控件組
QT Creator UI設計師界面的按鈕組截圖如下:
以下是對按鈕組控件的一些功能介紹:
(1)Push Button按壓按鈕:最普通的按鈕,按(點擊)按鈕命令計算機執(zhí)行一些動作,或者回答問題,比如windows開始菜單里的重啟,注銷,關(guān)機等按鈕。
(2)Tool Button工具按鈕:工具按鈕通常是一個集合,一般集成在工具欄里。比如打開,保存,復制,粘貼,剪切等常用的操作。
(3)Radio Button單選按鈕:單選按鈕通常是兩個以上的形式出現(xiàn)在一塊,按鈕之間有互斥關(guān)系,每次只能選中一個。比如:一個人的性別只能選擇一個,不能同時是男性又是女性。
(4)Check Box復選框:復選框與單選按鈕概念相反,復選框通常表示多個可以同時存在的選項,比如一個人可以同時擁有多個愛好,比如讀書、看電影、爬山、游泳等。
(5)Command Link Button命令鏈接按鈕:一般用來打開的窗口或者網(wǎng)頁鏈接。
(6)Dialog Button Box標準按鈕盒:標準按鈕盒通常用于對話框程序;比如:常見的確認對話框有 “確定”“取消”等標準按鈕,Qt 將這些典型的按鈕做成標準按鈕盒,并將相應的信號加以封裝,方便程序員使用。
3.10 布局控件組
開發(fā)一個圖形界面應用程序,界面的布局影響到界面的美觀。前面的程序中都是使用UI界面拖控件,如果有多個按鈕,會出現(xiàn)大小難調(diào)整、位置難對齊等問題。Qt 提供的“布局管理“就很好的解決了控件擺放的問題。
以下是UI設計師界面的布局相關(guān)控件組:
功能介紹:
(1)Vertical Layout:垂直布局
(2)Horizontal Layout:水平布局
(3)Grid Layout:網(wǎng)格布局
(4)Form Layout:窗體中布局
(5)Horizontal Spacers:水平空格,在布局中用來占位。
(6)Vertical Spacer:垂直空格,在布局中用來占位。
3.11 基本布局控件
在UI設計界面添加一個布局控件,然后將需要布局的其他控件放入布局控件中即可完成布局,布局控件可以互相嵌套使用。(本節(jié)只介紹基本布局控件的使用)
以下是4種布局控件的效果:
3.12 UI設計師的布局功能
在UI設計界面的左上角有一排快捷的布局選項,使用時選中兩個以上的控件,點擊其中一種布局方式就可以切換布局。
以下為布局的簡單示例圖:
(1)為布局的選項。
(2)控件層次圖,可以看到控件的布局擺放層次。
如果想要控制某個控件的固定大小,不隨著布局改變大小,可以限定最大最小尺寸。選中控件鼠標右鍵–>大小限定->設置大小。
水平布局與垂直布局:
水平布局將控件按照水平方式擺放,垂直布局將控件按照垂直方式擺放。鼠標拖動紅色布局框上的黑色方點,可以調(diào)整布局框的大小。隨著布局框的尺寸變化,包含的控件高度不會變化,寬度會隨著布局框變化。選中其中一個控件然后鼠標右鍵>點擊大小限定,可以限定控件的最大和最小尺寸。
分裂器水平布局與垂直布局:
分裂器方式布局,包含控件的高度和寬度都會隨著布局框的拉伸而改變。選中其中一個控件然后鼠標右鍵>點擊大小限定,可以限定控件的最大和最小尺寸。
窗體中布局與柵格布局:
柵格(網(wǎng)格)布局器的基本單元是單元格,而窗體中布局(表單)的基本單元是行。隨著布局框的尺寸變化,包含的控件高度不會變化,寬度會隨著布局框變化。
設置主窗體布局方式:
設置主窗體的布局方式后,包含在主窗體內(nèi)的控件會隨著窗體的拉伸自動調(diào)整大小。
四、上位機開發(fā)
4.1 Qt開發(fā)環(huán)境安裝
Qt的中文官網(wǎng): https://www.qt.io/zh-cn/
QT5.12.6的下載地址:https://download.qt.io/archive/qt/5.12/5.12.6
打開下載鏈接后選擇下面的版本進行下載:
如果下載不了,可以在網(wǎng)盤里找到安裝包下載: 飛書文檔記錄的網(wǎng)盤地址:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
軟件安裝時斷網(wǎng)安裝,否則會提示輸入賬戶。
安裝的時候,第一個復選框里的編譯器可以全選,直接點擊下一步繼續(xù)安裝。
選擇編譯器: (一定要看清楚了)
4.2 新建上位機工程
前面2講解了需要用的API接口,接下來就使用Qt設計上位機,設計界面,完成整體上位機的邏輯設計。
【1】新建工程
【2】設置項目的名稱。
【3】選擇編譯系統(tǒng)
【4】選擇默認繼承的類
【5】選擇編譯器
【6】點擊完成
【7】工程創(chuàng)建完成
4.3 切換編譯器
在左下角是可以切換編譯器的。 可以選擇用什么樣的編譯器編譯程序。
目前新建工程的時候選擇了2種編譯器。 一種是mingw32
這個編譯Windows下運行的程序。 一種是Android
編譯器,可以生成Android
手機APP。
不過要注意:Android的編譯器需要配置一些環(huán)境才可以正常使用,這個大家可以網(wǎng)上找找教程配置一下就行了。
windows的編譯器就沒有這么麻煩,安裝好Qt就可以編譯使用。
下面我這里就選擇的 mingw32
這個編譯器,編譯Windows下運行的程序。
4.4 編譯測試功能
創(chuàng)建完畢之后,編譯測試一下功能是否OK。
點擊左下角的綠色三角形按鈕
。
正常運行就可以看到彈出一個白色的框框。這就表示工程環(huán)境沒有問題了。 接下來就可以放心的設計界面了。
4.5 設計UI界面與工程配置
【1】打開UI文件
打開默認的界面如下:
【2】開始設計界面
根據(jù)自己需求設計界面。
4.6 設計代碼
【1】獲取token
調(diào)用華為云的API都需要填token參數(shù),先看幫助文章,了解如何獲取token。
幫助文檔:https://support.huaweicloud.com/api-iam/iam_30_0001.html
根據(jù)幫助文檔,寫完成下面代碼編寫:
這段代碼的功能是通過華為云IAM服務獲取Token,以便后續(xù)調(diào)用華為云API時使用。以下是代碼的詳細功能解釋:
1. 設置功能標識
function_select = 3;
function_select
是一個標識變量,用于區(qū)分當前請求的功能類型。這里設置為3,表示當前請求是獲取Token。
2. 構(gòu)造請求URL
QString requestUrl;
QNetworkRequest request;
// 設置請求地址
QUrl url;
// 獲取token請求地址
requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
.arg(SERVER_ID);
- 構(gòu)造獲取Token的請求URL,URL格式為:
https://iam.{SERVER_ID}.myhuaweicloud.com/v3/auth/tokens
。 SERVER_ID
是華為云服務器的區(qū)域ID(如cn-north-1
),通過QString
的arg
方法動態(tài)替換到URL中。
3. 設置請求頭
// 設置數(shù)據(jù)提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));
- 設置HTTP請求頭,指定請求體的數(shù)據(jù)格式為
application/json;charset=UTF-8
,表示發(fā)送的數(shù)據(jù)是JSON格式。
4. 設置請求URL
// 構(gòu)造請求
url.setUrl(requestUrl);
request.setUrl(url);
- 將構(gòu)造好的URL設置到
QUrl
對象中,并將其綁定到QNetworkRequest
對象。
5. 構(gòu)造請求體
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);
- 構(gòu)造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
方法動態(tài)替換請求體中的變量(如MAIN_USER
、IAM_USER
等)。
6. 發(fā)送HTTP POST請求
// 發(fā)送請求
manager->post(request, text.toUtf8());
- 使用
QNetworkAccessManager
的post
方法發(fā)送HTTP POST請求。 request
是構(gòu)造好的請求對象,text.toUtf8()
是將請求體轉(zhuǎn)換為UTF-8編碼的字節(jié)數(shù)組。
7. 總結(jié)
這段代碼的核心功能是:
- 構(gòu)造獲取Token的HTTP請求:包括請求URL、請求頭和請求體。
- 發(fā)送請求:通過
QNetworkAccessManager
發(fā)送POST請求,向華為云IAM服務請求Token。 - Token的作用:獲取到的Token將用于后續(xù)調(diào)用華為云API時的身份驗證。
通過這段代碼,QT上位機能夠獲取華為云的Token,為后續(xù)的設備數(shù)據(jù)查詢、控制等操作提供身份驗證支持。
【2】獲取影子數(shù)據(jù)
前面章節(jié)介紹了影子數(shù)據(jù)獲取接口。下面是對應編寫的代碼:
這段代碼的功能是向華為云IoT平臺查詢設備的屬性信息(設備狀態(tài))。以下是對代碼的詳細功能含義解釋:
代碼功能含義解釋:
(1)function_select = 0;
- 這行代碼設置
function_select
為0,表示當前操作是查詢設備屬性。這個變量用于標識不同的操作,可以幫助后續(xù)根據(jù)不同的操作類型執(zhí)行不同的處理邏輯。
(2)QString requestUrl; QNetworkRequest request;
requestUrl
:用于存儲請求的URL地址,后續(xù)將構(gòu)造一個用于查詢設備屬性的URL。request
:用來封裝HTTP請求的對象,包含請求的所有信息,包括請求頭、URL等。
(3)QUrl url;
url
:用于存儲并處理請求的URL對象,確保請求使用正確的地址。
(4)構(gòu)造請求URL:
requestUrl = QString("https://%1:443/v5/iot/%2/devices/%3/shadow")
.arg(IP_ADDR)
.arg(PROJECT_ID)
.arg(device_id);
這行代碼構(gòu)建了一個URL,用于查詢設備的狀態(tài)(屬性)。URL包括了:
IP_ADDR:華為云IoT平臺的IP地址或域名。
PROJECT_ID:項目的ID,用于區(qū)分不同的項目。
device_id:設備的唯一標識符,用于查詢指定設備的屬性。
:443
指定使用HTTPS協(xié)議(端口443)進行安全通信。
最終構(gòu)造出的URL形如:https://<IP_ADDR>:443/v5/iot/<PROJECT_ID>/devices/<device_id>/shadow
,這是查詢設備狀態(tài)的API接口。
(1)request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
- 設置請求頭的內(nèi)容類型為
application/json
,表明請求體中的數(shù)據(jù)格式是JSON。
(2)request.setRawHeader("X-Auth-Token", Token);
- 設置請求頭中的
X-Auth-Token
字段,傳遞身份驗證令牌(Token
)。這個令牌用于驗證請求的合法性,確保只有授權(quán)的用戶可以查詢設備的狀態(tài)。
(3)url.setUrl(requestUrl);
- 將前面構(gòu)建好的請求URL賦值給
url
對象,確保后續(xù)的請求使用正確的URL。
(4)request.setUrl(url);
- 將
url
對象設置到request
對象中,準備發(fā)送請求。
(5)manager->get(request);
- 使用
QNetworkAccessManager
的get
方法發(fā)送GET請求,查詢設備的屬性。request
中包含了URL、請求頭以及Token等信息,服務器接收到請求后將返回設備的屬性信息(如設備狀態(tài)、屬性值等)。
代碼整體功能:
該代碼實現(xiàn)了通過華為云IoT平臺的API查詢設備的屬性信息。具體步驟包括:
- 構(gòu)造查詢設備屬性的API請求URL。
- 設置請求頭,指定數(shù)據(jù)格式為JSON,并傳遞Token進行身份驗證。
- 使用
QNetworkAccessManager
發(fā)送GET請求,向服務器請求設備的狀態(tài)數(shù)據(jù)。 - 服務器將返回設備的屬性數(shù)據(jù),供后續(xù)處理。
總結(jié):
這段代碼的功能是向華為云IoT平臺查詢指定設備的屬性信息,并通過GET請求將設備的狀態(tài)返回給客戶端。通過Token進行身份驗證,確保請求的合法性。
【3】解析數(shù)據(jù)更新界面
根據(jù)接口返回的數(shù)據(jù)更新界面。
【4】判斷設備是否離線
這段代碼用于判斷設備是否離線。通過獲取設備上傳到服務器數(shù)據(jù)的時間與本地的系統(tǒng)時間差進行對比。
這段代碼的核心功能是通過比較設備上傳數(shù)據(jù)的時間和本地系統(tǒng)時間來判斷設備是否處于離線狀態(tài),以下是其詳細解釋:
(1)功能分析
顯示最新更新時間
ui->label_update_time->setText("最新時間:" + update_time);
將設備上傳的最新時間 update_time
顯示在界面上的 label_update_time
控件中,格式為 最新時間:yyyy-MM-dd HH:mm:ss
。
方便用戶了解設備數(shù)據(jù)的最近更新時間。
獲取本地當前時間
QDateTime currentDateTime = QDateTime::currentDateTime();
使用 QDateTime::currentDateTime()
獲取系統(tǒng)當前時間,作為對比基準。
計算時間差
qint64 secondsDiff = currentDateTime.secsTo(dateTime);
secsTo
: 計算 currentDateTime
和設備上傳時間 dateTime
之間的時間差(單位:秒)。
dateTime
是通過解析 JSON 數(shù)據(jù)提取到的設備數(shù)據(jù)上傳時間,并已轉(zhuǎn)換為本地時間格式。
判斷設備狀態(tài)
if (qAbs(secondsDiff) >= 5 * 60)
使用 qAbs
獲取時間差的絕對值。
如果時間差超過 5 分鐘(300秒),表示設備長時間未上傳數(shù)據(jù),判定為“離線”。
(2)離線處理
更新狀態(tài)顯示
ui->label_dev_state->setText("設備狀態(tài):離線");
在界面 label_dev_state
控件中顯示設備當前狀態(tài)為“離線”。
(3)在線處理
狀態(tài)更新ui->label_dev_state->setText("設備狀態(tài):在線");
如果時間差小于 5 分鐘,顯示“設備狀態(tài):在線”。
【5】獲取設備最新數(shù)據(jù)上傳時間
這是解析華為云API接口返回的數(shù)據(jù),解析出來里面設備數(shù)據(jù)的時間,進行顯示。
這段代碼的主要作用是解析華為云 API 返回的 JSON 數(shù)據(jù)中的設備數(shù)據(jù)時間字段,轉(zhuǎn)換為本地時間格式,并最終以用戶友好的標準格式輸出到界面。
(1)詳細代碼解析
(1)提取時間字段
QString event_time = obj3.take("event_time").toString();
qDebug() << "event_time:" << event_time;
obj3.take("event_time")
:從 JSON 數(shù)據(jù)中的 reported
對象提取 event_time
字段,值為一個字符串,表示設備上傳數(shù)據(jù)的時間。
toString()
:將提取的字段值轉(zhuǎn)換為 QString
類型,便于后續(xù)操作。
調(diào)試輸出:使用 qDebug()
輸出提取的時間值,例如:20231121T120530Z
。
2. 轉(zhuǎn)換為 QDateTime
對象
QDateTime dateTime = QDateTime::fromString(event_time, "yyyyMMddTHHmmssZ");
QDateTime::fromString
:
使用指定格式解析 event_time
字符串為 QDateTime
對象。
格式說明:
yyyyMMdd
: 年、月、日(如20231121
)。T
: 時間部分的分隔符(固定為T
)。HHmmss
: 時、分、秒(如120530
)。Z
: 表示時間是 UTC 時間。- 如果時間字符串格式不匹配,會返回一個無效的
QDateTime
對象。
3. 轉(zhuǎn)換時區(qū)到本地時間
dateTime.setTimeSpec(Qt::UTC);
dateTime = dateTime.toLocalTime();
setTimeSpec(Qt::UTC)
:
- 明確告知
dateTime
對象,當前時間是 UTC 時間。 - 確保時間轉(zhuǎn)換準確,避免因為默認時區(qū)不明確導致的誤差。
toLocalTime()
:
- 將時間從 UTC 轉(zhuǎn)換為本地時區(qū)時間,例如中國標準時間(CST, UTC+8)。
4. 格式化輸出為標準時間字符串
QString update_time = dateTime.toString("yyyy-MM-dd HH:mm:ss");
toString()
:將 QDateTime
轉(zhuǎn)換為指定格式的字符串。
格式說明:
yyyy-MM-dd
: 年-月-日。HH:mm:ss
: 小時:分鐘:秒。
示例結(jié)果:2023-11-21 20:05:30
。
用戶顯示友好性:轉(zhuǎn)換后的格式易讀,符合國際通用的日期時間表示規(guī)范。
(2)代碼運行效果
假設 API 返回的時間字段值為 20231121T120530Z
。
轉(zhuǎn)換流程:
- 解析為
QDateTime
對象:2023-11-21 12:05:30 (UTC)
; - 轉(zhuǎn)換為本地時間:
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環(huán)境
如果想編譯Android手機APP,必須要先自己配置好自己的Android環(huán)境。(搭建環(huán)境的過程可以自行百度搜索學習)
然后才可以進行下面的步驟。
【1】選擇Android編譯器
選擇編譯器。
切換編譯器。
【2】創(chuàng)建Android配置文件
創(chuàng)建完成。
【3】配置Android圖標與名稱
根據(jù)自己的需求配置 Android圖標與名稱。
【3】編譯Android上位機
Qt本身是跨平臺的,直接選擇Android的編譯器,就可以將程序編譯到Android平臺。
然后點擊構(gòu)建。
成功之后,在目錄下可以看到生成的apk
文件,也就是Android手機的安裝包,電腦端使用QQ
發(fā)送給手機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 設備仿真調(diào)試
通過MQTT客戶端模擬設備登錄華為云服務器。進行設備聯(lián)調(diào),實現(xiàn)數(shù)據(jù)上傳和下發(fā)測試。
五、STM32代碼設計
5.1 硬件連線說明
1. 主控芯片:STM32F103C8T6
作為系統(tǒng)核心,負責傳感器數(shù)據(jù)采集、控制邏輯處理、通信傳輸及執(zhí)行模塊驅(qū)動。
2. 溫濕度傳感器SHT30(I2C接口)
- SCL連接STM32的PB6(I2C1_SCL)
- SDA連接STM32的PB7(I2C1_SDA)
- 電源VCC接5V或3.3V,GND接地
I2C總線用于數(shù)字溫濕度數(shù)據(jù)通信。
3. 煙霧傳感器MQ2(模擬信號輸出)
- 模擬輸出端連接STM32的PA0(ADC1_IN0)
- VCC接5V,GND接地
通過ADC采集煙霧濃度的模擬電壓值。
4. 火焰?zhèn)鞲衅鳎〝?shù)字高低電平輸出)
- 信號輸出連接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通信,實現(xiàn)數(shù)據(jù)傳輸。注意電平匹配,必要時使用電平轉(zhuǎn)換。
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(數(shù)據(jù)/命令) → PB1 (GPIO輸出)
- RESET → PB10 (GPIO輸出)
- VCC接3.3V,GND接地
8. 繼電器風扇控制模塊
- 繼電器控制信號連接STM32的PB12(GPIO輸出)
- 繼電器電源與12V風扇供電獨立,GND與STM32共地
控制繼電器通斷以啟動或關(guān)閉風扇。
9. 蜂鳴器報警模塊
- 控制引腳連接STM32的PB13(GPIO輸出)
- VCC接5V,GND接地
通過高電平控制蜂鳴器發(fā)聲報警。
5.2 傳感器代碼
// STM32F103C8T6 寄存器編程示例代碼(部分)
// 實現(xiàn):SHT30(I2C),MQ2和MQ135(ADC),火焰?zhèn)鞲衅鳎℅PIO輸入)
#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;
}
// 發(fā)送地址(寫)
void I2C_SendAddress_Write(uint8_t addr)
{
I2C1->DR = addr & 0xFE;
while (!(I2C1->SR1 & I2C_SR1_ADDR));
(void)I2C1->SR2;
}
// 發(fā)送地址(讀)
void I2C_SendAddress_Read(uint8_t addr)
{
I2C1->DR = addr | 0x01;
while (!(I2C1->SR1 & I2C_SR1_ADDR));
(void)I2C1->SR2;
}
// 發(fā)送一個字節(jié)
void I2C_SendData(uint8_t data)
{
I2C1->DR = data;
while (!(I2C1->SR1 & I2C_SR1_TXE));
}
// 接收一個字節(jié),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;
}
// 延時函數(shù),簡單軟件延時
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; // 連續(xù)轉(zhuǎn)換模式
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初始化(火焰?zhèn)鞲衅鬏斎?,蜂鳴器和風扇控制輸出)
void GPIO_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 使能GPIOA
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使能GPIOB
// PA1輸入,火焰?zhèn)鞲衅鲾?shù)字信號,浮空輸入
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推挽輸出
}
// 讀取火焰?zhèn)鞲衅鳡顟B(tài)(返回1有火焰,0無火焰)
uint8_t FlameSensor_Read(void)
{
return (GPIOA->IDR & (1 << 1)) ? 1 : 0;
}
// 控制風扇繼電器(1開啟,0關(guān)閉)
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"
// 外部模塊函數(shù)聲明(假設已實現(xiàn))
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);
// 系統(tǒng)閾值定義
#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)
{
// 讀取失敗,繼續(xù)下一輪
continue;
}
// 讀取模擬量傳感器
smoke_adc = ADC_Read(0); // MQ2傳感器,PA0通道
gas_adc = ADC_Read(2); // MQ135傳感器,PA2通道
// 讀取火焰?zhèn)鞲衅鲾?shù)字輸入
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;
// 控制執(zhí)行器
if(alarm_flag)
{
Fan_Control(1);
Buzzer_Control(1);
}
else
{
Fan_Control(0);
Buzzer_Control(0);
}
// 通過MQTT上傳數(shù)據(jù)到華為云
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線將開發(fā)板的左邊的USB口(串口1)與電腦的USB連接,打開程序下載軟件下載程序。
具體下載過程看下面圖:
打開程序下載軟件:[軟件就在資料包里的軟件工具目錄下]
5.5 程序正常運行效果
設備運行過程中會通過串口打印調(diào)試信息,我們可以通過串口打印了解程序是否正常。
程序下載之后,可以打開串口調(diào)試助手查看程序運行的狀態(tài)信息。[軟件就在資料包里的軟件工具目錄下]
5.6 取模軟件的使用
顯示屏上會顯示中文,字母,數(shù)字等數(shù)據(jù),可以使用下面的取模軟件進行取模設置。
[軟件就在資料包里的軟件工具目錄下]
打開軟件之后:
六、總結(jié)
本項目基于STM32F103C8T6單片機設計并實現(xiàn)了工業(yè)倉庫環(huán)境智能監(jiān)控系統(tǒng)。系統(tǒng)集成了溫濕度傳感器SHT30、煙霧傳感器MQ2、火焰?zhèn)鞲衅骷坝泻怏w傳感器MQ135,能夠?qū)崟r采集倉庫環(huán)境的關(guān)鍵參數(shù)。通過對傳感器數(shù)據(jù)的實時分析,系統(tǒng)能夠快速判斷環(huán)境是否存在異常,并在異常情況下自動啟動風扇通風及蜂鳴器報警,保障倉庫安全。
系統(tǒng)采用ESP8266 WiFi模塊,利用MQTT協(xié)議將環(huán)境數(shù)據(jù)上傳至華為云物聯(lián)網(wǎng)平臺,實現(xiàn)遠程實時監(jiān)控與歷史數(shù)據(jù)管理,極大地提升了管理效率和安全保障水平。同時,配備的1.44寸TFT LCD液晶屏為現(xiàn)場工作人員提供直觀的環(huán)境狀態(tài)顯示,方便即時了解倉庫情況。
在軟件設計方面,采用STM32寄存器級編程,提升了系統(tǒng)響應速度與穩(wěn)定性。通過模塊化設計思想,各功能模塊實現(xiàn)解耦,便于后續(xù)維護與升級。上位機軟件采用Qt5和C++開發(fā),完成了數(shù)據(jù)的可視化展示和歷史分析功能,增強了系統(tǒng)的實用性和用戶體驗。
綜上所述,本系統(tǒng)設計合理,功能完善,具備良好的實時性、穩(wěn)定性和擴展性。它不僅滿足了工業(yè)倉庫環(huán)境監(jiān)控的需求,也為類似的物聯(lián)網(wǎng)應用提供了參考與借鑒價值。未來可結(jié)合更多傳感器和智能算法,進一步提升系統(tǒng)的智能化和自動化水平。