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