一、前言
1.1 項目介紹
【1】項目開發背景
隨著現代家庭電器設備的日益增多,家庭用電安全問題逐漸成為人們關注的重點。為了確保家庭電路的安全可靠運行,預防因電路故障或不當使用電器而導致的安全事故,設計一款高效、智能的居家電路保護裝置顯得尤為重要。該裝置不僅能夠實時監測家庭電路中的電壓、電流和功率等關鍵參數,還能對環境溫濕度及煙霧濃度進行監控,從而為用戶提供全方位的家庭用電安全保障。
在傳統家庭電路保護方案中,通常僅依靠斷路器來提供過載保護,但這種方式無法實現精細化管理,也無法為用戶提供詳細的用電信息反饋。因此,我們基于單片機與物聯網技術,開發了一款集成了多種功能的智能居家電路保護裝置。這款裝置安裝于家庭總電表輸出端,支持多達20路獨立線路的連接,每一路都可以單獨監控其用電情況,包括電壓、電流、功率的變化。通過內置的高精度電力參數采集模塊,裝置能夠準確測量并分析各線路的用電數據,一旦檢測到異常,如電流或功率超過設定閾值,它將立即切斷電源,并通過本地蜂鳴器發出警報,同時向用戶的手機APP發送通知,以便用戶及時采取措施。
考慮到智能家居系統的普及以及用戶對于遠程監控的需求,我們的設計方案特別加入了WIFI聯網功能。利用MQTT協議,所有狀態信息都可以上傳至華為云物聯網服務器,用戶無論身處何地,只需打開手機上的Android應用程序,即可查看家中的用電狀況,了解歷史變化趨勢,并可查看以波形或數字形式呈現的數據。此外,通過這個應用程序,用戶還能夠實現遠程控制,例如恢復被切斷的電源或者調整報警閾值。
為了讓用戶更直觀地掌握當前的用電情況,我們在裝置上配置了一個OLED顯示屏,可以實時顯示采集到的所有信息。這樣即使沒有智能手機,用戶也能一目了然地看到重要的用電數據。同時,我們也選用了SHT30傳感器來監測環境溫濕度,以及MQ2傳感器用于煙霧濃度監測,這些都進一步增強了裝置的安全性和功能性。
整個項目采用STM32F103RCT6作為主控芯片,它具有高性能、低功耗的特點,非常適合處理復雜的計算任務和通信任務。軟件方面,STM32的開發使用Keil5工具鏈,編程語言選擇C語言,而Android應用則采用Qt框架進行開發,編程語言為C++。這種組合不僅保證了硬件和軟件之間的緊密配合,也使得系統具備良好的穩定性和擴展性。通過這樣一個智能居家電路保護裝置,我們希望能夠為每一個家庭帶來更加安心、便捷的用電體驗。
【2】設計實現的功能
當前項目使用的硬件模塊對應的代碼工程已經更新到網盤:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
(1) 電路監測與保護功能
支持直流電和單相交流電的電壓、電流、功率監測功能。當檢測到某一路線路的電流或功率超過設定閥值時,裝置會立即切斷電源,同時通過本地蜂鳴器報警,上傳告警信息至物聯網服務器,并推送到手機APP。
(2) 多路電路獨立監控
支持最多20路獨立線路的用電參數監測,包括電壓、電流、功率等。各路參數的歷史變化數據會以波形圖或數字形式在手機APP中顯示,方便用戶掌握各電器的用電情況。
(3) 環境溫濕度監測功能
通過SHT30傳感器實時測量周圍環境的溫度和濕度,并將數據上傳到物聯網服務器和手機APP,同時支持在本地OLED顯示屏上顯示當前的環境信息。
(4) 煙霧濃度檢測功能
利用MQ2傳感器監測空氣中的煙霧濃度。如果煙霧濃度超過設定的安全閾值,裝置會立即觸發本地蜂鳴器報警,同時將告警信息上傳至物聯網服務器,并推送到手機APP進行遠程提醒。
(5) 數據上云與遠程監控
支持通過WIFI模塊與物聯網服務器連接,采用MQTT協議上傳設備的各類數據(包括電路監測數據、環境溫濕度數據、煙霧濃度數據等)。用戶可通過Android手機APP實時查看設備狀態,獲取數據歷史記錄,并遠程操作和管理設備。
(6) 本地實時數據顯示
采用0.96英寸OLED顯示屏,實時顯示所有監測數據,包括電壓、電流、功率、環境溫濕度、煙霧濃度等信息,便于用戶在現場查看設備工作狀態。
(7) 超限保護與告警功能
當檢測到任何線路的電流、功率超出設定閥值,或煙霧濃度超標時,裝置會自動切斷相關線路的電源,并發出蜂鳴器告警,同時通過物聯網服務器將信息傳遞至手機APP。
(8) 歷史數據存儲與波形顯示
支持電壓、電流、功率等參數的歷史變化數據存儲,并通過手機APP以波形圖形式顯示,方便用戶進行用電分析和趨勢判斷。
(9) 手機APP遠程控制功能
用戶可通過手機APP遠程控制設備,包括開關各路電路、修改參數閾值,以及查看歷史數據和告警記錄等。
(10) 智能化與模塊化設計
所有功能模塊化設計,方便硬件擴展與維護,同時通過軟件配置和調試實現靈活功能升級,適應不同家庭需求。
(11) 全面的安全與節能方案
通過精準的監測和智能控制,幫助用戶在確保安全的前提下合理用電、減少浪費,實現節能減排的目標。
【3】項目硬件模塊組成
(1) 主控模塊 :采用STM32F103RCT6作為核心控制器,該芯片具備高性能ARM Cortex-M3內核,提供豐富的外設接口和足夠的處理能力,以滿足對多路電力參數的實時監測、數據處理以及與云端通信的需求。
(2) 電力參數采集模塊 :選用支持串口通信的電力參數采集模塊,用于精確測量每一路電路中的電壓、電流和功率等電能參數。此模塊能夠將采集到的數據通過串行接口發送給主控MCU進行分析處理,確保了數據的準確性與穩定性。
(3) 環境溫濕度傳感器 :安裝SHT30數字溫濕度傳感器,用以監控周圍環境的溫度和濕度變化。該傳感器具有高精度和快速響應的特點,可以為用戶提供準確的室內環境信息,并幫助檢測潛在的安全隱患。
(4) 煙霧濃度檢測模塊 :集成MQ2氣體傳感器,專門用來探測空氣中煙霧濃度。當檢測到異常高的煙霧水平時,系統會觸發報警機制,提醒用戶可能存在火災風險。
(5) 無線通信模塊 :采用ESP8266 WIFI模塊,負責實現設備與互聯網之間的連接,使得裝置可以通過MQTT協議向華為云物聯網平臺上傳數據。此外,它還支持遠程配置和控制功能,允許用戶通過手機APP管理家居用電情況。
(6) 本地顯示模塊 :配備一塊OLED顯示屏,用于直觀地呈現當前各路電路的電壓、電流、功率狀態,以及環境溫濕度和煙霧濃度等信息。OLED屏幕提供了清晰的視覺效果,便于用戶即時了解家庭用電狀況。
(7) 聲光報警模塊 :包括一個高電平觸發的有源蜂鳴器,當檢測到任何危險信號(如過載、短路或者高煙霧濃度)時,蜂鳴器會發出響亮的聲音警報;同時還可以添加LED指示燈來增強視覺警示效果。
(8) 電源管理模塊 :設計專門的電源管理系統,確保整個系統的穩定供電。考慮到不同應用場景下的需求,該模塊應能兼容直流和單相交流輸入,并且擁有適當的過壓、欠壓保護措施,以保障系統長期可靠運行。
(9) 繼電器控制模塊 :為了實現對各路電路的通斷控制,每個回路上都會串聯一個小型繼電器。這些繼電器受主控MCU控制,在發生異常情況時迅速切斷相關電路,防止事故擴大化。
1.2 設計思路
本項目設計的核心思路是將電路保護功能與物聯網技術相結合,構建一個智能化、模塊化的居家電路保護裝置。通過對家庭電路的實時監控和遠程管理,實現對電路安全的全面保障和對用電信息的高效管理。整個設計從功能需求出發,綜合硬件選型、軟件開發、數據通信和用戶體驗等多個方面展開,力求提供一套完整且實用的解決方案。
基于對家庭用電安全問題的分析,確定了裝置的主要功能,包括電路監測與保護、環境參數監測、煙霧濃度檢測等。為了實現這些功能,選擇STM32F103RCT6作為主控芯片,利用其性能穩定、資源豐富的特點,通過與外部傳感器和模塊的結合,構建多功能數據采集與處理系統。設計中采用的電力參數采集模塊通過串口通信采集電壓、電流、功率等關鍵參數,確保數據的精確性和可靠性。同時,為提升系統的適用性,支持最多20路獨立線路的電路監控與保護,滿足大多數家庭的用電需求。
考慮到家庭環境對安全和舒適的雙重要求,設計中加入了環境溫濕度監測和煙霧濃度檢測功能。環境溫濕度通過SHT30傳感器獲取,實時反映家庭的環境狀態,幫助用戶及時調整室內環境。煙霧濃度通過MQ2傳感器檢測,當煙霧濃度超限時觸發報警,及時預警潛在火災風險,為家庭安全提供額外保障。這些功能的加入,不僅豐富了裝置的應用場景,還顯著提升了用戶的安全感。
為了實現設備的智能化和遠程管理,項目設計中引入了物聯網技術。裝置通過WIFI模塊接入互聯網,利用MQTT協議與華為云物聯網服務器通信。所有數據,包括電路參數、環境參數和報警信息,都將實時上傳至服務器。用戶可通過Android手機APP查看這些數據,APP采用Qt開發,提供直觀的用戶界面和高效的交互方式。此外,APP還支持遠程操作,包括線路開關控制、參數閾值設置等,極大地提升了用戶的便捷性和對設備的掌控能力。
數據展示方面,項目設計兼顧了遠程和本地兩種場景。在遠程端,手機APP提供波形和數字兩種顯示方式,滿足用戶對用電數據的詳細分析需求。在本地端,使用0.96英寸OLED顯示屏實時顯示當前監測的所有數據,方便用戶在現場直觀了解設備的運行狀態。此外,歷史數據的存儲和展示功能,使用戶能夠回顧和分析各項參數的變化趨勢,幫助優化用電習慣。
為了確保系統的穩定性與可靠性,設計中采用了模塊化思路,各功能模塊相對獨立,互不干擾。例如,電路監測模塊、環境監測模塊、煙霧檢測模塊和數據通信模塊分別設計和測試,在主控芯片的統一管理下協調運行。這樣不僅簡化了硬件設計和軟件開發過程,還提高了系統的可維護性和擴展性。
整體設計還充分考慮了設備的安全性。通過硬件和軟件的結合,裝置在檢測到電路超載或煙霧超標時,能迅速切斷電源并發出警報,最大程度降低風險。同時,利用物聯網技術實現遠程報警提醒,讓用戶即使不在家中也能及時掌握安全狀況。綜合以上設計思路,本項目不僅滿足了現代家庭對電路保護的基本需求,還通過智能化手段提升了用戶體驗,為建設更加安全、舒適和節能的家庭環境提供了可靠的技術支持。
1.3 系統功能總結
當前項目使用的相關軟件工具、模塊源碼已經上傳到網盤:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
功能模塊 | 描述 |
---|---|
主控模塊 | 使用STM32F103RCT6作為核心控制器,負責整體數據處理、邏輯控制及與各子系統的通信。 |
電力參數監測 | 實時監測每一路線路上的電壓、電流和功率,并在超過設定閾值時自動切斷電源并報警。 |
環境溫濕度監測 | 通過SHT30傳感器實時監測環境溫度和濕度,提供室內環境信息,幫助識別潛在的安全風險。 |
煙霧濃度監測 | 利用MQ2傳感器檢測空氣中的煙霧濃度,在濃度超標時觸發警報并向用戶發送通知。 |
無線通信功能 | 內置WIFI模塊ESP8266,使用MQTT協議將設備狀態上傳至華為云物聯網平臺,支持遠程監控。 |
本地顯示功能 | 配備OLED顯示屏,實時顯示當前用電情況、環境參數等信息,方便用戶查看。 |
聲光報警功能 | 包含高電平觸發的有源蜂鳴器和可能的LED指示燈,在檢測到異常情況時發出聲音和燈光警示。 |
遠程控制功能 | 用戶可通過手機APP實現對設備的遠程控制,包括但不限于調整報警閾值、恢復被切斷的電源等。 |
歷史數據分析 | 支持對測量的電壓、電流、功率參數的歷史變化進行記錄,并能在APP上以波形或數字形式展示。 |
電源管理功能 | 設計有專門的電源管理系統,確保系統穩定供電,同時具備過壓、欠壓保護等功能。 |
繼電器控制功能 | 每個回路配備小型繼電器,用于快速響應異常情況下的斷電操作,保障安全。 |
外部接口擴展功能 | 提供擴展接口,為未來的硬件升級或連接額外傳感器留出空間。 |
1.4 開發工具的選擇
【1】設備端開發
STM32的編程語言選擇C語言,C語言執行效率高,大學里主學的C語言,C語言編譯出來的可執行文件最接近于機器碼,匯編語言執行效率最高,但是匯編的移植性比較差,目前在一些操作系統內核里還有一些低配的單片機使用的較多,平常的單片機編程還是以C語言為主。C語言的執行效率僅次于匯編,語法理解簡單、代碼通用性強,也支持跨平臺,在嵌入式底層、單片機編程里用的非常多,當前的設計就是采用C語言開發。
開發工具選擇Keil,keil是一家世界領先的嵌入式微控制器軟件開發商,在2015年,keil被ARM公司收購。因為當前芯片選擇的是STM32F103系列,STMF103是屬于ARM公司的芯片構架、Cortex-M3內核系列的芯片,所以使用Kile來開發STM32是有先天優勢的,而keil在各大高校使用的也非常多,很多教科書里都是以keil來教學,開發51單片機、STM32單片機等等。目前作為MCU芯片開發的軟件也不只是keil一家獨大,IAR在MCU微處理器開發領域里也使用的非常多,IAR擴展性更強,也支持STM32開發,也支持其他芯片,比如:CC2530,51單片機的開發。從軟件的使用上來講,IAR比keil更加簡潔,功能相對少一些。如果之前使用過keil,而且使用頻率較多,已經習慣再使用IAR是有點不適應界面的。
【2】上位機開發
上位機的開發選擇Qt框架,編程語言采用C++;Qt是一個1991年由Qt Company開發的跨平臺C++圖形用戶界面應用程序開發框架。它既可以開發GUI程序,也可用于開發非GUI程序,比如控制臺工具和服務器。Qt是面向對象的框架,使用特殊的代碼生成擴展(稱為元對象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴展,并且允許真正地組件編程。Qt能輕松創建具有原生C++性能的連接設備、用戶界面(UI)和應用程序。它功能強大且結構緊湊,擁有直觀的工具和庫。
二、部署華為云物聯網平臺
華為云官網: https://www.huaweicloud.com/
打開官網,搜索物聯網,就能快速找到 設備接入IoTDA
。
2.1 物聯網平臺介紹
華為云物聯網平臺(IoT 設備接入云服務)提供海量設備的接入和管理能力,將物理設備聯接到云,支撐設備數據采集上云和云端下發命令給設備進行遠程控制,配合華為云其他產品,幫助我們快速構筑物聯網解決方案。
使用物聯網平臺構建一個完整的物聯網解決方案主要包括3部分:物聯網平臺、業務應用和設備。
物聯網平臺作為連接業務應用和設備的中間層,屏蔽了各種復雜的設備接口,實現設備的快速接入;同時提供強大的開放能力,支撐行業用戶構建各種物聯網解決方案。
設備可以通過固網、2G/3G/4G/5G、NB-IoT、Wifi等多種網絡接入物聯網平臺,并使用LWM2M/CoAP、MQTT、HTTPS協議將業務數據上報到平臺,平臺也可以將控制命令下發給設備。
業務應用通過調用物聯網平臺提供的API,實現設備數據采集、命令下發、設備管理等業務場景。
2.2 開通物聯網服務
地址: https://www.huaweicloud.com/product/iothub.html
點擊立即創建
。
正在創建標準版實例,需要等待片刻。
創建完成之后,點擊實例名稱。 可以看到標準版實例的設備接入端口和地址。
在上面也能看到 免費單元的限制。
開通之后,點擊總覽
,也能查看接入信息。 我們當前設備準備采用MQTT協議接入華為云平臺,這里可以看到MQTT協議的地址和端口號等信息。
總結:
端口號: MQTT (1883)| MQTTS (8883)
接入地址:ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
**根據域名地址得到IP地址信息: **
打開Windows電腦的命令行控制臺終端,使用ping
命令。ping
一下即可。
Microsoft Windows [版本 10.0.19045.4170]
(c) Microsoft Corporation。保留所有權利。
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 字節的數據:
來自 117.78.5.125 的回復: 字節=32 時間=35ms TTL=93
來自 117.78.5.125 的回復: 字節=32 時間=36ms TTL=93
來自 117.78.5.125 的回復: 字節=32 時間=36ms TTL=93
來自 117.78.5.125 的回復: 字節=32 時間=39ms TTL=93
117.78.5.125 的 Ping 統計信息:
數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
最短 = 35ms,最長 = 39ms,平均 = 36ms
C:Users11266 >
MQTT協議接入端口號有兩個,1883是非加密端口,8883是證書加密端口,單片機無法加載證書,所以使用1883端口比較合適。 接下來的ESP8266就采用1883端口連接華為云物聯網平臺。
2.3 創建產品
(1)創建產品
(2)填寫產品信息
根據自己產品名字填寫,下面的設備類型選擇自定義類型。
(3)產品創建成功
創建完成之后點擊查看詳情。
(4)添加自定義模型
產品創建完成之后,點擊進入產品詳情頁面,翻到最下面可以看到模型定義。
模型簡單來說: 就是存放設備上傳到云平臺的數據。
你可以根據自己的產品進行創建。
比如:
煙霧可以叫 MQ2
溫度可以叫 Temperature
濕度可以叫 humidity
火焰可以叫 flame
其他的傳感器自己用單詞簡寫命名即可。 這就是你的單片機設備端上傳到服務器的數據名字。
先點擊自定義模型。
再創建一個服務ID。
接著點擊新增屬性。
2.4 添加設備
產品是屬于上層的抽象模型,接下來在產品模型下添加實際的設備。添加的設備最終需要與真實的設備關聯在一起,完成數據交互。
(1)注冊設備
(2)根據自己的設備填寫
(3)保存設備信息
創建完畢之后,點擊保存并關閉,得到創建的設備密匙信息。該信息在后續生成MQTT三元組的時候需要使用。
(4)設備創建完成
(5)設備詳情
2.5 MQTT協議主題訂閱與發布
(1)MQTT協議介紹
當前的設備是采用MQTT協議與華為云平臺進行通信。
MQTT是一個物聯網傳輸協議,它被設計用于輕量級的發布/訂閱式消息傳輸,旨在為低帶寬和不穩定的網絡環境中的物聯網設備提供可靠的網絡服務。MQTT是專門針對物聯網開發的輕量級傳輸協議。MQTT協議針對低帶寬網絡,低計算能力的設備,做了特殊的優化,使得其能適應各種物聯網應用場景。目前MQTT擁有各種平臺和設備上的客戶端,已經形成了初步的生態系統。
MQTT是一種消息隊列協議,使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合,相對于其他協議,開發更簡單;MQTT協議是工作在TCP/IP協議上;由TCP/IP協議提供穩定的網絡連接;所以,只要具備TCP協議棧的網絡設備都可以使用MQTT協議。 本次設備采用的ESP8266就具備TCP協議棧,能夠建立TCP連接,所以,配合STM32代碼里封裝的MQTT協議,就可以與華為云平臺完成通信。
華為云的MQTT協議接入幫助文檔在這里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
業務流程:
(2)華為云平臺MQTT協議使用限制
描述 | 限制 |
---|---|
支持的MQTT協議版本 | 3.1.1 |
與標準MQTT協議的區別 | 支持Qos 0和Qos 1支持Topic自定義不支持QoS2不支持will、retain msg |
MQTTS支持的安全等級 | 采用TCP通道基礎 + TLS協議(最高TLSv1.3版本) |
單帳號每秒最大MQTT連接請求數 | 無限制 |
單個設備每分鐘支持的最大MQTT連接數 | 1 |
單個MQTT連接每秒的吞吐量,即帶寬,包含直連設備和網關 | 3KB/s |
MQTT單個發布消息最大長度,超過此大小的發布請求將被直接拒絕 | 1MB |
MQTT連接心跳時間建議值 | 心跳時間限定為30至1200秒,推薦設置為120秒 |
產品是否支持自定義Topic | 支持 |
消息發布與訂閱 | 設備只能對自己的Topic進行消息發布與訂閱 |
每個訂閱請求的最大訂閱數 | 無限制 |
(3)主題訂閱格式
幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
對于設備而言,一般會訂閱平臺下發消息給設備 這個主題。
設備想接收平臺下發的消息,就需要訂閱平臺下發消息給設備 的主題,訂閱后,平臺下發消息給設備,設備就會收到消息。
如果設備想要知道平臺下發的消息,需要訂閱上面圖片里標注的主題。
以當前設備為例,最終訂閱主題的格式如下:
$oc/devices/{device_id}/sys/messages/down
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down
(4)主題發布格式
對于設備來說,主題發布表示向云平臺上傳數據,將最新的傳感器數據,設備狀態上傳到云平臺。
這個操作稱為:屬性上報。
幫助文檔地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
根據幫助文檔的介紹, 當前設備發布主題,上報屬性的格式總結如下:
發布的主題格式:
$oc/devices/{device_id}/sys/properties/report
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
發布主題時,需要上傳數據,這個數據格式是JSON格式。
上傳的JSON數據格式如下:
{
"services": [
{
"service_id": < 填服務ID >,
"properties": {
"< 填屬性名稱1 >": < 填屬性值 >,
"< 填屬性名稱2 >": < 填屬性值 >,
..........
}
}
]
}
根據JSON格式,一次可以上傳多個屬性字段。 這個JSON格式里的,服務ID,屬性字段名稱,屬性值類型,在前面創建產品的時候就已經介紹了,不記得可以翻到前面去查看。
根據這個格式,組合一次上傳的屬性數據:
{"services": [{"service_id": "stm32","properties":{"DHT11_T":30,"DHT11_H":10,"BH1750":1,"MQ135":0}}]}
2.6 MQTT三元組
MQTT協議登錄需要填用戶ID,設備ID,設備密碼等信息,就像我們平時登錄QQ,微信一樣要輸入賬號密碼才能登錄。MQTT協議登錄的這3個參數,一般稱為MQTT三元組。
接下來介紹,華為云平臺的MQTT三元組參數如何得到。
(1)MQTT服務器地址
要登錄MQTT服務器,首先記得先知道服務器的地址是多少,端口是多少。
幫助文檔地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home
MQTT協議的端口支持1883和8883,它們的區別是:8883 是加密端口更加安全。但是單片機上使用比較困難,所以當前的設備是采用1883端口進連接的。
根據上面的域名和端口號,得到下面的IP地址和端口號信息: 如果設備支持填寫域名可以直接填域名,不支持就直接填寫IP地址。 (IP地址就是域名解析得到的)
華為云的MQTT服務器地址:117.78.5.125
華為云的MQTT端口號:1883
如何得到IP地址?如何域名轉IP? 打開Windows的命令行輸入以下命令。
ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
(2)生成MQTT三元組
華為云提供了一個在線工具,用來生成MQTT鑒權三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打開這個工具,填入設備的信息(也就是剛才創建完設備之后保存的信息),點擊生成,就可以得到MQTT的登錄信息了。
下面是打開的頁面:
填入設備的信息: (上面兩行就是設備創建完成之后保存得到的)
直接得到三元組信息。
得到三元組之后,設備端通過MQTT協議登錄鑒權的時候,填入參數即可。
ClientId 663cb18871d845632a0912e7_dev1_0_0_2024050911
Username 663cb18871d845632a0912e7_dev1
Password 71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237
2.7 模擬設備登錄測試
經過上面的步驟介紹,已經創建了產品,設備,數據模型,得到MQTT登錄信息。 接下來就用MQTT客戶端軟件模擬真實的設備來登錄平臺。測試與服務器通信是否正常。
(1)填入登錄信息
打開MQTT客戶端軟件,對號填入相關信息(就是上面的文本介紹)。然后,點擊登錄,訂閱主題,發布主題。
(2)打開網頁查看
完成上面的操作之后,打開華為云網頁后臺,可以看到設備已經在線了。
點擊詳情頁面,可以看到上傳的數據:
到此,云平臺的部署已經完成,設備已經可以正常上傳數據了。
(3)MQTT登錄測試參數總結
MQTT服務器: 117.78.5.125
MQTT端口號: 183
//物聯網服務器的設備信息
#define MQTT_ClientID "663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define MQTT_UserName "663cb18871d845632a0912e7_dev1"
#define MQTT_PassWord "71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"
//訂閱與發布的主題
#define SET_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down" //訂閱
#define POST_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report" //發布
發布的數據:
{"services": [{"service_id": "stm32","properties":{"DHT11_T":30,"DHT11_H":10,"BH1750":1,"MQ135":0}}]}
2.8 創建IAM賬戶
創建一個IAM賬戶,因為接下來開發上位機,需要使用云平臺的API接口,這些接口都需要token進行鑒權。簡單來說,就是身份的認證。 調用接口獲取Token時,就需要填寫IAM賬號信息。所以,接下來演示一下過程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
**【1】獲取項目憑證 ** 點擊左上角用戶名,選擇下拉菜單里的我的憑證
項目憑證:
28add376c01e4a61ac8b621c714bf459
【2】創建IAM用戶
鼠標放在左上角頭像上,在下拉菜單里選擇統一身份認證
。
點擊左上角創建用戶
。
創建成功:
【3】創建完成
用戶信息如下:
主用戶名 l19504562721
IAM用戶 ds_abc
密碼 DS12345678
2.9 獲取影子數據
幫助文檔:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html
設備影子介紹:
設備影子是一個用于存儲和檢索設備當前狀態信息的JSON文檔。
每個設備有且只有一個設備影子,由設備ID唯一標識
設備影子僅保存最近一次設備的上報數據和預期數據
無論該設備是否在線,都可以通過該影子獲取和設置設備的屬性
簡單來說:設備影子就是保存,設備最新上傳的一次數據。
我們設計的軟件里,如果想要獲取設備的最新狀態信息,就采用設備影子接口。
如果對接口不熟悉,可以先進行在線調試:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow
在線調試接口,可以請求影子接口,了解請求,與返回的數據格式。
調試完成看右下角的響應體,就是返回的影子數據。
設備影子接口返回的數據如下:
{
"device_id": "663cb18871d845632a0912e7_dev1",
"shadow": [
{
"service_id": "stm32",
"desired": {
"properties": null,
"event_time": null
},
"reported": {
"properties": {
"DHT11_T": 18,
"DHT11_H": 90,
"BH1750": 38,
"MQ135": 70
},
"event_time": "20240509T113448Z"
},
"version": 3
}
]
}
調試成功之后,可以得到訪問影子數據的真實鏈接,接下來的代碼開發中,就采用Qt寫代碼訪問此鏈接,獲取影子數據,完成上位機開發。
鏈接如下:
https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow
三、上位機開發(C++版)
為了方便查看設備上傳的數據,接下來利用Qt開發一款Android手機APP 和 Windows上位機。
使用華為云平臺提供的API接口獲取設備上傳的數據,進行可視化顯示,以及遠程控制設備。
3.1 Qt開發環境安裝
Qt的中文官網: https://www.qt.io/zh-cn/
QT5.12.6的下載地址:https://download.qt.io/archive/qt/5.12/5.12.6
打開下載鏈接后選擇下面的版本進行下載:
如果下載不了,可以在網盤里找到安裝包下載: 飛書文檔記錄的網盤地址:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
軟件安裝時斷網安裝,否則會提示輸入賬戶。
安裝的時候,第一個復選框里的編譯器可以全選,直接點擊下一步繼續安裝。
選擇編譯器: (一定要看清楚了)
3.2 新建上位機工程
前面2講解了需要用的API接口,接下來就使用Qt設計上位機,設計界面,完成整體上位機的邏輯設計。
【1】新建工程
【2】設置項目的名稱。
【3】選擇編譯系統
【4】選擇默認繼承的類
【5】選擇編譯器
【6】點擊完成
【7】工程創建完成
3.3 切換編譯器
在左下角是可以切換編譯器的。 可以選擇用什么樣的編譯器編譯程序。
目前新建工程的時候選擇了2種編譯器。 一種是mingw32
這個編譯Windows下運行的程序。 一種是Android
編譯器,可以生成Android
手機APP。
不過要注意:Android的編譯器需要配置一些環境才可以正常使用,這個大家可以網上找找教程配置一下就行了。
比如:https://blog.csdn.net/xiaolong1126626497/article/details/117254453
windows的編譯器就沒有這么麻煩,安裝好Qt就可以編譯使用。
下面我這里就選擇的 mingw32
這個編譯器,編譯Windows下運行的程序。
3.4 編譯測試功能
創建完畢之后,編譯測試一下功能是否OK。
點擊左下角的綠色三角形按鈕
。
正常運行就可以看到彈出一個白色的框框。這就表示工程環境沒有問題了。 接下來就可以放心的設計界面了。
3.5 設計UI界面與工程配置
【1】打開UI文件
打開默認的界面如下:
【2】開始設計界面
根據自己需求設計界面。
3.6 編譯Windows上位機
點擊軟件左下角的綠色三角形按鈕進行編譯運行。
3.7 配置Android環境
如果想編譯Android手機APP,必須要先自己配置好自己的Android環境。(搭建環境的過程可以自行百度搜索學習)
然后才可以進行下面的步驟。
【1】選擇Android編譯器
【2】創建Android配置文件
創建完成。
【3】配置Android圖標與名稱
【3】編譯Android上位機
Qt本身是跨平臺的,直接選擇Android的編譯器,就可以將程序編譯到Android平臺。
然后點擊構建。
成功之后,在目錄下可以看到生成的apk
文件,也就是Android手機的安裝包,電腦端使用QQ
發送給手機QQ,手機登錄QQ接收,就能直接安裝。
生成的apk
的目錄在哪里呢? 編譯完成之后,在控制臺會輸出APK文件的路徑。
知道目錄在哪里之后,在Windows的文件資源管理器里,找到路徑,具體看下圖,找到生成的apk文件。
四、PyQt5(Python版)
4.1 安裝PyQt5
在Python中安裝PyQt庫非常簡單,可以使用pip
這個包管理工具來完成。PyQt有兩個主要版本:PyQt5(基于Qt 5)和PyQt6(基于Qt 6)。
我這里安裝Qt5,以Qt5為例進行開發。
要安裝PyQt5,打開命令行界面,然后運行以下命令:
pip install PyQt5
安裝過程中:
安裝完畢。
4.2 安裝QtDesigner
如果想使用PyQt5的設計工具(Qt Designer),用圖形方式設計界面,可以安裝pyqt5-tools
:
pip install pyqt5-tools
安裝過程如下:
安裝過程中
安裝完畢。
4.3 測試Qt環境
安裝完成后,先寫一份測試代碼,創建一個窗口,運行測試Qt環境是否正常。
新建一個文件:hello_pyqt.py
編寫代碼如下:
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_())
在終端命令行中運行:
python hello_pyqt.py
如果一切正常,應該能看到一個標題為Hello PyQt
的空白窗口。這表明PyQt已經成功安裝并且可以正常使用了。
4.4 設計代碼
用 PyQt5 展示了獲取數據后如何構建圖形界面,實時顯示溫度、濕度、煙霧濃度、電壓、電流、功率的數值及其波形圖。
安裝依賴:
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:
"""模擬從服務器獲取數據的類"""
def get_data(self):
"""獲取模擬數據"""
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")
# 初始化布局和標簽
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)
# 初始化數據獲取器
self.data_fetcher = DataFetcher()
# 定時器,每秒刷新數據
self.timer = QTimer()
self.timer.timeout.connect(self.update_data)
self.timer.start(1000)
# 時間步計數
self.time_step = 0
def create_chart(self, title):
"""創建一個帶有標題的波形圖"""
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):
"""更新界面和波形圖的數據"""
data = self.data_fetcher.get_data()
# 更新文本標簽
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):
"""更新指定波形圖的數據"""
series.append(QPointF(self.time_step, value))
if series.count() > 100: # 限制最大點數
series.remove(0)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(800, 600)
window.show()
sys.exit(app.exec_())
五、STM32代碼開發
當前項目使用的相關軟件工具、傳感器代碼工程,已經上傳到網盤: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;
// 警告標志
uint8_t overcurrent_flag = 0;
uint8_t overpower_flag = 0;
uint8_t smoke_alarm_flag = 0;
// 初始化函數
void System_Init(void) {
// 初始化串口
USART_Init();
// 初始化OLED顯示屏
OLED_Init();
// 初始化蜂鳴器
Buzzer_Init();
// 初始化環境溫濕度傳感器
SHT30_Init();
// 初始化煙霧傳感器
MQ2_Init();
// 初始化ESP8266 WiFi模塊
ESP8266_Init();
// 初始化電力參數采集模塊
PowerMonitor_Init();
}
// 讀取傳感器數據
void Read_Sensors(void) {
// 讀取電力參數
PowerMonitor_Read(&voltage, ¤t, &power, &energy);
// 讀取溫濕度
SHT30_Read(&temperature, &humidity);
// 讀取煙霧濃度
smoke_level = MQ2_Read();
}
// 顯示數據到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();
}
// 檢查報警條件
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(); // 啟動蜂鳴器
} else {
Buzzer_Off(); // 關閉蜂鳴器
}
}
// 上傳數據到云端
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(); // 系統初始化
while (1) {
Read_Sensors(); // 讀取傳感器數據
Display_Data(); // 顯示數據到OLED
Check_Alarm(); // 檢查是否報警
Upload_Data(); // 上傳數據到云端
}
}
【2】說明
- 模塊初始化 :
- 初始化所有必要的模塊,包括串口、OLED、蜂鳴器、傳感器和WiFi模塊。
- 傳感器讀取 :
- 通過調用子模塊的接口,獲取電力參數、溫濕度以及煙霧濃度。
- 數據展示 :
- 使用OLED顯示屏展示實時數據。
- 報警檢查 :
- 比較測量值與設定的閾值,如果超出范圍,激活蜂鳴器報警。
- 數據上傳 :
- 通過ESP8266模塊,利用MQTT協議上傳數據到華為云物聯網平臺。
- 主循環 :
- 循環讀取數據、顯示數據、檢查報警和上傳云端數據。
六、總結
在本項目中,設計并開發了一款基于單片機和物聯網技術的智能居家電路保護裝置。這一裝置不僅解決了傳統家庭電路保護方案中信息反饋不足、管理粗放的問題,還通過引入先進的傳感技術和網絡通信手段,實現了對家庭用電情況的精細化管理和全方位監控。該裝置安裝于家庭總電表輸出端,能夠支持多達20路獨立線路的連接,并為每一路提供電壓、電流和功率的實時監測服務。
通過集成高精度的電力參數采集模塊,裝置可以準確地測量并分析各線路的用電數據,確保了監測結果的真實性和可靠性。一旦檢測到異常情況,如電流或功率超過設定閾值,系統會立即采取行動:切斷電源以防止潛在的安全事故,并通過本地蜂鳴器發出警報提醒用戶。同時,借助內置的WIFI模塊,所有狀態信息都可以上傳至華為云物聯網平臺,用戶無論身處何地,只需打開手機上的Android應用程序,即可查看家中的用電狀況,了解歷史變化趨勢,并可查看以波形或數字形式呈現的數據。此外,通過這個應用程序,用戶還可以實現遠程控制,例如恢復被切斷的電源或者調整報警閾值,極大地提升了用戶體驗。
為了增強裝置的功能性與安全性,我們在設計中加入了環境溫濕度傳感器SHT30和煙霧濃度檢測傳感器MQ2,它們分別用于監控室內環境條件和空氣中的煙霧水平。這些額外的監測功能進一步提高了裝置對于突發狀況的響應能力,使得它不僅僅是一個電路保護設備,更成為了一個智能家居生態系統的重要組成部分。OLED顯示屏的應用,則讓用戶無需依賴智能手機也能隨時掌握當前的用電情況和其他關鍵信息,提供了更加直觀的操作體驗。
在硬件選型方面,選擇了STM32F103RCT6作為主控芯片,它具備高性能ARM Cortex-M3內核,不僅滿足了復雜的計算任務需求,也保證了系統的穩定運行。軟件開發采用了Keil5工具鏈進行編程,結合C語言編寫代碼,而Android應用則使用Qt框架開發,采用C++語言編寫,確保了不同部分之間的無縫對接。整個項目的實施過程中,注重每一個細節,從選擇合適的元器件到優化算法邏輯,力求打造出一個高效、可靠且易于使用的智能居家電路保護解決方案。
這款智能居家電路保護裝置集成了多種先進技術,為用戶提供更加安全、便捷的家庭用電管理方式。它不僅是現代家居生活中不可或缺的安全保障工具,也是邁向智慧生活的一大步。隨著智能家居市場的不斷發展和技術的進步,我們相信,這一裝置將為更多家庭帶來安心、舒適的居住體驗,并推動智能家居領域向著更高層次發展。
審核編輯 黃宇
-
單片機
+關注
關注
6042文章
44617瀏覽量
637874 -
物聯網
+關注
關注
2913文章
44915瀏覽量
376212 -
STM32
+關注
關注
2271文章
10923瀏覽量
357208 -
電路保護
+關注
關注
4文章
361瀏覽量
55328
發布評論請先 登錄
相關推薦
評論