一、前言
1.1 項(xiàng)目介紹
【1】項(xiàng)目開(kāi)發(fā)背景
隨著現(xiàn)代家庭電器設(shè)備的日益增多,家庭用電安全問(wèn)題逐漸成為人們關(guān)注的重點(diǎn)。為了確保家庭電路的安全可靠運(yùn)行,預(yù)防因電路故障或不當(dāng)使用電器而導(dǎo)致的安全事故,設(shè)計(jì)一款高效、智能的居家電路保護(hù)裝置顯得尤為重要。該裝置不僅能夠?qū)崟r(shí)監(jiān)測(cè)家庭電路中的電壓、電流和功率等關(guān)鍵參數(shù),還能對(duì)環(huán)境溫濕度及煙霧濃度進(jìn)行監(jiān)控,從而為用戶(hù)提供全方位的家庭用電安全保障。
在傳統(tǒng)家庭電路保護(hù)方案中,通常僅依靠斷路器來(lái)提供過(guò)載保護(hù),但這種方式無(wú)法實(shí)現(xiàn)精細(xì)化管理,也無(wú)法為用戶(hù)提供詳細(xì)的用電信息反饋。因此,我們基于單片機(jī)與物聯(lián)網(wǎng)技術(shù),開(kāi)發(fā)了一款集成了多種功能的智能居家電路保護(hù)裝置。這款裝置安裝于家庭總電表輸出端,支持多達(dá)20路獨(dú)立線(xiàn)路的連接,每一路都可以單獨(dú)監(jiān)控其用電情況,包括電壓、電流、功率的變化。通過(guò)內(nèi)置的高精度電力參數(shù)采集模塊,裝置能夠準(zhǔn)確測(cè)量并分析各線(xiàn)路的用電數(shù)據(jù),一旦檢測(cè)到異常,如電流或功率超過(guò)設(shè)定閾值,它將立即切斷電源,并通過(guò)本地蜂鳴器發(fā)出警報(bào),同時(shí)向用戶(hù)的手機(jī)APP發(fā)送通知,以便用戶(hù)及時(shí)采取措施。
考慮到智能家居系統(tǒng)的普及以及用戶(hù)對(duì)于遠(yuǎn)程監(jiān)控的需求,我們的設(shè)計(jì)方案特別加入了WIFI聯(lián)網(wǎng)功能。利用MQTT協(xié)議,所有狀態(tài)信息都可以上傳至華為云物聯(lián)網(wǎng)服務(wù)器,用戶(hù)無(wú)論身處何地,只需打開(kāi)手機(jī)上的Android應(yīng)用程序,即可查看家中的用電狀況,了解歷史變化趨勢(shì),并可查看以波形或數(shù)字形式呈現(xiàn)的數(shù)據(jù)。此外,通過(guò)這個(gè)應(yīng)用程序,用戶(hù)還能夠?qū)崿F(xiàn)遠(yuǎn)程控制,例如恢復(fù)被切斷的電源或者調(diào)整報(bào)警閾值。
為了讓用戶(hù)更直觀地掌握當(dāng)前的用電情況,我們?cè)谘b置上配置了一個(gè)OLED顯示屏,可以實(shí)時(shí)顯示采集到的所有信息。這樣即使沒(méi)有智能手機(jī),用戶(hù)也能一目了然地看到重要的用電數(shù)據(jù)。同時(shí),我們也選用了SHT30傳感器來(lái)監(jiān)測(cè)環(huán)境溫濕度,以及MQ2傳感器用于煙霧濃度監(jiān)測(cè),這些都進(jìn)一步增強(qiáng)了裝置的安全性和功能性。
整個(gè)項(xiàng)目采用STM32F103RCT6作為主控芯片,它具有高性能、低功耗的特點(diǎn),非常適合處理復(fù)雜的計(jì)算任務(wù)和通信任務(wù)。軟件方面,STM32的開(kāi)發(fā)使用Keil5工具鏈,編程語(yǔ)言選擇C語(yǔ)言,而Android應(yīng)用則采用Qt框架進(jìn)行開(kāi)發(fā),編程語(yǔ)言為C++。這種組合不僅保證了硬件和軟件之間的緊密配合,也使得系統(tǒng)具備良好的穩(wěn)定性和擴(kuò)展性。通過(guò)這樣一個(gè)智能居家電路保護(hù)裝置,我們希望能夠?yàn)槊恳粋€(gè)家庭帶來(lái)更加安心、便捷的用電體驗(yàn)。
【2】設(shè)計(jì)實(shí)現(xiàn)的功能
當(dāng)前項(xiàng)目使用的硬件模塊對(duì)應(yīng)的代碼工程已經(jīng)更新到網(wǎng)盤(pán):https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
(1) 電路監(jiān)測(cè)與保護(hù)功能
支持直流電和單相交流電的電壓、電流、功率監(jiān)測(cè)功能。當(dāng)檢測(cè)到某一路線(xiàn)路的電流或功率超過(guò)設(shè)定閥值時(shí),裝置會(huì)立即切斷電源,同時(shí)通過(guò)本地蜂鳴器報(bào)警,上傳告警信息至物聯(lián)網(wǎng)服務(wù)器,并推送到手機(jī)APP。
(2) 多路電路獨(dú)立監(jiān)控
支持最多20路獨(dú)立線(xiàn)路的用電參數(shù)監(jiān)測(cè),包括電壓、電流、功率等。各路參數(shù)的歷史變化數(shù)據(jù)會(huì)以波形圖或數(shù)字形式在手機(jī)APP中顯示,方便用戶(hù)掌握各電器的用電情況。
(3) 環(huán)境溫濕度監(jiān)測(cè)功能
通過(guò)SHT30傳感器實(shí)時(shí)測(cè)量周?chē)h(huán)境的溫度和濕度,并將數(shù)據(jù)上傳到物聯(lián)網(wǎng)服務(wù)器和手機(jī)APP,同時(shí)支持在本地OLED顯示屏上顯示當(dāng)前的環(huán)境信息。
(4) 煙霧濃度檢測(cè)功能
利用MQ2傳感器監(jiān)測(cè)空氣中的煙霧濃度。如果煙霧濃度超過(guò)設(shè)定的安全閾值,裝置會(huì)立即觸發(fā)本地蜂鳴器報(bào)警,同時(shí)將告警信息上傳至物聯(lián)網(wǎng)服務(wù)器,并推送到手機(jī)APP進(jìn)行遠(yuǎn)程提醒。
(5) 數(shù)據(jù)上云與遠(yuǎn)程監(jiān)控
支持通過(guò)WIFI模塊與物聯(lián)網(wǎng)服務(wù)器連接,采用MQTT協(xié)議上傳設(shè)備的各類(lèi)數(shù)據(jù)(包括電路監(jiān)測(cè)數(shù)據(jù)、環(huán)境溫濕度數(shù)據(jù)、煙霧濃度數(shù)據(jù)等)。用戶(hù)可通過(guò)Android手機(jī)APP實(shí)時(shí)查看設(shè)備狀態(tài),獲取數(shù)據(jù)歷史記錄,并遠(yuǎn)程操作和管理設(shè)備。
(6) 本地實(shí)時(shí)數(shù)據(jù)顯示
采用0.96英寸OLED顯示屏,實(shí)時(shí)顯示所有監(jiān)測(cè)數(shù)據(jù),包括電壓、電流、功率、環(huán)境溫濕度、煙霧濃度等信息,便于用戶(hù)在現(xiàn)場(chǎng)查看設(shè)備工作狀態(tài)。
(7) 超限保護(hù)與告警功能
當(dāng)檢測(cè)到任何線(xiàn)路的電流、功率超出設(shè)定閥值,或煙霧濃度超標(biāo)時(shí),裝置會(huì)自動(dòng)切斷相關(guān)線(xiàn)路的電源,并發(fā)出蜂鳴器告警,同時(shí)通過(guò)物聯(lián)網(wǎng)服務(wù)器將信息傳遞至手機(jī)APP。
(8) 歷史數(shù)據(jù)存儲(chǔ)與波形顯示
支持電壓、電流、功率等參數(shù)的歷史變化數(shù)據(jù)存儲(chǔ),并通過(guò)手機(jī)APP以波形圖形式顯示,方便用戶(hù)進(jìn)行用電分析和趨勢(shì)判斷。
(9) 手機(jī)APP遠(yuǎn)程控制功能
用戶(hù)可通過(guò)手機(jī)APP遠(yuǎn)程控制設(shè)備,包括開(kāi)關(guān)各路電路、修改參數(shù)閾值,以及查看歷史數(shù)據(jù)和告警記錄等。
(10) 智能化與模塊化設(shè)計(jì)
所有功能模塊化設(shè)計(jì),方便硬件擴(kuò)展與維護(hù),同時(shí)通過(guò)軟件配置和調(diào)試實(shí)現(xiàn)靈活功能升級(jí),適應(yīng)不同家庭需求。
(11) 全面的安全與節(jié)能方案
通過(guò)精準(zhǔn)的監(jiān)測(cè)和智能控制,幫助用戶(hù)在確保安全的前提下合理用電、減少浪費(fèi),實(shí)現(xiàn)節(jié)能減排的目標(biāo)。
【3】項(xiàng)目硬件模塊組成
(1) 主控模塊 :采用STM32F103RCT6作為核心控制器,該芯片具備高性能ARM Cortex-M3內(nèi)核,提供豐富的外設(shè)接口和足夠的處理能力,以滿(mǎn)足對(duì)多路電力參數(shù)的實(shí)時(shí)監(jiān)測(cè)、數(shù)據(jù)處理以及與云端通信的需求。
(2) 電力參數(shù)采集模塊 :選用支持串口通信的電力參數(shù)采集模塊,用于精確測(cè)量每一路電路中的電壓、電流和功率等電能參數(shù)。此模塊能夠?qū)⒉杉降臄?shù)據(jù)通過(guò)串行接口發(fā)送給主控MCU進(jìn)行分析處理,確保了數(shù)據(jù)的準(zhǔn)確性與穩(wěn)定性。
(3) 環(huán)境溫濕度傳感器 :安裝SHT30數(shù)字溫濕度傳感器,用以監(jiān)控周?chē)h(huán)境的溫度和濕度變化。該傳感器具有高精度和快速響應(yīng)的特點(diǎn),可以為用戶(hù)提供準(zhǔn)確的室內(nèi)環(huán)境信息,并幫助檢測(cè)潛在的安全隱患。
(4) 煙霧濃度檢測(cè)模塊 :集成MQ2氣體傳感器,專(zhuān)門(mén)用來(lái)探測(cè)空氣中煙霧濃度。當(dāng)檢測(cè)到異常高的煙霧水平時(shí),系統(tǒng)會(huì)觸發(fā)報(bào)警機(jī)制,提醒用戶(hù)可能存在火災(zāi)風(fēng)險(xiǎn)。
(5) 無(wú)線(xiàn)通信模塊 :采用ESP8266 WIFI模塊,負(fù)責(zé)實(shí)現(xiàn)設(shè)備與互聯(lián)網(wǎng)之間的連接,使得裝置可以通過(guò)MQTT協(xié)議向華為云物聯(lián)網(wǎng)平臺(tái)上傳數(shù)據(jù)。此外,它還支持遠(yuǎn)程配置和控制功能,允許用戶(hù)通過(guò)手機(jī)APP管理家居用電情況。
(6) 本地顯示模塊 :配備一塊OLED顯示屏,用于直觀地呈現(xiàn)當(dāng)前各路電路的電壓、電流、功率狀態(tài),以及環(huán)境溫濕度和煙霧濃度等信息。OLED屏幕提供了清晰的視覺(jué)效果,便于用戶(hù)即時(shí)了解家庭用電狀況。
(7) 聲光報(bào)警模塊 :包括一個(gè)高電平觸發(fā)的有源蜂鳴器,當(dāng)檢測(cè)到任何危險(xiǎn)信號(hào)(如過(guò)載、短路或者高煙霧濃度)時(shí),蜂鳴器會(huì)發(fā)出響亮的聲音警報(bào);同時(shí)還可以添加LED指示燈來(lái)增強(qiáng)視覺(jué)警示效果。
(8) 電源管理模塊 :設(shè)計(jì)專(zhuān)門(mén)的電源管理系統(tǒng),確保整個(gè)系統(tǒng)的穩(wěn)定供電。考慮到不同應(yīng)用場(chǎng)景下的需求,該模塊應(yīng)能兼容直流和單相交流輸入,并且擁有適當(dāng)?shù)倪^(guò)壓、欠壓保護(hù)措施,以保障系統(tǒng)長(zhǎng)期可靠運(yùn)行。
(9) 繼電器控制模塊 :為了實(shí)現(xiàn)對(duì)各路電路的通斷控制,每個(gè)回路上都會(huì)串聯(lián)一個(gè)小型繼電器。這些繼電器受主控MCU控制,在發(fā)生異常情況時(shí)迅速切斷相關(guān)電路,防止事故擴(kuò)大化。
1.2 設(shè)計(jì)思路
本項(xiàng)目設(shè)計(jì)的核心思路是將電路保護(hù)功能與物聯(lián)網(wǎng)技術(shù)相結(jié)合,構(gòu)建一個(gè)智能化、模塊化的居家電路保護(hù)裝置。通過(guò)對(duì)家庭電路的實(shí)時(shí)監(jiān)控和遠(yuǎn)程管理,實(shí)現(xiàn)對(duì)電路安全的全面保障和對(duì)用電信息的高效管理。整個(gè)設(shè)計(jì)從功能需求出發(fā),綜合硬件選型、軟件開(kāi)發(fā)、數(shù)據(jù)通信和用戶(hù)體驗(yàn)等多個(gè)方面展開(kāi),力求提供一套完整且實(shí)用的解決方案。
基于對(duì)家庭用電安全問(wèn)題的分析,確定了裝置的主要功能,包括電路監(jiān)測(cè)與保護(hù)、環(huán)境參數(shù)監(jiān)測(cè)、煙霧濃度檢測(cè)等。為了實(shí)現(xiàn)這些功能,選擇STM32F103RCT6作為主控芯片,利用其性能穩(wěn)定、資源豐富的特點(diǎn),通過(guò)與外部傳感器和模塊的結(jié)合,構(gòu)建多功能數(shù)據(jù)采集與處理系統(tǒng)。設(shè)計(jì)中采用的電力參數(shù)采集模塊通過(guò)串口通信采集電壓、電流、功率等關(guān)鍵參數(shù),確保數(shù)據(jù)的精確性和可靠性。同時(shí),為提升系統(tǒng)的適用性,支持最多20路獨(dú)立線(xiàn)路的電路監(jiān)控與保護(hù),滿(mǎn)足大多數(shù)家庭的用電需求。
考慮到家庭環(huán)境對(duì)安全和舒適的雙重要求,設(shè)計(jì)中加入了環(huán)境溫濕度監(jiān)測(cè)和煙霧濃度檢測(cè)功能。環(huán)境溫濕度通過(guò)SHT30傳感器獲取,實(shí)時(shí)反映家庭的環(huán)境狀態(tài),幫助用戶(hù)及時(shí)調(diào)整室內(nèi)環(huán)境。煙霧濃度通過(guò)MQ2傳感器檢測(cè),當(dāng)煙霧濃度超限時(shí)觸發(fā)報(bào)警,及時(shí)預(yù)警潛在火災(zāi)風(fēng)險(xiǎn),為家庭安全提供額外保障。這些功能的加入,不僅豐富了裝置的應(yīng)用場(chǎng)景,還顯著提升了用戶(hù)的安全感。
為了實(shí)現(xiàn)設(shè)備的智能化和遠(yuǎn)程管理,項(xiàng)目設(shè)計(jì)中引入了物聯(lián)網(wǎng)技術(shù)。裝置通過(guò)WIFI模塊接入互聯(lián)網(wǎng),利用MQTT協(xié)議與華為云物聯(lián)網(wǎng)服務(wù)器通信。所有數(shù)據(jù),包括電路參數(shù)、環(huán)境參數(shù)和報(bào)警信息,都將實(shí)時(shí)上傳至服務(wù)器。用戶(hù)可通過(guò)Android手機(jī)APP查看這些數(shù)據(jù),APP采用Qt開(kāi)發(fā),提供直觀的用戶(hù)界面和高效的交互方式。此外,APP還支持遠(yuǎn)程操作,包括線(xiàn)路開(kāi)關(guān)控制、參數(shù)閾值設(shè)置等,極大地提升了用戶(hù)的便捷性和對(duì)設(shè)備的掌控能力。
數(shù)據(jù)展示方面,項(xiàng)目設(shè)計(jì)兼顧了遠(yuǎn)程和本地兩種場(chǎng)景。在遠(yuǎn)程端,手機(jī)APP提供波形和數(shù)字兩種顯示方式,滿(mǎn)足用戶(hù)對(duì)用電數(shù)據(jù)的詳細(xì)分析需求。在本地端,使用0.96英寸OLED顯示屏實(shí)時(shí)顯示當(dāng)前監(jiān)測(cè)的所有數(shù)據(jù),方便用戶(hù)在現(xiàn)場(chǎng)直觀了解設(shè)備的運(yùn)行狀態(tài)。此外,歷史數(shù)據(jù)的存儲(chǔ)和展示功能,使用戶(hù)能夠回顧和分析各項(xiàng)參數(shù)的變化趨勢(shì),幫助優(yōu)化用電習(xí)慣。
為了確保系統(tǒng)的穩(wěn)定性與可靠性,設(shè)計(jì)中采用了模塊化思路,各功能模塊相對(duì)獨(dú)立,互不干擾。例如,電路監(jiān)測(cè)模塊、環(huán)境監(jiān)測(cè)模塊、煙霧檢測(cè)模塊和數(shù)據(jù)通信模塊分別設(shè)計(jì)和測(cè)試,在主控芯片的統(tǒng)一管理下協(xié)調(diào)運(yùn)行。這樣不僅簡(jiǎn)化了硬件設(shè)計(jì)和軟件開(kāi)發(fā)過(guò)程,還提高了系統(tǒng)的可維護(hù)性和擴(kuò)展性。
整體設(shè)計(jì)還充分考慮了設(shè)備的安全性。通過(guò)硬件和軟件的結(jié)合,裝置在檢測(cè)到電路超載或煙霧超標(biāo)時(shí),能迅速切斷電源并發(fā)出警報(bào),最大程度降低風(fēng)險(xiǎn)。同時(shí),利用物聯(lián)網(wǎng)技術(shù)實(shí)現(xiàn)遠(yuǎn)程報(bào)警提醒,讓用戶(hù)即使不在家中也能及時(shí)掌握安全狀況。綜合以上設(shè)計(jì)思路,本項(xiàng)目不僅滿(mǎn)足了現(xiàn)代家庭對(duì)電路保護(hù)的基本需求,還通過(guò)智能化手段提升了用戶(hù)體驗(yàn),為建設(shè)更加安全、舒適和節(jié)能的家庭環(huán)境提供了可靠的技術(shù)支持。
1.3 系統(tǒng)功能總結(jié)
當(dāng)前項(xiàng)目使用的相關(guān)軟件工具、模塊源碼已經(jīng)上傳到網(wǎng)盤(pán):https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
功能模塊 | 描述 |
---|---|
主控模塊 | 使用STM32F103RCT6作為核心控制器,負(fù)責(zé)整體數(shù)據(jù)處理、邏輯控制及與各子系統(tǒng)的通信。 |
電力參數(shù)監(jiān)測(cè) | 實(shí)時(shí)監(jiān)測(cè)每一路線(xiàn)路上的電壓、電流和功率,并在超過(guò)設(shè)定閾值時(shí)自動(dòng)切斷電源并報(bào)警。 |
環(huán)境溫濕度監(jiān)測(cè) | 通過(guò)SHT30傳感器實(shí)時(shí)監(jiān)測(cè)環(huán)境溫度和濕度,提供室內(nèi)環(huán)境信息,幫助識(shí)別潛在的安全風(fēng)險(xiǎn)。 |
煙霧濃度監(jiān)測(cè) | 利用MQ2傳感器檢測(cè)空氣中的煙霧濃度,在濃度超標(biāo)時(shí)觸發(fā)警報(bào)并向用戶(hù)發(fā)送通知。 |
無(wú)線(xiàn)通信功能 | 內(nèi)置WIFI模塊ESP8266,使用MQTT協(xié)議將設(shè)備狀態(tài)上傳至華為云物聯(lián)網(wǎng)平臺(tái),支持遠(yuǎn)程監(jiān)控。 |
本地顯示功能 | 配備OLED顯示屏,實(shí)時(shí)顯示當(dāng)前用電情況、環(huán)境參數(shù)等信息,方便用戶(hù)查看。 |
聲光報(bào)警功能 | 包含高電平觸發(fā)的有源蜂鳴器和可能的LED指示燈,在檢測(cè)到異常情況時(shí)發(fā)出聲音和燈光警示。 |
遠(yuǎn)程控制功能 | 用戶(hù)可通過(guò)手機(jī)APP實(shí)現(xiàn)對(duì)設(shè)備的遠(yuǎn)程控制,包括但不限于調(diào)整報(bào)警閾值、恢復(fù)被切斷的電源等。 |
歷史數(shù)據(jù)分析 | 支持對(duì)測(cè)量的電壓、電流、功率參數(shù)的歷史變化進(jìn)行記錄,并能在APP上以波形或數(shù)字形式展示。 |
電源管理功能 | 設(shè)計(jì)有專(zhuān)門(mén)的電源管理系統(tǒng),確保系統(tǒng)穩(wěn)定供電,同時(shí)具備過(guò)壓、欠壓保護(hù)等功能。 |
繼電器控制功能 | 每個(gè)回路配備小型繼電器,用于快速響應(yīng)異常情況下的斷電操作,保障安全。 |
外部接口擴(kuò)展功能 | 提供擴(kuò)展接口,為未來(lái)的硬件升級(jí)或連接額外傳感器留出空間。 |
1.4 開(kāi)發(fā)工具的選擇
【1】設(shè)備端開(kāi)發(fā)
STM32的編程語(yǔ)言選擇C語(yǔ)言,C語(yǔ)言執(zhí)行效率高,大學(xué)里主學(xué)的C語(yǔ)言,C語(yǔ)言編譯出來(lái)的可執(zhí)行文件最接近于機(jī)器碼,匯編語(yǔ)言執(zhí)行效率最高,但是匯編的移植性比較差,目前在一些操作系統(tǒng)內(nèi)核里還有一些低配的單片機(jī)使用的較多,平常的單片機(jī)編程還是以C語(yǔ)言為主。C語(yǔ)言的執(zhí)行效率僅次于匯編,語(yǔ)法理解簡(jiǎn)單、代碼通用性強(qiáng),也支持跨平臺(tái),在嵌入式底層、單片機(jī)編程里用的非常多,當(dāng)前的設(shè)計(jì)就是采用C語(yǔ)言開(kāi)發(fā)。
開(kāi)發(fā)工具選擇Keil,keil是一家世界領(lǐng)先的嵌入式微控制器軟件開(kāi)發(fā)商,在2015年,keil被ARM公司收購(gòu)。因?yàn)楫?dāng)前芯片選擇的是STM32F103系列,STMF103是屬于ARM公司的芯片構(gòu)架、Cortex-M3內(nèi)核系列的芯片,所以使用Kile來(lái)開(kāi)發(fā)STM32是有先天優(yōu)勢(shì)的,而keil在各大高校使用的也非常多,很多教科書(shū)里都是以keil來(lái)教學(xué),開(kāi)發(fā)51單片機(jī)、STM32單片機(jī)等等。目前作為MCU芯片開(kāi)發(fā)的軟件也不只是keil一家獨(dú)大,IAR在MCU微處理器開(kāi)發(fā)領(lǐng)域里也使用的非常多,IAR擴(kuò)展性更強(qiáng),也支持STM32開(kāi)發(fā),也支持其他芯片,比如:CC2530,51單片機(jī)的開(kāi)發(fā)。從軟件的使用上來(lái)講,IAR比keil更加簡(jiǎn)潔,功能相對(duì)少一些。如果之前使用過(guò)keil,而且使用頻率較多,已經(jīng)習(xí)慣再使用IAR是有點(diǎn)不適應(yīng)界面的。
【2】上位機(jī)開(kāi)發(fā)
上位機(jī)的開(kāi)發(fā)選擇Qt框架,編程語(yǔ)言采用C++;Qt是一個(gè)1991年由Qt Company開(kāi)發(fā)的跨平臺(tái)C++圖形用戶(hù)界面應(yīng)用程序開(kāi)發(fā)框架。它既可以開(kāi)發(fā)GUI程序,也可用于開(kāi)發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣埽褂锰厥獾拇a生成擴(kuò)展(稱(chēng)為元對(duì)象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴(kuò)展,并且允許真正地組件編程。Qt能輕松創(chuàng)建具有原生C++性能的連接設(shè)備、用戶(hù)界面(UI)和應(yīng)用程序。它功能強(qiáng)大且結(jié)構(gòu)緊湊,擁有直觀的工具和庫(kù)。
二、部署華為云物聯(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è)用戶(hù)構(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
點(diǎn)擊立即創(chuàng)建
。
正在創(chuàng)建標(biāo)準(zhǔn)版實(shí)例,需要等待片刻。
創(chuàng)建完成之后,點(diǎn)擊實(shí)例名稱(chēng)。 可以看到標(biāo)準(zhǔn)版實(shí)例的設(shè)備接入端口和地址。
在上面也能看到 免費(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)
接入地址:ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
**根據(jù)域名地址得到IP地址信息: **
打開(kāi)Windows電腦的命令行控制臺(tái)終端,使用ping
命令。ping
一下即可。
Microsoft Windows [版本 10.0.19045.4170]
(c) Microsoft Corporation。保留所有權(quán)利。
C:Users11266 >ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
正在 Ping ad635970a1.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í)間=35ms TTL=93
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=36ms TTL=93
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=36ms TTL=93
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=39ms TTL=93
117.78.5.125 的 Ping 統(tǒng)計(jì)信息:
數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計(jì)時(shí)間(以毫秒為單位):
最短 = 35ms,最長(zhǎng) = 39ms,平均 = 36ms
C:Users11266 >
MQTT協(xié)議接入端口號(hào)有兩個(gè),1883是非加密端口,8883是證書(shū)加密端口,單片機(jī)無(wú)法加載證書(shū),所以使用1883端口比較合適。 接下來(lái)的ESP8266就采用1883端口連接華為云物聯(lián)網(wǎng)平臺(tái)。
2.3 創(chuàng)建產(chǎn)品
(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è)備上的客戶(hù)端,已經(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è)操作稱(chēng)為:屬性上報(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": {
"< 填屬性名稱(chēng)1 >": < 填屬性值 >,
"< 填屬性名稱(chēng)2 >": < 填屬性值 >,
..........
}
}
]
}
根據(jù)JSON格式,一次可以上傳多個(gè)屬性字段。 這個(gè)JSON格式里的,服務(wù)ID,屬性字段名稱(chēng),屬性值類(lèi)型,在前面創(chuàng)建產(chǎn)品的時(shí)候就已經(jīng)介紹了,不記得可以翻到前面去查看。
根據(jù)這個(gè)格式,組合一次上傳的屬性數(shù)據(jù):
{"services": [{"service_id": "stm32","properties":{"DHT11_T":30,"DHT11_H":10,"BH1750":1,"MQ135":0}}]}
2.6 MQTT三元組
MQTT協(xié)議登錄需要填用戶(hù)ID,設(shè)備ID,設(shè)備密碼等信息,就像我們平時(shí)登錄QQ,微信一樣要輸入賬號(hào)密碼才能登錄。MQTT協(xié)議登錄的這3個(gè)參數(shù),一般稱(chēng)為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è)在線(xiàn)工具,用來(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客戶(hù)端軟件模擬真實(shí)的設(shè)備來(lái)登錄平臺(tái)。測(cè)試與服務(wù)器通信是否正常。
(1)填入登錄信息
打開(kāi)MQTT客戶(hù)端軟件,對(duì)號(hào)填入相關(guān)信息(就是上面的文本介紹)。然后,點(diǎn)擊登錄,訂閱主題,發(fā)布主題。
(2)打開(kāi)網(wǎng)頁(yè)查看
完成上面的操作之后,打開(kāi)華為云網(wǎng)頁(yè)后臺(tái),可以看到設(shè)備已經(jīng)在線(xiàn)了。
點(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":{"DHT11_T":30,"DHT11_H":10,"BH1750":1,"MQ135":0}}]}
2.8 創(chuàng)建IAM賬戶(hù)
創(chuàng)建一個(gè)IAM賬戶(hù),因?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)擊左上角用戶(hù)名,選擇下拉菜單里的我的憑證
項(xiàng)目憑證:
28add376c01e4a61ac8b621c714bf459
【2】創(chuàng)建IAM用戶(hù)
鼠標(biāo)放在左上角頭像上,在下拉菜單里選擇統(tǒng)一身份認(rèn)證
。
點(diǎn)擊左上角創(chuàng)建用戶(hù)
。
創(chuàng)建成功:
【3】創(chuàng)建完成
用戶(hù)信息如下:
主用戶(hù)名 l19504562721
IAM用戶(hù) 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è)備是否在線(xiàn),都可以通過(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)行在線(xiàn)調(diào)試:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow
在線(xiàn)調(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)試成功之后,可以得到訪(fǎng)問(wèn)影子數(shù)據(jù)的真實(shí)鏈接,接下來(lái)的代碼開(kāi)發(fā)中,就采用Qt寫(xiě)代碼訪(fǎng)問(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
三、上位機(jī)開(kāi)發(fā)(C++版)
為了方便查看設(shè)備上傳的數(shù)據(jù),接下來(lái)利用Qt開(kāi)發(fā)一款A(yù)ndroid手機(jī)APP 和 Windows上位機(jī)。
使用華為云平臺(tái)提供的API接口獲取設(shè)備上傳的數(shù)據(jù),進(jìn)行可視化顯示,以及遠(yuǎn)程控制設(shè)備。
3.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ì)提示輸入賬戶(hù)。
安裝的時(shí)候,第一個(gè)復(fù)選框里的編譯器可以全選,直接點(diǎn)擊下一步繼續(xù)安裝。
選擇編譯器: (一定要看清楚了)
3.2 新建上位機(jī)工程
前面2講解了需要用的API接口,接下來(lái)就使用Qt設(shè)計(jì)上位機(jī),設(shè)計(jì)界面,完成整體上位機(jī)的邏輯設(shè)計(jì)。
【1】新建工程
【2】設(shè)置項(xiàng)目的名稱(chēng)。
【3】選擇編譯系統(tǒng)
【4】選擇默認(rèn)繼承的類(lèi)
【5】選擇編譯器
【6】點(diǎn)擊完成
【7】工程創(chuàng)建完成
3.3 切換編譯器
在左下角是可以切換編譯器的。 可以選擇用什么樣的編譯器編譯程序。
目前新建工程的時(shí)候選擇了2種編譯器。 一種是mingw32
這個(gè)編譯Windows下運(yùn)行的程序。 一種是Android
編譯器,可以生成Android
手機(jī)APP。
不過(guò)要注意:Android的編譯器需要配置一些環(huán)境才可以正常使用,這個(gè)大家可以網(wǎng)上找找教程配置一下就行了。
比如:https://blog.csdn.net/xiaolong1126626497/article/details/117254453
windows的編譯器就沒(méi)有這么麻煩,安裝好Qt就可以編譯使用。
下面我這里就選擇的 mingw32
這個(gè)編譯器,編譯Windows下運(yùn)行的程序。
3.4 編譯測(cè)試功能
創(chuàng)建完畢之后,編譯測(cè)試一下功能是否OK。
點(diǎn)擊左下角的綠色三角形按鈕
。
正常運(yùn)行就可以看到彈出一個(gè)白色的框框。這就表示工程環(huán)境沒(méi)有問(wèn)題了。 接下來(lái)就可以放心的設(shè)計(jì)界面了。
3.5 設(shè)計(jì)UI界面與工程配置
【1】打開(kāi)UI文件
打開(kāi)默認(rèn)的界面如下:
【2】開(kāi)始設(shè)計(jì)界面
根據(jù)自己需求設(shè)計(jì)界面。
3.6 編譯Windows上位機(jī)
點(diǎn)擊軟件左下角的綠色三角形按鈕進(jìn)行編譯運(yùn)行。
3.7 配置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)與名稱(chēng)
【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文件。
四、PyQt5(Python版)
4.1 安裝PyQt5
在Python中安裝PyQt庫(kù)非常簡(jiǎn)單,可以使用pip
這個(gè)包管理工具來(lái)完成。PyQt有兩個(gè)主要版本:PyQt5(基于Qt 5)和PyQt6(基于Qt 6)。
我這里安裝Qt5,以Qt5為例進(jìn)行開(kāi)發(fā)。
要安裝PyQt5,打開(kāi)命令行界面,然后運(yùn)行以下命令:
pip install PyQt5
安裝過(guò)程中:
安裝完畢。
4.2 安裝QtDesigner
如果想使用PyQt5的設(shè)計(jì)工具(Qt Designer),用圖形方式設(shè)計(jì)界面,可以安裝pyqt5-tools
:
pip install pyqt5-tools
安裝過(guò)程如下:
安裝過(guò)程中
安裝完畢。
4.3 測(cè)試Qt環(huán)境
安裝完成后,先寫(xiě)一份測(cè)試代碼,創(chuàng)建一個(gè)窗口,運(yùn)行測(cè)試Qt環(huán)境是否正常。
新建一個(gè)文件:hello_pyqt.py
編寫(xiě)代碼如下:
import sys
from PyQt5.QtWidgets import QApplication, QWidget # 如果使用PyQt6,這里改為 from PyQt6.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('Hello PyQt')
window.show()
sys.exit(app.exec_())
在終端命令行中運(yùn)行:
python hello_pyqt.py
如果一切正常,應(yīng)該能看到一個(gè)標(biāo)題為Hello PyQt
的空白窗口。這表明PyQt已經(jīng)成功安裝并且可以正常使用了。
4.4 設(shè)計(jì)代碼
用 PyQt5 展示了獲取數(shù)據(jù)后如何構(gòu)建圖形界面,實(shí)時(shí)顯示溫度、濕度、煙霧濃度、電壓、電流、功率的數(shù)值及其波形圖。
安裝依賴(lài):
pip install pyqt5 pyqtchart
完整代碼
import sys
import random
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget
from PyQt5.QtChart import QChart, QChartView, QLineSeries
from PyQt5.QtCore import QTimer, QPointF
class DataFetcher:
"""模擬從服務(wù)器獲取數(shù)據(jù)的類(lèi)"""
def get_data(self):
"""獲取模擬數(shù)據(jù)"""
return {
"temperature": random.uniform(20.0, 30.0),
"humidity": random.uniform(40.0, 60.0),
"smoke_level": random.randint(200, 400),
"voltage": random.uniform(220.0, 240.0),
"current": random.uniform(5.0, 15.0),
"power": random.uniform(500, 2000)
}
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Home Circuit Protection Monitor")
# 初始化布局和標(biāo)簽
self.temperature_label = QLabel("Temperature: 0 °C")
self.humidity_label = QLabel("Humidity: 0 %")
self.smoke_label = QLabel("Smoke: 0 ppm")
self.voltage_label = QLabel("Voltage: 0 V")
self.current_label = QLabel("Current: 0 A")
self.power_label = QLabel("Power: 0 W")
# 初始化波形圖
self.voltage_chart, self.voltage_series = self.create_chart("Voltage Waveform")
self.current_chart, self.current_series = self.create_chart("Current Waveform")
self.power_chart, self.power_series = self.create_chart("Power Waveform")
# 布局
layout = QVBoxLayout()
layout.addWidget(self.temperature_label)
layout.addWidget(self.humidity_label)
layout.addWidget(self.smoke_label)
layout.addWidget(self.voltage_label)
layout.addWidget(self.current_label)
layout.addWidget(self.power_label)
layout.addWidget(QChartView(self.voltage_chart))
layout.addWidget(QChartView(self.current_chart))
layout.addWidget(QChartView(self.power_chart))
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
# 初始化數(shù)據(jù)獲取器
self.data_fetcher = DataFetcher()
# 定時(shí)器,每秒刷新數(shù)據(jù)
self.timer = QTimer()
self.timer.timeout.connect(self.update_data)
self.timer.start(1000)
# 時(shí)間步計(jì)數(shù)
self.time_step = 0
def create_chart(self, title):
"""創(chuàng)建一個(gè)帶有標(biāo)題的波形圖"""
chart = QChart()
chart.setTitle(title)
series = QLineSeries()
chart.addSeries(series)
chart.createDefaultAxes()
chart.axisX().setTitleText("Time")
chart.axisY().setTitleText("Value")
return chart, series
def update_data(self):
"""更新界面和波形圖的數(shù)據(jù)"""
data = self.data_fetcher.get_data()
# 更新文本標(biāo)簽
self.temperature_label.setText(f"Temperature: {data['temperature']:.1f} °C")
self.humidity_label.setText(f"Humidity: {data['humidity']:.1f} %")
self.smoke_label.setText(f"Smoke: {data['smoke_level']} ppm")
self.voltage_label.setText(f"Voltage: {data['voltage']:.1f} V")
self.current_label.setText(f"Current: {data['current']:.1f} A")
self.power_label.setText(f"Power: {data['power']:.1f} W")
# 更新波形圖
self.update_chart(self.voltage_series, data['voltage'])
self.update_chart(self.current_series, data['current'])
self.update_chart(self.power_series, data['power'])
self.time_step += 1
def update_chart(self, series, value):
"""更新指定波形圖的數(shù)據(jù)"""
series.append(QPointF(self.time_step, value))
if series.count() > 100: # 限制最大點(diǎn)數(shù)
series.remove(0)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(800, 600)
window.show()
sys.exit(app.exec_())
五、STM32代碼開(kāi)發(fā)
當(dāng)前項(xiàng)目使用的相關(guān)軟件工具、傳感器代碼工程,已經(jīng)上傳到網(wǎng)盤(pán):https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
【1】完整代碼
下面是核心框架和主程序。
#include "stm32f10x.h"
#include "usart.h"
#include "oled.h"
#include "buzzer.h"
#include "sht30.h"
#include "mq2.h"
#include "esp8266.h"
#include "power_monitor.h"
// 定義電流和功率閾值
#define CURRENT_THRESHOLD 15.0 // 15A
#define POWER_THRESHOLD 3000.0 // 3000W
// 煙霧濃度閾值
#define SMOKE_THRESHOLD 300 // 示例值
// 全局變量
float voltage = 0.0;
float current = 0.0;
float power = 0.0;
float energy = 0.0;
float temperature = 0.0;
float humidity = 0.0;
uint16_t smoke_level = 0;
// 警告標(biāo)志
uint8_t overcurrent_flag = 0;
uint8_t overpower_flag = 0;
uint8_t smoke_alarm_flag = 0;
// 初始化函數(shù)
void System_Init(void) {
// 初始化串口
USART_Init();
// 初始化OLED顯示屏
OLED_Init();
// 初始化蜂鳴器
Buzzer_Init();
// 初始化環(huán)境溫濕度傳感器
SHT30_Init();
// 初始化煙霧傳感器
MQ2_Init();
// 初始化ESP8266 WiFi模塊
ESP8266_Init();
// 初始化電力參數(shù)采集模塊
PowerMonitor_Init();
}
// 讀取傳感器數(shù)據(jù)
void Read_Sensors(void) {
// 讀取電力參數(shù)
PowerMonitor_Read(&voltage, ¤t, &power, &energy);
// 讀取溫濕度
SHT30_Read(&temperature, &humidity);
// 讀取煙霧濃度
smoke_level = MQ2_Read();
}
// 顯示數(shù)據(jù)到OLED
void Display_Data(void) {
OLED_Clear();
OLED_ShowString(0, 0, "Voltage:");
OLED_ShowFloat(56, 0, voltage, 1);
OLED_ShowString(90, 0, "V");
OLED_ShowString(0, 10, "Current:");
OLED_ShowFloat(56, 10, current, 1);
OLED_ShowString(90, 10, "A");
OLED_ShowString(0, 20, "Power:");
OLED_ShowFloat(56, 20, power, 1);
OLED_ShowString(90, 20, "W");
OLED_ShowString(0, 30, "Temp:");
OLED_ShowFloat(56, 30, temperature, 1);
OLED_ShowString(90, 30, "C");
OLED_ShowString(0, 40, "Humi:");
OLED_ShowFloat(56, 40, humidity, 1);
OLED_ShowString(90, 40, "%");
OLED_ShowString(0, 50, "Smoke:");
OLED_ShowNumber(56, 50, smoke_level);
OLED_Refresh();
}
// 檢查報(bào)警條件
void Check_Alarm(void) {
overcurrent_flag = (current > CURRENT_THRESHOLD);
overpower_flag = (power > POWER_THRESHOLD);
smoke_alarm_flag = (smoke_level > SMOKE_THRESHOLD);
if (overcurrent_flag || overpower_flag || smoke_alarm_flag) {
Buzzer_On(); // 啟動(dòng)蜂鳴器
} else {
Buzzer_Off(); // 關(guān)閉蜂鳴器
}
}
// 上傳數(shù)據(jù)到云端
void Upload_Data(void) {
char mqtt_message[256];
sprintf(mqtt_message,
"{ "voltage": %.1f, "current": %.1f, "power": %.1f, "
""temperature": %.1f, "humidity": %.1f, "smoke": %d }",
voltage, current, power, temperature, humidity, smoke_level);
ESP8266_MQTT_Publish("home/protection", mqtt_message);
}
// 主程序
int main(void) {
System_Init(); // 系統(tǒng)初始化
while (1) {
Read_Sensors(); // 讀取傳感器數(shù)據(jù)
Display_Data(); // 顯示數(shù)據(jù)到OLED
Check_Alarm(); // 檢查是否報(bào)警
Upload_Data(); // 上傳數(shù)據(jù)到云端
}
}
【2】說(shuō)明
- 模塊初始化 :
- 初始化所有必要的模塊,包括串口、OLED、蜂鳴器、傳感器和WiFi模塊。
- 傳感器讀取 :
- 通過(guò)調(diào)用子模塊的接口,獲取電力參數(shù)、溫濕度以及煙霧濃度。
- 數(shù)據(jù)展示 :
- 使用OLED顯示屏展示實(shí)時(shí)數(shù)據(jù)。
- 報(bào)警檢查 :
- 比較測(cè)量值與設(shè)定的閾值,如果超出范圍,激活蜂鳴器報(bào)警。
- 數(shù)據(jù)上傳 :
- 通過(guò)ESP8266模塊,利用MQTT協(xié)議上傳數(shù)據(jù)到華為云物聯(lián)網(wǎng)平臺(tái)。
- 主循環(huán) :
- 循環(huán)讀取數(shù)據(jù)、顯示數(shù)據(jù)、檢查報(bào)警和上傳云端數(shù)據(jù)。
六、總結(jié)
在本項(xiàng)目中,設(shè)計(jì)并開(kāi)發(fā)了一款基于單片機(jī)和物聯(lián)網(wǎng)技術(shù)的智能居家電路保護(hù)裝置。這一裝置不僅解決了傳統(tǒng)家庭電路保護(hù)方案中信息反饋不足、管理粗放的問(wèn)題,還通過(guò)引入先進(jìn)的傳感技術(shù)和網(wǎng)絡(luò)通信手段,實(shí)現(xiàn)了對(duì)家庭用電情況的精細(xì)化管理和全方位監(jiān)控。該裝置安裝于家庭總電表輸出端,能夠支持多達(dá)20路獨(dú)立線(xiàn)路的連接,并為每一路提供電壓、電流和功率的實(shí)時(shí)監(jiān)測(cè)服務(wù)。
通過(guò)集成高精度的電力參數(shù)采集模塊,裝置可以準(zhǔn)確地測(cè)量并分析各線(xiàn)路的用電數(shù)據(jù),確保了監(jiān)測(cè)結(jié)果的真實(shí)性和可靠性。一旦檢測(cè)到異常情況,如電流或功率超過(guò)設(shè)定閾值,系統(tǒng)會(huì)立即采取行動(dòng):切斷電源以防止?jié)撛诘陌踩鹿剩⑼ㄟ^(guò)本地蜂鳴器發(fā)出警報(bào)提醒用戶(hù)。同時(shí),借助內(nèi)置的WIFI模塊,所有狀態(tài)信息都可以上傳至華為云物聯(lián)網(wǎng)平臺(tái),用戶(hù)無(wú)論身處何地,只需打開(kāi)手機(jī)上的Android應(yīng)用程序,即可查看家中的用電狀況,了解歷史變化趨勢(shì),并可查看以波形或數(shù)字形式呈現(xiàn)的數(shù)據(jù)。此外,通過(guò)這個(gè)應(yīng)用程序,用戶(hù)還可以實(shí)現(xiàn)遠(yuǎn)程控制,例如恢復(fù)被切斷的電源或者調(diào)整報(bào)警閾值,極大地提升了用戶(hù)體驗(yàn)。
為了增強(qiáng)裝置的功能性與安全性,我們?cè)谠O(shè)計(jì)中加入了環(huán)境溫濕度傳感器SHT30和煙霧濃度檢測(cè)傳感器MQ2,它們分別用于監(jiān)控室內(nèi)環(huán)境條件和空氣中的煙霧水平。這些額外的監(jiān)測(cè)功能進(jìn)一步提高了裝置對(duì)于突發(fā)狀況的響應(yīng)能力,使得它不僅僅是一個(gè)電路保護(hù)設(shè)備,更成為了一個(gè)智能家居生態(tài)系統(tǒng)的重要組成部分。OLED顯示屏的應(yīng)用,則讓用戶(hù)無(wú)需依賴(lài)智能手機(jī)也能隨時(shí)掌握當(dāng)前的用電情況和其他關(guān)鍵信息,提供了更加直觀的操作體驗(yàn)。
在硬件選型方面,選擇了STM32F103RCT6作為主控芯片,它具備高性能ARM Cortex-M3內(nèi)核,不僅滿(mǎn)足了復(fù)雜的計(jì)算任務(wù)需求,也保證了系統(tǒng)的穩(wěn)定運(yùn)行。軟件開(kāi)發(fā)采用了Keil5工具鏈進(jìn)行編程,結(jié)合C語(yǔ)言編寫(xiě)代碼,而Android應(yīng)用則使用Qt框架開(kāi)發(fā),采用C++語(yǔ)言編寫(xiě),確保了不同部分之間的無(wú)縫對(duì)接。整個(gè)項(xiàng)目的實(shí)施過(guò)程中,注重每一個(gè)細(xì)節(jié),從選擇合適的元器件到優(yōu)化算法邏輯,力求打造出一個(gè)高效、可靠且易于使用的智能居家電路保護(hù)解決方案。
這款智能居家電路保護(hù)裝置集成了多種先進(jìn)技術(shù),為用戶(hù)提供更加安全、便捷的家庭用電管理方式。它不僅是現(xiàn)代家居生活中不可或缺的安全保障工具,也是邁向智慧生活的一大步。隨著智能家居市場(chǎng)的不斷發(fā)展和技術(shù)的進(jìn)步,我們相信,這一裝置將為更多家庭帶來(lái)安心、舒適的居住體驗(yàn),并推動(dòng)智能家居領(lǐng)域向著更高層次發(fā)展。
審核編輯 黃宇
-
單片機(jī)
+關(guān)注
關(guān)注
6040文章
44592瀏覽量
636886 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2911文章
44824瀏覽量
375117 -
STM32
+關(guān)注
關(guān)注
2270文章
10915瀏覽量
356754 -
電路保護(hù)
+關(guān)注
關(guān)注
4文章
361瀏覽量
55311
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論