• 正文
    • 一、前言
    • 二、搭建開發(fā)環(huán)境
    • 五、微信小程序設(shè)計思路
    • 四、STM32設(shè)備端設(shè)計思路
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

基于STM32設(shè)計的智能插座

03/10 10:10
1224
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

一、前言

1.1 項目介紹

【1】項目開發(fā)背景

隨著物聯(lián)網(wǎng)技術(shù)的快速發(fā)展,智能家居逐漸成為現(xiàn)代生活的重要組成部分。智能插座作為智能家居的基礎(chǔ)設(shè)備之一,不僅能夠?qū)崿F(xiàn)傳統(tǒng)插座的基本功能,還能通過集成多種傳感器通信模塊,實現(xiàn)對電器設(shè)備的遠(yuǎn)程控制、能耗監(jiān)測和環(huán)境數(shù)據(jù)采集等功能?;谶@一背景,設(shè)計一款基于STM32的智能插座,能夠滿足用戶對電能管理、環(huán)境監(jiān)測和遠(yuǎn)程控制的需求,具有重要的現(xiàn)實意義。

在電能管理方面,傳統(tǒng)的插座無法提供詳細(xì)的用電信息,用戶難以了解電器的實際能耗情況。而智能插座通過集成電壓、電流、功率等參數(shù)的采集功能,能夠?qū)崟r監(jiān)測電器的用電狀態(tài),幫助用戶優(yōu)化用電行為,降低能源消耗。此外,電能計量功能的加入,使得用戶可以精確掌握每個電器的用電量,為節(jié)能環(huán)保提供數(shù)據(jù)支持。

在環(huán)境監(jiān)測方面,智能插座集成了溫濕度傳感器,能夠?qū)崟r采集周圍環(huán)境的溫度和濕度信息。這些數(shù)據(jù)不僅可以幫助用戶了解室內(nèi)環(huán)境的變化,還可以與其他智能家居設(shè)備聯(lián)動,實現(xiàn)自動調(diào)節(jié)空調(diào)、加濕器等設(shè)備,提升居住舒適度。

為了實現(xiàn)遠(yuǎn)程控制和數(shù)據(jù)展示,智能插座通過ESP8266-WIFI模塊與OneNet物聯(lián)網(wǎng)服務(wù)器通信,利用MQTT協(xié)議傳輸數(shù)據(jù)。用戶可以通過微信小程序?qū)崟r查看插座的運行狀態(tài)、電能數(shù)據(jù)和環(huán)境信息,并能夠通過小程序遠(yuǎn)程控制插座的開關(guān)。同時,微信小程序還支持歷史數(shù)據(jù)的存儲和展示,用戶可以通過折線圖查看每個參數(shù)的歷史變化趨勢,便于分析和決策。

基于STM32設(shè)計的智能插座不僅具備傳統(tǒng)插座的基本功能,還通過集成多種傳感器和通信模塊,實現(xiàn)了電能管理、環(huán)境監(jiān)測和遠(yuǎn)程控制等智能化功能。該項目的開發(fā)為用戶提供更加便捷、智能的用電體驗,同時為節(jié)能環(huán)保和智能家居的發(fā)展提供技術(shù)支持。

當(dāng)前項目使用的相關(guān)軟件工具、模塊源碼已經(jīng)上傳到網(wǎng)盤:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink

【2】設(shè)計實現(xiàn)的功能

當(dāng)前項目使用的相關(guān)軟件工具、模塊源碼已經(jīng)上傳到網(wǎng)盤:
https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink當(dāng)前項目使用的相關(guān)軟件工具、模塊源碼已經(jīng)上傳到網(wǎng)盤:
https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink

(1)支持電壓采集:實時監(jiān)測插座輸入電壓,電壓量程為0~264V,能夠準(zhǔn)確反映電路中的電壓變化。

(2)支持電流采集:實時監(jiān)測插座輸入電流,電流量程為10mA~20A,能夠精確測量電器的工作電流。

(3)支持有功功率、無功功率采集:通過電壓和電流的實時數(shù)據(jù),計算有功功率和無功功率,幫助用戶了解電器的實際能耗情況。

(4)支持電能信息采集:實時采集電能數(shù)據(jù),包括累計用電量,為用戶提供精確的電能計量功能。

(5)支持單向交流電、直流電采集:能夠兼容單向交流電和直流電的采集,適用于不同類型的電器設(shè)備。

(6)支持環(huán)境溫、濕度信息采集:通過SHT30傳感器實時監(jiān)測插座周圍環(huán)境的溫度和濕度,為用戶提供環(huán)境數(shù)據(jù)。

(7)支持功率因數(shù)采集(僅對交流電):實時計算交流電的功率因數(shù),幫助用戶了解電路的效率。

(8)支持電壓頻率采集(僅對交流電):實時監(jiān)測交流電的頻率,確保電器設(shè)備在穩(wěn)定的頻率下工作。

(9)支持微信小程序顯示:通過WIFI與OneNet物聯(lián)網(wǎng)服務(wù)器通信,利用HTTP協(xié)議傳輸數(shù)據(jù),用戶可以通過微信小程序?qū)崟r查看插座的運行狀態(tài)、電能數(shù)據(jù)和環(huán)境信息。

(10)支持歷史數(shù)據(jù)存儲與展示:微信小程序利用MySQL數(shù)據(jù)庫保存歷史數(shù)據(jù),用戶可以通過折線圖查看每個參數(shù)的歷史變化趨勢,并支持按日期查詢歷史數(shù)據(jù)。

(11)支持智能插座運行狀態(tài)檢測:實時監(jiān)測插座的開關(guān)狀態(tài)和運行情況,確保設(shè)備正常工作。

(12)支持電能計量:精確記錄電器的用電量,為用戶提供詳細(xì)的用電報告,幫助優(yōu)化用電行為。

(13)支持遠(yuǎn)程控制:通過微信小程序遠(yuǎn)程控制插座的開關(guān),實現(xiàn)對電器設(shè)備的智能化管理。

(14)支持OLED本地顯示:通過0.96寸OLED顯示屏實時顯示本地采集的全部信息,包括電壓、電流、功率、電能、溫濕度等數(shù)據(jù),方便用戶隨時查看。

(15)支持WIFI通信:通過ESP8266-WIFI模塊與OneNet物聯(lián)網(wǎng)服務(wù)器通信,利用MQTT協(xié)議傳輸數(shù)據(jù),實現(xiàn)數(shù)據(jù)的遠(yuǎn)程傳輸和控制。

【3】項目硬件模塊組成

(1)主控芯片模塊:采用STM32F103RCT6作為核心控制器,負(fù)責(zé)數(shù)據(jù)處理、邏輯控制以及與各模塊的通信。

(2)電壓電流采集模塊:采用JSY-MK-1031單向交直流采集模塊,通過串口與主控芯片通信,實時采集電壓、電流、功率、電能等參數(shù)。

(3)溫濕度傳感器模塊:采用SHT30傳感器,實時采集環(huán)境溫度和濕度數(shù)據(jù),并通過I2C接口與主控芯片通信。

(4)OLED顯示模塊:采用0.96寸OLED顯示屏,用于本地顯示采集的電壓、電流、功率、電能、溫濕度等信息,方便用戶實時查看。

(5)WIFI通信模塊:采用ESP8266-WIFI模塊,通過串口與主控芯片通信,實現(xiàn)與OneNet物聯(lián)網(wǎng)服務(wù)器的數(shù)據(jù)交互,支持MQTT協(xié)議傳輸數(shù)據(jù)。

(6)電源模塊:采用5V 2A的穩(wěn)壓電源,為整個系統(tǒng)提供穩(wěn)定可靠的電源供應(yīng)。

(7)繼電器控制模塊:用于控制插座的開關(guān)狀態(tài),支持遠(yuǎn)程控制電器的通斷電。

(8)按鍵模塊:提供本地操作接口,用戶可以通過按鍵手動控制插座的開關(guān)狀態(tài)或切換顯示內(nèi)容。

(9)指示燈模塊:用于指示插座的運行狀態(tài)(如開關(guān)狀態(tài)、WIFI連接狀態(tài)等),方便用戶快速了解設(shè)備的工作情況。

(10)PCB主板模塊:集成所有硬件模塊,提供電路連接和信號傳輸的支持,確保各模塊之間的穩(wěn)定通信。

(11)外殼模塊:用于保護(hù)內(nèi)部電路和模塊,同時提供插座的物理接口,方便用戶插入電器設(shè)備。

1.2 設(shè)計思路

本項目的設(shè)計思路圍繞實現(xiàn)智能插座的多功能集成和智能化管理展開,通過硬件和軟件的協(xié)同設(shè)計,滿足用戶對電能管理、環(huán)境監(jiān)測和遠(yuǎn)程控制的需求。

硬件設(shè)計方面,以STM32F103RCT6作為核心控制器,負(fù)責(zé)協(xié)調(diào)各模塊的工作。電壓、電流、功率等電能參數(shù)的采集通過JSY-MK-1031模塊實現(xiàn),該模塊能夠兼容單向交流電和直流電的采集,并通過串口與主控芯片通信。環(huán)境溫濕度數(shù)據(jù)通過SHT30傳感器采集,利用I2C接口與主控芯片交互。為了提供本地顯示功能,采用0.96寸OLED顯示屏,實時顯示電壓、電流、功率、電能、溫濕度等信息,方便用戶隨時查看。WIFI通信模塊采用ESP8266,通過串口與主控芯片通信,實現(xiàn)與OneNet物聯(lián)網(wǎng)服務(wù)器的數(shù)據(jù)交互,支持MQTT協(xié)議傳輸數(shù)據(jù)。此外,電源模塊為系統(tǒng)提供穩(wěn)定的5V供電,繼電器模塊用于控制插座的開關(guān)狀態(tài),按鍵和指示燈模塊則提供本地操作和狀態(tài)指示功能。

在軟件設(shè)計方面,STM32端的代碼采用C語言開發(fā),通過寄存器編程方式實現(xiàn)對各硬件模塊的控制和數(shù)據(jù)采集。軟件設(shè)計主要包括數(shù)據(jù)采集、數(shù)據(jù)處理、通信協(xié)議實現(xiàn)和本地顯示等功能。數(shù)據(jù)采集模塊負(fù)責(zé)定時讀取電壓、電流、功率、電能、溫濕度等數(shù)據(jù),并進(jìn)行初步處理。數(shù)據(jù)處理模塊對采集的數(shù)據(jù)進(jìn)行計算和校準(zhǔn),確保數(shù)據(jù)的準(zhǔn)確性和可靠性。通信協(xié)議模塊實現(xiàn)與ESP8266的串口通信,并通過MQTT協(xié)議將數(shù)據(jù)上傳至OneNet物聯(lián)網(wǎng)服務(wù)器。本地顯示模塊則通過OLED顯示屏實時展示采集的數(shù)據(jù)。

在物聯(lián)網(wǎng)平臺和微信小程序的設(shè)計中,OneNet物聯(lián)網(wǎng)服務(wù)器作為數(shù)據(jù)中轉(zhuǎn)站,接收來自智能插座的數(shù)據(jù)并存儲。微信小程序通過HTTP協(xié)議與OneNet服務(wù)器通信,獲取實時數(shù)據(jù)和歷史數(shù)據(jù),并通過圖表形式展示。小程序還支持遠(yuǎn)程控制功能,用戶可以通過小程序發(fā)送指令,控制插座的開關(guān)狀態(tài)。歷史數(shù)據(jù)存儲采用MySQL數(shù)據(jù)庫,支持按日期查詢和折線圖展示,方便用戶分析用電行為和環(huán)境變化趨勢。

在系統(tǒng)集成和測試階段,通過硬件和軟件的聯(lián)調(diào),確保各模塊之間的協(xié)同工作。測試內(nèi)容包括數(shù)據(jù)采集的準(zhǔn)確性、通信的穩(wěn)定性、遠(yuǎn)程控制的功能性以及歷史數(shù)據(jù)的存儲和展示效果。通過不斷優(yōu)化和調(diào)試,確保智能插座的穩(wěn)定運行和用戶體驗。

本項目的設(shè)計思路以硬件為基礎(chǔ),軟件為核心,物聯(lián)網(wǎng)平臺為橋梁,微信小程序為交互界面,通過模塊化的設(shè)計和系統(tǒng)化的集成,實現(xiàn)了智能插座的多功能集成和智能化管理,為用戶提供便捷、智能的用電體驗。

1.3 系統(tǒng)功能總結(jié)

功能分類 功能描述
電能管理
1. 電壓采集 實時監(jiān)測插座輸入電壓,量程為0~264V,準(zhǔn)確反映電路中的電壓變化。
2. 電流采集 實時監(jiān)測插座輸入電流,量程為10mA~20A,精確測量電器的工作電流。
3. 有功功率采集 通過電壓和電流數(shù)據(jù),實時計算有功功率,幫助用戶了解電器的實際能耗。
4. 無功功率采集 實時計算無功功率,反映電路中的能量損耗情況。
5. 電能信息采集 實時采集電能數(shù)據(jù),包括累計用電量,為用戶提供精確的電能計量功能。
6. 功率因數(shù)采集 實時計算交流電的功率因數(shù)(僅對交流電),幫助用戶了解電路的效率。
7. 電壓頻率采集 實時監(jiān)測交流電的頻率(僅對交流電),確保電器設(shè)備在穩(wěn)定的頻率下工作。
環(huán)境監(jiān)測
8. 溫度采集 通過SHT30傳感器實時監(jiān)測插座周圍環(huán)境的溫度。
9. 濕度采集 通過SHT30傳感器實時監(jiān)測插座周圍環(huán)境的濕度。
遠(yuǎn)程控制與顯示
10. 微信小程序顯示 通過WIFI與OneNet物聯(lián)網(wǎng)服務(wù)器通信,利用HTTP協(xié)議傳輸數(shù)據(jù),用戶可實時查看插座狀態(tài)、電能數(shù)據(jù)和環(huán)境信息。
11. 歷史數(shù)據(jù)存儲 微信小程序利用MySQL數(shù)據(jù)庫保存歷史數(shù)據(jù),支持按日期查詢和折線圖展示。
12. 遠(yuǎn)程控制 通過微信小程序遠(yuǎn)程控制插座的開關(guān)狀態(tài),實現(xiàn)對電器設(shè)備的智能化管理。
本地顯示與操作
13. OLED本地顯示 通過0.96寸OLED顯示屏實時顯示本地采集的全部信息,包括電壓、電流、功率、電能、溫濕度等數(shù)據(jù)。
14. 按鍵操作 提供本地按鍵接口,用戶可通過按鍵手動控制插座的開關(guān)狀態(tài)或切換顯示內(nèi)容。
15. 指示燈顯示 通過指示燈顯示插座的運行狀態(tài)(如開關(guān)狀態(tài)、WIFI連接狀態(tài)等)。
通信與數(shù)據(jù)傳輸
16. WIFI通信 通過ESP8266-WIFI模塊與OneNet物聯(lián)網(wǎng)服務(wù)器通信,支持MQTT協(xié)議傳輸數(shù)據(jù)。
系統(tǒng)狀態(tài)監(jiān)測
17. 運行狀態(tài)檢測 實時監(jiān)測插座的開關(guān)狀態(tài)和運行情況,確保設(shè)備正常工作。
其他功能
18. 電能計量 精確記錄電器的用電量,為用戶提供詳細(xì)的用電報告,幫助優(yōu)化用電行為。

1.4 模塊的技術(shù)詳情介紹

【1】ESP8266-WIFI模塊

ESP8266-WIFI模塊是一款功能強(qiáng)大的WiFi通信模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)(IoT)設(shè)備中。它由Espressif Systems公司設(shè)計,并且由于其低功耗、較小的體積和較低的成本,成為了許多智能硬件項目的首選通信模塊。ESP8266不僅具備WiFi無線連接功能,還具有較高的處理能力和豐富的接口資源,使其成為實現(xiàn)無線通信的理想選擇。

ESP8266模塊內(nèi)置了一個完整的WiFi棧,可以直接作為WiFi客戶端或AP(Access Point)工作,支持無線網(wǎng)絡(luò)的連接、數(shù)據(jù)傳輸?shù)榷喾N功能。在設(shè)計中,ESP8266支持多種網(wǎng)絡(luò)協(xié)議,最常見的是TCP/IP協(xié)議,允許設(shè)備與外部服務(wù)器或移動應(yīng)用進(jìn)行數(shù)據(jù)交換。其強(qiáng)大的功能使得它不僅可以連接到傳統(tǒng)的路由器,還可以直接創(chuàng)建一個WiFi熱點,支持設(shè)備與手機(jī)或其他WiFi設(shè)備的通信。

在硬件設(shè)計中,ESP8266模塊的另一大優(yōu)勢是其與微控制器的高兼容性。模塊通常通過串口(UART)與主控芯片進(jìn)行通信,因此可以方便地與各種微控制器(如STM32、Arduino等)連接,進(jìn)行數(shù)據(jù)傳輸。在本項目中,ESP8266模塊通過串口與STM32單片機(jī)相連接,負(fù)責(zé)將本地采集的健康數(shù)據(jù)上傳到Android手機(jī)APP中。數(shù)據(jù)傳輸采用的是TCP/IP協(xié)議,保證了通信的穩(wěn)定性和可靠性。

ESP8266模塊的低功耗特性也使其適用于嵌入式系統(tǒng)和移動設(shè)備中,尤其是在電池供電的項目中,能夠有效延長設(shè)備的使用時間。通過合理的睡眠模式和待機(jī)模式,ESP8266能夠在無需頻繁通信時降低功耗,從而優(yōu)化系統(tǒng)的能源使用。

ESP8266-WIFI模塊因其高集成度、低成本、強(qiáng)大的WiFi功能及廣泛的兼容性,成為了物聯(lián)網(wǎng)領(lǐng)域中一個不可或缺的通信模塊。它不僅為各種嵌入式系統(tǒng)提供了便捷的無線網(wǎng)絡(luò)連接方案,還極大簡化了開發(fā)過程,使得開發(fā)者能夠?qū)W⒂诤诵墓δ艿膶崿F(xiàn)。本項目采用ESP8266模塊,便捷地實現(xiàn)了STM32與Android手機(jī)APP之間的實時數(shù)據(jù)傳輸,為健康檢測儀提供了可靠的無線通信能力。

【2】SHT30溫濕度檢測模塊

SHT30溫濕度檢測模塊是一款高精度、低功耗的數(shù)字溫濕度傳感器,廣泛應(yīng)用于環(huán)境監(jiān)測、智能家居、工業(yè)控制等領(lǐng)域。該模塊由瑞士Sensirion公司生產(chǎn),采用先進(jìn)的CMOSens?技術(shù),能夠提供可靠的溫度和濕度測量數(shù)據(jù)。

SHT30模塊基于I2C通信接口,與主控芯片(如STM32)的連接簡單方便。其工作電壓范圍為2.4V至5.5V,適合多種嵌入式系統(tǒng)的供電需求。模塊的濕度測量范圍為0%至100%RH,溫度測量范圍為-40°C至125°C,能夠滿足大多數(shù)環(huán)境監(jiān)測場景的需求。SHT30的濕度測量精度為±2%RH,溫度測量精度為±0.2°C,具有較高的測量準(zhǔn)確性和穩(wěn)定性。

在功耗方面,SHT30模塊表現(xiàn)出色,平均電流消耗僅為0.6mA,適合低功耗應(yīng)用場景。此外,模塊支持多種測量模式和采樣頻率,用戶可以根據(jù)實際需求選擇不同的配置,以平衡測量精度和功耗。例如,在高精度模式下,模塊可以提供更精確的測量數(shù)據(jù),但功耗相對較高;而在低功耗模式下,模塊可以顯著降低能耗,適合電池供電的應(yīng)用。

SHT30模塊還具有出色的長期穩(wěn)定性,其內(nèi)部集成了校準(zhǔn)存儲器,能夠自動補(bǔ)償溫度和濕度的漂移,確保長時間使用的測量準(zhǔn)確性。此外,模塊還具備CRC校驗功能,能夠檢測數(shù)據(jù)傳輸過程中的錯誤,提高通信的可靠性。

在實際應(yīng)用中,SHT30模塊通常與主控芯片通過I2C接口連接,主控芯片發(fā)送指令啟動測量,模塊完成測量后返回溫度和濕度數(shù)據(jù)。主控芯片可以對這些數(shù)據(jù)進(jìn)行進(jìn)一步處理或上傳至物聯(lián)網(wǎng)平臺。例如,在智能插座項目中,SHT30模塊用于實時監(jiān)測插座周圍環(huán)境的溫度和濕度,幫助用戶了解室內(nèi)環(huán)境的變化,并與其他智能家居設(shè)備聯(lián)動,實現(xiàn)自動調(diào)節(jié)空調(diào)、加濕器等設(shè)備的功能。

SHT30溫濕度檢測模塊以其高精度、低功耗、易集成的特點,成為環(huán)境監(jiān)測領(lǐng)域的理想選擇。其可靠性和穩(wěn)定性使其在智能家居、工業(yè)控制、氣象監(jiān)測等應(yīng)用中表現(xiàn)出色,為用戶提供了準(zhǔn)確的環(huán)境數(shù)據(jù)支持。

【3】0.96寸OLED顯示屏

0.96寸OLED顯示屏是一種小型化、高分辨率的顯示模塊,廣泛應(yīng)用于嵌入式系統(tǒng)、智能設(shè)備、便攜式儀器等領(lǐng)域。該顯示屏采用有機(jī)發(fā)光二極管(OLED)技術(shù),具有自發(fā)光、高對比度、低功耗等特點,適合在低光照環(huán)境下使用。

0.96寸OLED顯示屏的分辨率通常為128x64像素,能夠顯示清晰的文字、圖形和圖標(biāo)。由于其像素點自發(fā)光,無需背光模塊,因此在顯示黑色時完全不發(fā)光,能夠?qū)崿F(xiàn)極高的對比度。這使得OLED顯示屏在顯示效果上優(yōu)于傳統(tǒng)的LCD顯示屏,尤其是在暗環(huán)境下,顯示內(nèi)容更加鮮明和清晰。

在接口方面,0.96寸OLED顯示屏通常支持I2C和SPI兩種通信協(xié)議,用戶可以根據(jù)實際需求選擇合適的接口方式。I2C接口占用引腳少,適合資源有限的主控芯片;而SPI接口傳輸速度快,適合需要頻繁刷新顯示內(nèi)容的場景。無論是哪種接口,OLED顯示屏的驅(qū)動都相對簡單,主控芯片只需發(fā)送指令和數(shù)據(jù)即可控制顯示內(nèi)容。

0.96寸OLED顯示屏的工作電壓一般為3.3V至5V,與大多數(shù)嵌入式系統(tǒng)的供電電壓兼容。其功耗較低,尤其是在顯示靜態(tài)內(nèi)容時,能夠顯著降低能耗,適合電池供電的應(yīng)用場景。此外,OLED顯示屏的響應(yīng)速度極快,能夠?qū)崿F(xiàn)流暢的動態(tài)顯示效果,適合需要快速刷新顯示內(nèi)容的應(yīng)用。

在實際應(yīng)用中,0.96寸OLED顯示屏通常用于顯示實時數(shù)據(jù)、狀態(tài)信息、菜單界面等。例如,在智能插座項目中,OLED顯示屏用于實時顯示電壓、電流、功率、電能、溫濕度等采集數(shù)據(jù),方便用戶隨時查看設(shè)備的工作狀態(tài)和環(huán)境信息。由于其體積小、顯示效果好,OLED顯示屏還可以集成到各種便攜式設(shè)備中,如智能手表、健康監(jiān)測設(shè)備等。

0.96寸OLED顯示屏以其高分辨率、高對比度、低功耗和靈活的接口方式,成為嵌入式系統(tǒng)中理想的顯示解決方案。其優(yōu)異的顯示效果和易用性使其在智能家居、工業(yè)控制、消費電子等領(lǐng)域得到廣泛應(yīng)用,為用戶提供了直觀、清晰的信息展示方式。

二、搭建開發(fā)環(huán)境

2.1 接入OneNet

幫助文檔地址:https://open.iot.10086.cn/doc/v5/fuse/detail/1418

【1】查詢設(shè)備數(shù)據(jù)點

使用這個接口的時候,要注意。你的設(shè)備是不是創(chuàng)建的數(shù)據(jù)流類型。 創(chuàng)建產(chǎn)品的時候會讓你選擇的。 是數(shù)據(jù)流還是OneJSON

接口功能

根據(jù)產(chǎn)品id和設(shè)備名稱查詢,時間范圍參數(shù),查詢設(shè)備歷史數(shù)據(jù)點信息

備注

僅支持?jǐn)?shù)據(jù)流、IPSO數(shù)據(jù)協(xié)議,設(shè)備能正常下發(fā)上報

接口地址

http(s)://iot-api.heclouds.com/datapoint/history-datapoints

API說明

請求方式:GET

http query 請求參數(shù):

參數(shù) 類型 是否必選 描述
datastream_id string 數(shù)據(jù)流ID,多個id之間用逗號分開,缺省時取數(shù)據(jù)流或數(shù)據(jù)流模板100條為缺省數(shù)據(jù)流id條件
product_id string 產(chǎn)品ID,平臺生成唯一ID
device_name string 設(shè)備名稱
imei string lwm2m協(xié)議時傳,設(shè)備imei
start string 提取數(shù)據(jù)點的開始時間,精確到秒,示例:2015-01-10T08:00:35
end string 提取數(shù)據(jù)點的結(jié)束時間,精確到秒,示例:2015-01-10T08:00:35
duration int 查詢時間區(qū)間,單位為秒
limit int 限定本次請求最多返回的數(shù)據(jù)點數(shù),默認(rèn)100,范圍為(0,6000]
cursor string 指定本次請求繼續(xù)從cursor位置開始提取數(shù)據(jù)
sort enum 時間排序方式,DESC:倒序,ASC:升序,默認(rèn)為DESC

返回數(shù)據(jù)

參數(shù)名稱 類型 描述
code int 調(diào)用成功或失敗時,返回的code碼
msg string 調(diào)用成功或失敗時,返回的msg信息
request_id string 調(diào)用API生成的請求標(biāo)識
data - 調(diào)用成功時,返回的業(yè)務(wù)數(shù)據(jù)
data.count int 本次返回的數(shù)據(jù)點數(shù)量
data.cursor string 本次請求若未能返回所有數(shù)據(jù),則會返回cursor參數(shù),用戶可以攜帶cursor參數(shù)進(jìn)行再次請求,獲取剩下的數(shù)據(jù)
data.datastreams array-json 設(shè)備數(shù)據(jù)流信息的json數(shù)組,見datastreams描述

datastreams描述表


參數(shù)名稱 格式 說明
id string 數(shù)據(jù)流名稱
datapoints array-json 數(shù)據(jù)點信息的json數(shù)組,見datapoints描述表

datapoints描述表


參數(shù)名稱 格式 說明
at string 數(shù)據(jù)記錄時間
value string/int/json... 數(shù)據(jù)點的值

特別說明

    1. 當(dāng)start,end時間均為空

i) limit
不傳值或傳值等于1時:排序為升序則查詢最早一個數(shù)據(jù)點(30天內(nèi)),否則查詢最新數(shù)據(jù)點(最新緩存數(shù)據(jù))

ii) limit
傳值大于1時:排序為升序則查詢最早x條數(shù)據(jù)點,否則查詢最新x條數(shù)據(jù)點(30天內(nèi),x=limit)

示例

請求示例

GET http(s)://iot-api.heclouds.com/datapoint/history-datapoints
?product_id=XhONWQ5zV5&device_name=mqtts-dev&datastream_id=ds&start=2017-01-01T00:00:00&limit=100

響應(yīng)示例

{
? ? "data":{
? ? ? ? "cursor":"25971_564280_1448961152173",
? ? ? ? "count":5,
? ? ? ? "datastreams":[
? ? ? ? ? ? {
? ? ? ? ? ? ? ? "datapoints":[
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? "at":"2015-12-01 17:10:24.981",
? ? ? ? ? ? ? ? ? ? ? ? "value":"35"
? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? "at":"2015-12-01 17:10:53.406",
? ? ? ? ? ? ? ? ? ? ? ? "value":"38"
? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ? ...
? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? "id":"3200_0_5501"
? ? ? ? ? ? },
? ? ? ? ? ? ...
? ? ? ? ]
? ? },
? ? "request_id": "a25087f46df04b69b29e90ef0acfd115",?
? ? "msg": "succ",
? ? "code": ?0
}

在Qt項目包含網(wǎng)絡(luò)模塊,在.pro文件中添加:

QT += network

演示了如何使用Qt發(fā)出HTTP GET請求:

#include?<QCoreApplication>
#include?<QNetworkAccessManager>
#include?<QNetworkRequest>
#include?<QNetworkReply>
#include?<QUrl>
#include?<QDebug>

int?main(int?argc,?char?*argv[])
{
? ??QCoreApplication?a(argc, argv);

? ? QNetworkAccessManager manager;
? ??QUrl?url("https://open.iot.10086.cn/api/your-endpoint");?// 替換為實際URL
? ??QNetworkRequest?request(url);

? ??// 設(shè)置請求頭
? ? request.setRawHeader("Authorization",?"Bearer YOUR_ACCESS_TOKEN");?// 示例: 使用Bearer Token

? ? QNetworkReply *reply = manager.get(request);

? ? QObject::connect(reply, &QNetworkReply::finished, [&]() {
? ? ? ??if?(reply->error() == QNetworkReply::NoError) {
? ? ? ? ? ? QString response_data = reply->readAll();
? ? ? ? ? ??qDebug() <<?"Response data:"?<< response_data;
? ? ? ? }?else?{
? ? ? ? ? ??qDebug() <<?"Error:"?<< reply->errorString();
? ? ? ? }

? ? ? ? reply->deleteLater();
? ? ? ? a.quit();?// 結(jié)束應(yīng)用程序
? ? });

? ??return?a.exec();
}

【2】MQTT命令下發(fā)

使用這個接口的時候,要注意。你的設(shè)備是不是創(chuàng)建的數(shù)據(jù)流類型。 創(chuàng)建產(chǎn)品的時候會讓你選擇的。 是數(shù)據(jù)流還是OneJSON

接口功能

根據(jù)產(chǎn)品ID和設(shè)備名,向Mqtt設(shè)備下發(fā)字符串命令,設(shè)備響應(yīng)后返回設(shè)備命令執(zhí)行狀態(tài)??稍O(shè)置5-30秒的超時時間。

備注

僅支持Mqtt數(shù)據(jù)流協(xié)議設(shè)備,需要設(shè)備在線。

接口地址

https://iot-api.heclouds.com/datapoint/synccmds

API說明

請求方式:POST

http query 請求參數(shù):


參數(shù) 類型 是否必選 描述
product_id string 產(chǎn)品ID,平臺生成唯一ID
device_name string 設(shè)備名稱
timeout string 同步API最長等待時間,取值范圍 5-30, 單位秒

http body 請求參數(shù)


參數(shù) 類型 是否必須 描述
自定義 string 命令字符串,大小限制20KB

返回數(shù)據(jù)

參數(shù)名稱 類型 描述
code int 調(diào)用成功或失敗時,返回的code碼
msg string 調(diào)用成功或失敗時,返回的msg信息
request_id string 調(diào)用API生成的請求標(biāo)識
data - 調(diào)用成功時,返回的業(yè)務(wù)數(shù)據(jù)
cmd_uuid string 命令I(lǐng)D
cmd_resp string 設(shè)備應(yīng)答內(nèi)容,base64編碼格式

示例

請求示例

POST http(s)://iot-api.heclouds.com/datapoint/synccmds?product_id=B7EEW578EbRg5Y4K&device_name=device3&timeout=30
Content-type: application/json
{
? ? "id":"45461" //自定義參數(shù)
}

響應(yīng)示例

{
? ? "data": {
? ? ? ? "cmd_uuid": "f9115090-8ef1-4b0c-aaf4-0678754f575a",
? ? ? ? "cmd_resp": "dGhpcyUyMGlzJTIwY29tbWFuZC1yZXNwb25zZSUyMGNvbnRlbnQ="
? ? },
? ? "request_id": "a25087f46df04b69b29e90ef0acfd115",?
? ? "msg": "succ",
? ? "code": ?0
}

【3】API鑒權(quán)

平臺需要對API調(diào)用方進(jìn)行資源權(quán)限校驗,使用API時,需要在請求Header中攜帶統(tǒng)一的安全鑒權(quán)信息。

不同情形下的鑒權(quán)方式

平臺支持三種鑒權(quán)方式:用戶鑒權(quán)、產(chǎn)品鑒權(quán)、項目鑒權(quán)

添加設(shè)備后未轉(zhuǎn)移

1、設(shè)備未轉(zhuǎn)移,但綁定了項目時,鑒權(quán)支持【用戶鑒權(quán)】、【項目鑒權(quán)】。

2、設(shè)備未轉(zhuǎn)移,且沒有綁定任何項目時,鑒權(quán)支持【用戶鑒權(quán)】、【產(chǎn)品鑒權(quán)】。

添加設(shè)備后進(jìn)行設(shè)備轉(zhuǎn)移

1、用戶在平臺嘗試“設(shè)備轉(zhuǎn)移”時,需要先解除項目綁定,才能進(jìn)行轉(zhuǎn)移操作。

2、轉(zhuǎn)移后,再次綁定項目時,支持【用戶鑒權(quán)】、【項目鑒權(quán)】。

3、轉(zhuǎn)移后,沒有綁定項目時,僅支持【用戶鑒權(quán)】。

安全鑒權(quán)機(jī)制

安全鑒權(quán)authorization由多個參數(shù)構(gòu)成,每個參數(shù)均采用key = value的形式表示,并用&作為分隔符:

authorization: version=2022-05-01&res=userid%2F{userId}&et={expireTime}&method=sha1&sign={sign}
Token生成工具
    • ? 為便于開發(fā)者開發(fā),OneNET提供了Token生成工具,填寫字段后可以快速生成安全鑒權(quán)信息。前往下載

https://open.iot.10086.cn/doc/v5/fuse/detail/1487

參數(shù)說明

序 號 參數(shù) 類型 說明 示例
1 version string 簽名算法版本 目前僅支持 2022-05-01
2 res string 訪問資源信息 支持主用戶、產(chǎn)品、項目三種方式: 1)主用戶訪問res為:userid/{userid}, userid為平臺用戶id,access_key為主用戶access_key,參數(shù)在個人「賬號信息」、「訪問權(quán)限」中查看。 2)產(chǎn)品訪問res為:products/{productid},access_key為產(chǎn)品access_key,進(jìn)入「產(chǎn)品開發(fā)」菜單的「產(chǎn)品列表」中,點擊「操作」列下的「產(chǎn)品開發(fā)」鏈接,進(jìn)入「產(chǎn)品信息頁面」查看。 3)項目訪問res為:projects/{projectid},access_key為項目key,進(jìn)入「應(yīng)用開發(fā)」-「項目管理」菜單的「我的項目」列表中,點擊「操作」列下的「進(jìn)入項目管理」鏈接,進(jìn)入「項目信息頁面」,在「項目概況」的「項目信息」中查看。 注* 以上提到的不同access_key獲取方式在下文中會有詳細(xì)描述
3 et string 訪問過期時間 10位秒級時間戳,1537255523 表示:北京時間 2018-09-18 15:25:23
4 method string 簽名方法 目前支持md5、sha1、sha256
5 sign string 簽名結(jié)果字符串 version、res、et、method參數(shù)計算生成
accessKey參數(shù)獲取

主用戶accessKey

產(chǎn)品accessKey


項目accessKey


sign的生成算法為:

sign = base64(hmac_<method>(base64decode(accessKey), utf-8(StringForSignature)))?
    ? accessKey為平臺分配的訪問密鑰(用戶訪問權(quán)限頁面查看),如果訪問資源以主用戶形式訪問, 使用主用戶的accessKey;如果訪問資源以產(chǎn)品方式訪問,使用產(chǎn)品的accessKey,且只能對產(chǎn)品下的設(shè)備進(jìn)行操作;如果訪問資源以項目方式訪問,使用項目的accessKey,且只能對項目下的設(shè)備進(jìn)行操作。? accessKey參與計算前應(yīng)先進(jìn)行base64decode操作。? 用于計算簽名的字符串 StringForSignature按照et、method、res、version的順序,以"n"作為分隔符進(jìn)行排列,如下所示:
StringForSignature = et + "n" + method + "n" + res + "n" + version

參數(shù)編碼

authorization中key=value的形式的value部分需要經(jīng)過URL編碼,需要進(jìn)行編碼的特殊符號如下:

序號 符號 編碼
1 + %2B
2 空格 %20
3 / %2F
4 ? %3F
5 % %25
6 # %23
7 & %26
8 = %3D

authorization生成示例

nodejs代碼示例

'use strict';

const crypto = require('crypto');

/**
?* authorization生成函數(shù)
?*
?* @param {String} method ? ? ? ?- hash method
?* @param {String} res ? ? ? ? ? - resource
?* @param {String} accessKey ? ? - access key
?* @param {Number} et ? ? ? ? ? ?- effective time
?* @return {String} - authorization
?*/
function generateAuthorization(method, res, accessKey, et) {
? const version = '2022-05-01';
? const et = Math.ceil((Date.now() + et) / 1000); // token有效時間
? const base64Key = Buffer.from(accessKey, 'base64'); // accessKey base64編碼
? const StringForSignature = et + 'n' + method + 'n' + res + 'n' + version;
? const sign = encodeURIComponent(crypto.createHmac(method, base64Key).update(StringForSignature).digest('base64'));
? const encodeRes = encodeURIComponent(res);

? return `version=${version}&res=${encodeRes}&et=${et}&method=${method}&sign=${sign}`;
}

const method = 'sha1';
const accessKey = 'mjgvkTCYTBF6DguxMmm+aV9EkDp2CYfL5jzRTph5Th6KhU8gqZz/cBivPTA7tfY5';
const res = 'userid/130037';
const et = 3600 * 1000; // 有效時間:1小時
const authorization = generateAuthorization(method, res, accessKey, et);

python代碼示例

? ??import?base64
? ??import?hmac
? ??import?time
? ??from?urllib.parse?import?quote
? ??
? ??def?token(user_id,access_key):
? ? ? ? version =?'2022-05-01'
? ? ? ? res =?'userid/%s'?% user_id
? ? ? ??# 用戶自定義token過期時間
? ? ? ? et =?str(int(time.time()) +?3600)
? ? ? ??# 簽名方法,支持md5、sha1、sha256
? ? ? ? method =?'sha1'
? ? ? ??# 對access_key進(jìn)行decode
? ? ? ? key = base64.b64decode(access_key)
? ? ? ??# 計算sign
? ? ? ? org = et +?'n'?+ method +?'n'?+ res +?'n'?+ version
? ? ? ? sign_b = hmac.new(key=key, msg=org.encode(), digestmod=method)
? ? ? ? sign = base64.b64encode(sign_b.digest()).decode()
? ? ? ??# value 部分進(jìn)行url編碼,method/res/version值較為簡單無需編碼
? ? ? ? sign = quote(sign, safe='')
? ? ? ? res = quote(res, safe='')
? ? ? ??# token參數(shù)拼接
? ? ? ? token =?'version=%s&res=%s&et=%s&method=%s&sign=%s'?% (version, res, et, method, sign)
? ??
? ? ? ??return?token
? ??
? ??if?__name__ ==?'__main__':
? ? ? ? user_id =?'37715'
? ? ? ? access_key =?'mjgvkTCYTBF6DguxMmm+aV9EkDp2CYfL5jzRTph5Th6KhU8gqZz/cBivPTA7tfY5'
? ??
? ? ? ??print(token(user_id,access_key))

Java代碼示例

? ??import?javax.crypto.Mac;
? ??import?javax.crypto.spec.SecretKeySpec;
? ??import?java.io.UnsupportedEncodingException;
? ??import?java.net.URLEncoder;
? ??import?java.security.InvalidKeyException;
? ??import?java.security.NoSuchAlgorithmException;
? ??import?java.util.Base64;
? ??
? ??
? ??public?class?Token?{
? ??
? ? ? ??public?static?String?assembleToken(String version, String resourceName, String expirationTime, String signatureMethod, String accessKey)
? ? ? ? ? ? ? ??throws?UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
? ? ? ? ? ??StringBuilder?sb?=?new?StringBuilder();
? ? ? ? ? ??String?res?=?URLEncoder.encode(resourceName,?"UTF-8");
? ? ? ? ? ??String?sig?=?URLEncoder.encode(generatorSignature(version, resourceName, expirationTime, accessKey, signatureMethod),?"UTF-8");
? ? ? ? ? ? sb.append("version=")
? ? ? ? ? ? ? ? ? ? .append(version)
? ? ? ? ? ? ? ? ? ? .append("&res=")
? ? ? ? ? ? ? ? ? ? .append(res)
? ? ? ? ? ? ? ? ? ? .append("&et=")
? ? ? ? ? ? ? ? ? ? .append(expirationTime)
? ? ? ? ? ? ? ? ? ? .append("&method=")
? ? ? ? ? ? ? ? ? ? .append(signatureMethod)
? ? ? ? ? ? ? ? ? ? .append("&sign=")
? ? ? ? ? ? ? ? ? ? .append(sig);
? ? ? ? ? ??return?sb.toString();
? ? ? ? }
? ??
? ? ? ??public?static?String?generatorSignature(String version, String resourceName, String expirationTime, String accessKey, String signatureMethod)?
? ? ? ? ? ? ? ??throws?NoSuchAlgorithmException, InvalidKeyException {
? ? ? ? ? ??String?encryptText?=?expirationTime +?"n"?+ signatureMethod +?"n"?+ resourceName +?"n"?+ version;
? ? ? ? ? ? String signature;
? ? ? ? ? ??byte[] bytes = HmacEncrypt(encryptText, accessKey, signatureMethod);
? ? ? ? ? ? signature = Base64.getEncoder().encodeToString(bytes);
? ? ? ? ? ??return?signature;
? ? ? ? }
? ??
? ? ? ??public?static?byte[] HmacEncrypt(String data, String key, String signatureMethod)
? ? ? ? ? ? ? ??throws?NoSuchAlgorithmException, InvalidKeyException {
? ? ? ? ? ??//根據(jù)給定的字節(jié)數(shù)組構(gòu)造一個密鑰,第二參數(shù)指定一個密鑰算法的名稱
? ? ? ? ? ??SecretKeySpec?signinKey?=?null;
? ? ? ? ? ? signinKey =?new?SecretKeySpec(Base64.getDecoder().decode(key),
? ? ? ? ? ? ? ? ? ??"Hmac"?+ signatureMethod.toUpperCase());
? ? ? ? ? ??//生成一個指定 Mac 算法 的 Mac 對象
? ? ? ? ? ??Mac?mac?=?null;
? ? ? ? ? ? mac = Mac.getInstance("Hmac"?+ signatureMethod.toUpperCase());
? ? ? ? ? ??//用給定密鑰初始化 Mac 對象
? ? ? ? ? ? mac.init(signinKey);
? ? ? ? ? ??//完成 Mac 操作
? ? ? ? ? ??return?mac.doFinal(data.getBytes());
? ? ? ? }
? ??
? ? ? ??public?enum?SignatureMethod?{
? ? ? ? ? ? SHA1, MD5, SHA256;
? ? ? ? }
? ??
? ? ? ??public?static?void?main(String[] args)?throws?UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
? ? ? ? ? ??String?version?=?"2022-05-01";
? ? ? ? ? ??String?resourceName?=?"userid/12321";
? ? ? ? ? ??//用戶自定義token過期時間
? ? ? ? ? ??String?expirationTime?=?System.currentTimeMillis() /?1000?+?3600?+?"";
? ? ? ? ? ??String?signatureMethod?=?SignatureMethod.SHA1.name().toLowerCase();
? ? ? ? ? ??String?accessKey?=?"KuF3NT/jUBJ62LNBB/A8XZA9CqS3Cu79B/ABmfA1UCw=";
? ? ? ? ? ??String?token?=?assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey);
? ? ? ? ? ? System.out.println("Authorization:"?+ token);
? ? ? ? }
? ? }

go代碼示例

func??(s *SignService)?GenerateSign(params_map?map[string]string, access_key?string) (string,?error){
? ? signature_str := params_map["et"] +?"n"?+ params_map["method"] +?"n"?+ params_map["res"] +?"n"?+ params_map["version"]
? ? hmac_str :=?""
? ??switch?strings.ToLower(params_map["method"]) {
? ? ? ??case?"sha1":
? ? ? ? ? ? ?hmac_str = tools.HmacSha1(signature_str, tools.Base64Decode(access_key))
? ? ? ??case?"sha256":
? ? ? ? ? ? hmac_str = tools.HmacSha256(signature_str, tools.Base64Decode(access_key))
? ? ? ??case?"md5":
? ? ? ? ? ? hmac_str = tools.HmacMd5(signature_str, tools.Base64Decode(access_key))
? ? ? ??default:
? ? ? ? ? ??return?"",errors.New("簽名參數(shù)錯誤!")
? ? }

? ? sign :=tools.Base64Encode(hmac_str)
? ??return?sign,nil
}

func?Base64Encode(message?string)?string?{
? ??return?base64.StdEncoding.EncodeToString([]byte(message))
}

func?Base64Decode(message?string)?string?{
? ? decode_str, err := base64.StdEncoding.DecodeString(message)
? ??if?err !=?nil?{
? ? ? ??return?""
? ? }
? ??return?string(decode_str)
}

func?HmacSha256(data?string, secret?string)?string?{
? ? h := hmac.New(sha256.New, []byte(secret))
? ? h.Write([]byte(data))
? ??return?string(h.Sum(nil))
}

func?HmacMd5(data?string, secret?string)?string?{
? ? h := hmac.New(md5.New, []byte(secret))
? ? h.Write([]byte(data))
? ??return?string(h.Sum(nil))
}

func?HmacSha1(data?string, secret?string)?string?{
? ? h := hmac.New(sha1.New, []byte(secret))
? ? h.Write([]byte(data))
? ??return?string(h.Sum(nil))
}

php代碼示例

class?SafetyAuth
{
? ??private??$_version?=?'2022-05-01';//版本
? ??private??$_method?=?'sha1';//加密方法,還可以用md5、sha256
? ??private??$_access_key;//訪問密鑰
? ??private??$_res?;//資源參數(shù)
? ??private??$_et;//到期時間戳
? ??private??$_expiration;//有效期,有效時間

? ??public?function?__construct($access_key,?$expiration,$res){
? ? ? ??$this->_expiration =?$expiration;
? ? ? ??$this->_access_key =?$access_key;
? ? ? ??$this->_res =?$res;
? ? }

? ??//生成sign
? ??private?function?_makeSign()?{
? ? ? ??date_default_timezone_set('PRC');
? ? ? ??$this->_et =time() +?$this->_expiration;
? ? ? ??$string_for_signature?=?$this->_et .?"n"?.?$this->_method .?"n"?.?$this->_res ?.?"n"?.?$this->_version;
? ? ? ??$b64_decode_acckey?=?base64_decode($this->_access_key);
? ? ? ??$hmac_key?=?hash_hmac($this->_method,?$this->_strToUtf8($string_for_signature),?$b64_decode_acckey,?true);
? ? ? ??$sign?=?base64_encode($hmac_key);
? ? ? ??return?$sign;
? ? }

? ??private?function?_strToUtf8($str)?{
? ? ? ??$encode?=?mb_detect_encoding($str,?array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
? ? ? ??if?($encode?==?'UTF-8') {
? ? ? ? ? ??return?$str;
? ? ? ? }?else?{
? ? ? ? ? ??return?mb_convert_encoding($str,?'UTF-8',?$encode);
? ? ? ? }
? ? }

? ??//生成token
? ??public?function?makeToken()?{
? ? ? ??$sign?=?$this->_makeSign();
? ? ? ??$token?=?sprintf("version=2022-05-01&res=%s&et=%s&method=sha1&sign=%s",?urlencode($this->_res),?$this->_et,?urlencode($sign));
? ? ? ??return?$token;
? ? }
}

2.2 開發(fā)環(huán)境搭建

開發(fā)工具下載:https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html

2.3 靜態(tài)網(wǎng)頁展示

以下是一個展示智能插座功能的靜態(tài)HTML頁面設(shè)計,采用科技感配色(深藍(lán)色調(diào)):

<!DOCTYPE?html>
<html?lang="zh-CN">
<head>
? ??<meta?charset="UTF-8">
? ??<title>智能插座監(jiān)控系統(tǒng)</title>
? ??<script?src="https://cdn.jsdelivr.net/npm/chart.js"></script>
? ??<style>
? ? ? ??:root?{
? ? ? ? ? ??--bg-color:?#0a192f;
? ? ? ? ? ??--accent-blue:?#64ffda;
? ? ? ? ? ??--accent-gray:?#8892b0;
? ? ? ? }

? ? ? ??body?{
? ? ? ? ? ??background-color:?var(--bg-color);
? ? ? ? ? ??color:?#ffffff;
? ? ? ? ? ??font-family:?'Segoe UI', sans-serif;
? ? ? ? ? ??margin:?0;
? ? ? ? ? ??padding:?20px;
? ? ? ? }

? ? ? ??.container?{
? ? ? ? ? ??max-width:?1200px;
? ? ? ? ? ??margin:?0?auto;
? ? ? ? }

? ? ? ??.dashboard-header?{
? ? ? ? ? ??text-align: center;
? ? ? ? ? ??padding:?20px;
? ? ? ? ? ??border-bottom:?2px?solid?var(--accent-blue);
? ? ? ? }

? ? ? ??.data-cards?{
? ? ? ? ? ??display: grid;
? ? ? ? ? ??grid-template-columns:?repeat(auto-fit,?minmax(300px,?1fr));
? ? ? ? ? ??gap:?20px;
? ? ? ? ? ??margin:?20px?0;
? ? ? ? }

? ? ? ??.card?{
? ? ? ? ? ??background:?rgba(17,?34,?64,?0.8);
? ? ? ? ? ??border-radius:?10px;
? ? ? ? ? ??padding:?20px;
? ? ? ? ? ??backdrop-filter:?blur(5px);
? ? ? ? ? ??border:?1px?solid?var(--accent-blue);
? ? ? ? ? ??box-shadow:?0?0?15px?rgba(100,?255,?218,?0.1);
? ? ? ? }

? ? ? ??.chart-container?{
? ? ? ? ? ??height:?400px;
? ? ? ? ? ??margin:?20px?0;
? ? ? ? }

? ? ? ??.status-indicator?{
? ? ? ? ? ??display: flex;
? ? ? ? ? ??align-items: center;
? ? ? ? ? ??gap:?10px;
? ? ? ? }

? ? ? ??.status-led?{
? ? ? ? ? ??width:?15px;
? ? ? ? ? ??height:?15px;
? ? ? ? ? ??border-radius:?50%;
? ? ? ? ? ??background:?#00ff00;
? ? ? ? ? ??animation: pulse?1.5s?infinite;
? ? ? ? }

? ? ? ??@keyframes?pulse {
? ? ? ? ? ??0%?{?box-shadow:?0?0?0?0?rgba(0,?255,?0,?0.7); }
? ? ? ? ? ??70%?{?box-shadow:?0?0?0?10px?rgba(0,?255,?0,?0); }
? ? ? ? ? ??100%?{?box-shadow:?0?0?0?0?rgba(0,?255,?0,?0); }
? ? ? ? }

? ? ? ??.param-grid?{
? ? ? ? ? ??display: grid;
? ? ? ? ? ??grid-template-columns:?repeat(3,?1fr);
? ? ? ? ? ??gap:?15px;
? ? ? ? }

? ? ? ??.param-item?{
? ? ? ? ? ??display: flex;
? ? ? ? ? ??justify-content: space-between;
? ? ? ? ? ??padding:?10px;
? ? ? ? ? ??background:?rgba(255,?255,?255,?0.05);
? ? ? ? ? ??border-radius:?5px;
? ? ? ? }
? ??</style>
</head>
<body>
? ??<div?class="container">
? ? ? ??<div?class="dashboard-header">
? ? ? ? ? ??<h1>智能插座監(jiān)控系統(tǒng)</h1>
? ? ? ? ? ??<div?class="status-indicator">
? ? ? ? ? ? ? ??<div?class="status-led"></div>
? ? ? ? ? ? ? ??<span>運行狀態(tài):正常</span>
? ? ? ? ? ??</div>
? ? ? ??</div>

? ? ? ??<!-- 實時數(shù)據(jù)展示 -->
? ? ? ??<div?class="data-cards">
? ? ? ? ? ??<div?class="card">
? ? ? ? ? ? ? ??<h3>電氣參數(shù)</h3>
? ? ? ? ? ? ? ??<div?class="param-grid">
? ? ? ? ? ? ? ? ? ??<div?class="param-item">
? ? ? ? ? ? ? ? ? ? ? ??<span>電壓</span>
? ? ? ? ? ? ? ? ? ? ? ??<span>220.3 V</span>
? ? ? ? ? ? ? ? ? ??</div>
? ? ? ? ? ? ? ? ? ??<div?class="param-item">
? ? ? ? ? ? ? ? ? ? ? ??<span>電流</span>
? ? ? ? ? ? ? ? ? ? ? ??<span>5.6 A</span>
? ? ? ? ? ? ? ? ? ??</div>
? ? ? ? ? ? ? ? ? ??<div?class="param-item">
? ? ? ? ? ? ? ? ? ? ? ??<span>有功功率</span>
? ? ? ? ? ? ? ? ? ? ? ??<span>1234 W</span>
? ? ? ? ? ? ? ? ? ??</div>
? ? ? ? ? ? ? ? ? ??<div?class="param-item">
? ? ? ? ? ? ? ? ? ? ? ??<span>功率因數(shù)</span>
? ? ? ? ? ? ? ? ? ? ? ??<span>0.98</span>
? ? ? ? ? ? ? ? ? ??</div>
? ? ? ? ? ? ? ? ? ??<div?class="param-item">
? ? ? ? ? ? ? ? ? ? ? ??<span>頻率</span>
? ? ? ? ? ? ? ? ? ? ? ??<span>50.0 Hz</span>
? ? ? ? ? ? ? ? ? ??</div>
? ? ? ? ? ? ? ? ? ??<div?class="param-item">
? ? ? ? ? ? ? ? ? ? ? ??<span>累計電能</span>
? ? ? ? ? ? ? ? ? ? ? ??<span>56.8 kWh</span>
? ? ? ? ? ? ? ? ? ??</div>
? ? ? ? ? ? ? ??</div>
? ? ? ? ? ??</div>

? ? ? ? ? ??<div?class="card">
? ? ? ? ? ? ? ??<h3>環(huán)境參數(shù)</h3>
? ? ? ? ? ? ? ??<div?class="param-grid">
? ? ? ? ? ? ? ? ? ??<div?class="param-item">
? ? ? ? ? ? ? ? ? ? ? ??<span>溫度</span>
? ? ? ? ? ? ? ? ? ? ? ??<span>28.5 ℃</span>
? ? ? ? ? ? ? ? ? ??</div>
? ? ? ? ? ? ? ? ? ??<div?class="param-item">
? ? ? ? ? ? ? ? ? ? ? ??<span>濕度</span>
? ? ? ? ? ? ? ? ? ? ? ??<span>45% RH</span>
? ? ? ? ? ? ? ? ? ??</div>
? ? ? ? ? ? ? ??</div>
? ? ? ? ? ??</div>
? ? ? ??</div>

? ? ? ??<!-- 歷史數(shù)據(jù)圖表 -->
? ? ? ??<div?class="card">
? ? ? ? ? ??<h3>歷史數(shù)據(jù)趨勢</h3>
? ? ? ? ? ??<div?class="chart-container">
? ? ? ? ? ? ? ??<canvas?id="historyChart"></canvas>
? ? ? ? ? ??</div>
? ? ? ? ? ??<div?style="text-align: right; margin-top: 10px;">
? ? ? ? ? ? ? ??<input?type="date"?id="chartDate"?value="2024-03-20">
? ? ? ? ? ? ? ??<button?style="background: var(--accent-blue); border: none; padding: 5px 15px; border-radius: 3px;">
? ? ? ? ? ? ? ? ? ? 查詢
? ? ? ? ? ? ? ??</button>
? ? ? ? ? ??</div>
? ? ? ??</div>

? ? ? ??<!-- 設(shè)備功能列表 -->
? ? ? ??<div?class="card"?style="margin-top: 20px;">
? ? ? ? ? ??<h3>設(shè)備功能清單</h3>
? ? ? ? ? ??<ul?style="columns: 2;">
? ? ? ? ? ? ? ??<li>電壓采集 (0-264V)</li>
? ? ? ? ? ? ? ??<li>電流采集 (10mA-20A)</li>
? ? ? ? ? ? ? ??<li>有功/無功功率采集</li>
? ? ? ? ? ? ? ??<li>電能計量</li>
? ? ? ? ? ? ? ??<li>交直流電檢測</li>
? ? ? ? ? ? ? ??<li>溫濕度監(jiān)測</li>
? ? ? ? ? ? ? ??<li>功率因數(shù)檢測</li>
? ? ? ? ? ? ? ??<li>頻率檢測</li>
? ? ? ? ? ? ? ??<li>Web遠(yuǎn)程監(jiān)控</li>
? ? ? ? ? ? ? ??<li>運行狀態(tài)檢測</li>
? ? ? ? ? ??</ul>
? ? ? ??</div>
? ??</div>

? ??<script>
? ? ? ??// 示例圖表數(shù)據(jù)
? ? ? ??const?ctx =?document.getElementById('historyChart').getContext('2d');
? ? ? ??new?Chart(ctx, {
? ? ? ? ? ??type:?'line',
? ? ? ? ? ??data: {
? ? ? ? ? ? ? ??labels:?Array(24).fill().map((_,i) =>?`${i}:00`),
? ? ? ? ? ? ? ??datasets: [{
? ? ? ? ? ? ? ? ? ??label:?'電壓 (V)',
? ? ? ? ? ? ? ? ? ??data:?Array(24).fill().map(() =>?Math.random()*20?+?220),
? ? ? ? ? ? ? ? ? ??borderColor:?'#64ffda',
? ? ? ? ? ? ? ? ? ??tension:?0.3
? ? ? ? ? ? ? ? },{
? ? ? ? ? ? ? ? ? ??label:?'電流 (A)',
? ? ? ? ? ? ? ? ? ??data:?Array(24).fill().map(() =>?Math.random()*5),
? ? ? ? ? ? ? ? ? ??borderColor:?'#ff6384',
? ? ? ? ? ? ? ? ? ??tension:?0.3
? ? ? ? ? ? ? ? }]
? ? ? ? ? ? },
? ? ? ? ? ??options: {
? ? ? ? ? ? ? ??responsive:?true,
? ? ? ? ? ? ? ??maintainAspectRatio:?false,
? ? ? ? ? ? ? ??scales: {
? ? ? ? ? ? ? ? ? ??y: {
? ? ? ? ? ? ? ? ? ? ? ??beginAtZero:?true,
? ? ? ? ? ? ? ? ? ? ? ??grid: {?color:?'rgba(255,255,255,0.1)'?}
? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ??x: {
? ? ? ? ? ? ? ? ? ? ? ??grid: {?color:?'rgba(255,255,255,0.1)'?}
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ??</script>
</body>
</html>

這個頁面包含以下主要特點:

    1. 視覺設(shè)計:
    ? 深藍(lán)色科技感背景(#0a192f)? 霓虹藍(lán)綠色(#64ffda)作為強(qiáng)調(diào)色? 半透明玻璃擬態(tài)效果卡片? 動態(tài)狀態(tài)指示燈
    2. 功能展示:
    ? 實時電氣參數(shù)顯示(電壓、電流、功率等)? 環(huán)境參數(shù)顯示(溫濕度)? 歷史數(shù)據(jù)趨勢圖表(使用Chart.js)? 日期選擇功能? 設(shè)備功能清單? 設(shè)備運行狀態(tài)指示
    3. 交互元素:
    ? 響應(yīng)式布局(自動適應(yīng)不同屏幕尺寸)? 動態(tài)數(shù)據(jù)圖表? 數(shù)據(jù)卡片懸浮效果? 日期選擇器
    4. 技術(shù)實現(xiàn):
    ? CSS Grid布局? CSS自定義屬性? 圖表可視化(Chart.js)? 簡單的動畫效果

五、微信小程序設(shè)計思路

以下是微信小程序的設(shè)計代碼,用于從OneNet物聯(lián)網(wǎng)平臺獲取設(shè)備端上傳的數(shù)據(jù),并展示電壓、電流、功率、電能、溫濕度等信息。小程序界面設(shè)計簡潔,支持實時數(shù)據(jù)展示和歷史數(shù)據(jù)查詢。


5.1 微信小程序代碼結(jié)構(gòu)

1. 目錄結(jié)構(gòu)
/pages
? /index
? ? index.js
? ? index.wxml
? ? index.wxss
? /history
? ? history.js
? ? history.wxml
? ? history.wxss
/app.js
/app.json
/app.wxss

2.?app.json?配置文件
{
??"pages":?[
? ??"pages/index/index",
? ??"pages/history/history"
??],
??"window":?{
? ??"navigationBarTitleText":?"智能插座監(jiān)控",
? ??"navigationBarBackgroundColor":?"#2d8cf0",
? ??"navigationBarTextStyle":?"white"
??},
??"tabBar":?{
? ??"list":?[
? ? ??{
? ? ? ??"pagePath":?"pages/index/index",
? ? ? ??"text":?"實時數(shù)據(jù)",
? ? ? ??"iconPath":?"images/home.png",
? ? ? ??"selectedIconPath":?"images/home-active.png"
? ? ??},
? ? ??{
? ? ? ??"pagePath":?"pages/history/history",
? ? ? ??"text":?"歷史數(shù)據(jù)",
? ? ? ??"iconPath":?"images/history.png",
? ? ? ??"selectedIconPath":?"images/history-active.png"
? ? ??}
? ??]
??}
}

3.?index.wxml?實時數(shù)據(jù)頁面
<view?class="container">
??<view?class="card">
? ??<text?class="title">電壓</text>
? ??<text?class="value">{{voltage}} V</text>
??</view>
??<view?class="card">
? ??<text?class="title">電流</text>
? ??<text?class="value">{{current}} A</text>
??</view>
??<view?class="card">
? ??<text?class="title">功率</text>
? ??<text?class="value">{{power}} W</text>
??</view>
??<view?class="card">
? ??<text?class="title">電能</text>
? ??<text?class="value">{{energy}} kWh</text>
??</view>
??<view?class="card">
? ??<text?class="title">溫度</text>
? ??<text?class="value">{{temperature}} °C</text>
??</view>
??<view?class="card">
? ??<text?class="title">濕度</text>
? ??<text?class="value">{{humidity}} %</text>
??</view>
</view>

4.?index.wxss?實時數(shù)據(jù)頁面樣式
.container?{
??padding:?20px;
}

.card?{
??background-color:?#fff;
??border-radius:?10px;
??padding:?20px;
??margin-bottom:?20px;
??box-shadow:?0?2px?8px?rgba(0,?0,?0,?0.1);
}

.title?{
??font-size:?16px;
??color:?#666;
}

.value?{
??font-size:?24px;
??color:?#333;
??font-weight: bold;
}

5.?index.js?實時數(shù)據(jù)頁面邏輯
Page({
??data: {
? ??voltage:?0,
? ??current:?0,
? ??power:?0,
? ??energy:?0,
? ??temperature:?0,
? ??humidity:?0
? },

??onLoad() {
? ??this.getDataFromOneNet();
? ??setInterval(() =>?{
? ? ??this.getDataFromOneNet();
? ? },?5000);?// 每5秒更新一次數(shù)據(jù)
? },

??getDataFromOneNet() {
? ??const?apiKey =?'your-onenet-api-key';?// 替換為你的OneNet API Key
? ??const?deviceId =?'your-device-id';?// 替換為你的設(shè)備ID
? ??const?url =?`https://api.heclouds.com/devices/${deviceId}/datapoints`;

? ? wx.request({
? ? ??url: url,
? ? ??method:?'GET',
? ? ??header: {
? ? ? ??'api-key': apiKey
? ? ? },
? ? ??success:?(res) =>?{
? ? ? ??if?(res.statusCode?===?200) {
? ? ? ? ??const?data = res.data.data;
? ? ? ? ??this.setData({
? ? ? ? ? ??voltage: data.voltage,
? ? ? ? ? ??current: data.current,
? ? ? ? ? ??power: data.power,
? ? ? ? ? ??energy: data.energy,
? ? ? ? ? ??temperature: data.temp,
? ? ? ? ? ??humidity: data.humi
? ? ? ? ? });
? ? ? ? }
? ? ? },
? ? ??fail:?(err) =>?{
? ? ? ??console.error('獲取數(shù)據(jù)失敗', err);
? ? ? }
? ? });
? }
});

6.?history.wxml?歷史數(shù)據(jù)頁面
<view?class="container">
??<picker?mode="date"?start="2023-01-01"?end="2023-12-31"?bindchange="onDateChange">
? ??<view?class="date-picker">
? ? ??<text>選擇日期:{{selectedDate}}</text>
? ??</view>
??</picker>
??<view?class="chart-container">
? ??<canvas?canvas-id="lineChart"?class="chart"></canvas>
??</view>
</view>

7.?history.wxss?歷史數(shù)據(jù)頁面樣式
.container?{
??padding:?20px;
}

.date-picker?{
??background-color:?#fff;
??border-radius:?10px;
??padding:?20px;
??margin-bottom:?20px;
??text-align: center;
??box-shadow:?0?2px?8px?rgba(0,?0,?0,?0.1);
}

.chart-container?{
??width:?100%;
??height:?400px;
}

8.?history.js?歷史數(shù)據(jù)頁面邏輯
const?util =?require('../../utils/util.js');

Page({
??data: {
? ??selectedDate: util.formatDate(new?Date()),
? ??historyData: []
? },

??onLoad() {
? ??this.getHistoryData(this.data.selectedDate);
? },

??onDateChange(e) {
? ??const?selectedDate = e.detail.value;
? ??this.setData({ selectedDate });
? ??this.getHistoryData(selectedDate);
? },

??getHistoryData(date) {
? ??const?apiKey =?'your-onenet-api-key';?// 替換為你的OneNet API Key
? ??const?deviceId =?'your-device-id';?// 替換為你的設(shè)備ID
? ??const?url =?`https://api.heclouds.com/devices/${deviceId}/datapoints?start=${date}T00:00:00&end=${date}T23:59:59`;

? ? wx.request({
? ? ??url: url,
? ? ??method:?'GET',
? ? ??header: {
? ? ? ??'api-key': apiKey
? ? ? },
? ? ??success:?(res) =>?{
? ? ? ??if?(res.statusCode?===?200) {
? ? ? ? ??this.setData({?historyData: res.data.data?});
? ? ? ? ??this.drawChart();
? ? ? ? }
? ? ? },
? ? ??fail:?(err) =>?{
? ? ? ??console.error('獲取歷史數(shù)據(jù)失敗', err);
? ? ? }
? ? });
? },

??drawChart() {
? ??const?ctx = wx.createCanvasContext('lineChart');
? ??const?data =?this.data.historyData;

? ??// 繪制折線圖
? ? ctx.setStrokeStyle('#2d8cf0');
? ? ctx.setLineWidth(2);
? ? ctx.beginPath();
? ? data.forEach((item, index) =>?{
? ? ??const?x = (index / (data.length?-?1)) *?300;
? ? ??const?y = (1?- item.voltage?/?264) *?200;?// 假設(shè)電壓范圍為0-264V
? ? ??if?(index ===?0) {
? ? ? ? ctx.moveTo(x, y);
? ? ? }?else?{
? ? ? ? ctx.lineTo(x, y);
? ? ? }
? ? });
? ? ctx.stroke();
? ? ctx.draw();
? }
});

9.?utils/util.js?工具函數(shù)
function?formatDate(date) {
??const?year = date.getFullYear();
??const?month =?String(date.getMonth() +?1).padStart(2,?'0');
??const?day =?String(date.getDate()).padStart(2,?'0');
??return?`${year}-${month}-${day}`;
}

module.exports?= {
? formatDate
};

5.2 功能說明

1.實時數(shù)據(jù)頁面

      • ? 從OneNet獲取設(shè)備上傳的實時數(shù)據(jù)(電壓、電流、功率、電能、溫濕度)。? 每5秒更新一次數(shù)據(jù)。? 數(shù)據(jù)以卡片形式展示,界面簡潔清晰。

2.?歷史數(shù)據(jù)頁面

      • ? 支持選擇日期,查詢指定日期的歷史數(shù)據(jù)。? 使用折線圖展示電壓變化趨勢。? 數(shù)據(jù)通過Canvas繪制,支持動態(tài)更新。

3.?界面設(shè)計

    • ? 采用卡片式布局,突出顯示關(guān)鍵數(shù)據(jù)。? 使用藍(lán)色主題色,界面風(fēng)格統(tǒng)一。

5.3 總結(jié)

該微信小程序?qū)崿F(xiàn)了從OneNet物聯(lián)網(wǎng)平臺獲取數(shù)據(jù)并展示的功能,支持實時數(shù)據(jù)監(jiān)控和歷史數(shù)據(jù)查詢。代碼結(jié)構(gòu)清晰,界面設(shè)計簡潔,適合智能插座項目的需求。

四、STM32設(shè)備端設(shè)計思路

4.1 整體代碼設(shè)計思路

(1)初始化階段

    ? 初始化系統(tǒng)時鐘、GPIO、串口、I2C、SPI等外設(shè)。? 初始化各子模塊(如SHT30、JSY-MK-1031、ESP8266、OLED等)。? 配置中斷(如果需要)。

(2)主循環(huán)階段

    ? 定時采集電壓、電流、功率、電能、溫濕度等數(shù)據(jù)。? 將采集的數(shù)據(jù)顯示在OLED屏幕上。? 通過ESP8266模塊將數(shù)據(jù)上傳至OneNet物聯(lián)網(wǎng)服務(wù)器。? 檢測用戶按鍵輸入,實現(xiàn)本地控制功能(如開關(guān)插座)。? 實時監(jiān)測系統(tǒng)狀態(tài),確保各模塊正常工作。

(3)模塊化設(shè)計

    ? 各子模塊的功能封裝成獨立的函數(shù),便于維護(hù)和擴(kuò)展。? 主循環(huán)中通過調(diào)用這些函數(shù)實現(xiàn)數(shù)據(jù)的采集、處理和傳輸。

(4)低功耗優(yōu)化

    ? 在空閑時進(jìn)入低功耗模式,降低系統(tǒng)功耗。? 定時喚醒進(jìn)行數(shù)據(jù)采集和傳輸。

4.2?main.c?代碼示例

#include?"stm32f10x.h"
#include?"sht30.h"
#include?"jsy_mk_1031.h"
#include?"esp8266.h"
#include?"oled.h"
#include?"key.h"
#include?"relay.h"
#include?<stdio.h>
#include?<string.h>

// 定義全局變量存儲采集的數(shù)據(jù)
float?voltage =?0.0; ? ? ?// 電壓
float?current =?0.0; ? ? ?// 電流
float?power =?0.0; ? ? ? ?// 功率
float?energy =?0.0; ? ? ??// 電能
float?temperature =?0.0; ?// 溫度
float?humidity =?0.0; ? ??// 濕度

// 系統(tǒng)初始化函數(shù)
void?System_Init(void)?{
? ??// 初始化系統(tǒng)時鐘
? ? RCC_Configuration();
? ??
? ??// 初始化GPIO
? ? GPIO_Configuration();
? ??
? ??// 初始化串口(用于調(diào)試和ESP8266通信)
? ? USART_Init(115200);
? ??
? ??// 初始化I2C(用于SHT30和OLED)
? ? I2C_Configuration();
? ??
? ??// 初始化SPI(如果需要)
? ? SPI_Configuration();
? ??
? ??// 初始化各子模塊
? ? SHT30_Init();
? ? JSY_MK_1031_Init();
? ? ESP8266_Init();
? ? OLED_Init();
? ? KEY_Init();
? ? Relay_Init();
? ??
? ??// 初始化定時器(用于定時采集數(shù)據(jù))
? ? TIM_Configuration();
}

// 數(shù)據(jù)采集函數(shù)
void?Data_Acquisition(void)?{
? ??// 采集電壓、電流、功率、電能
? ? voltage = JSY_MK_1031_GetVoltage();
? ? current = JSY_MK_1031_GetCurrent();
? ? power = JSY_MK_1031_GetPower();
? ? energy = JSY_MK_1031_GetEnergy();
? ??
? ??// 采集溫濕度
? ? SHT30_ReadData(&temperature, &humidity);
}

// 數(shù)據(jù)顯示函數(shù)
void?Data_Display(void)?{
? ??char?buffer[64];
? ??
? ??// 清屏
? ? OLED_Clear();
? ??
? ??// 顯示電壓
? ??snprintf(buffer,?sizeof(buffer),?"Voltage: %.2f V", voltage);
? ? OLED_ShowString(0,?0, buffer);
? ??
? ??// 顯示電流
? ??snprintf(buffer,?sizeof(buffer),?"Current: %.2f A", current);
? ? OLED_ShowString(0,?16, buffer);
? ??
? ??// 顯示功率
? ??snprintf(buffer,?sizeof(buffer),?"Power: %.2f W", power);
? ? OLED_ShowString(0,?32, buffer);
? ??
? ??// 顯示電能
? ??snprintf(buffer,?sizeof(buffer),?"Energy: %.2f kWh", energy);
? ? OLED_ShowString(0,?48, buffer);
? ??
? ??// 顯示溫濕度
? ??snprintf(buffer,?sizeof(buffer),?"Temp: %.2f C", temperature);
? ? OLED_ShowString(64,?0, buffer);
? ??snprintf(buffer,?sizeof(buffer),?"Humi: %.2f %%", humidity);
? ? OLED_ShowString(64,?16, buffer);
}

// 數(shù)據(jù)上傳函數(shù)
void?Data_Upload(void)?{
? ??char?json[128];
? ??
? ??// 構(gòu)造JSON數(shù)據(jù)
? ??snprintf(json,?sizeof(json),
? ? ? ? ? ? ?"{"voltage":%.2f,"current":%.2f,"power":%.2f,"energy":%.2f,"temp":%.2f,"humi":%.2f}",
? ? ? ? ? ? ?voltage, current, power, energy, temperature, humidity);
? ??
? ??// 通過ESP8266上傳數(shù)據(jù)到OneNet
? ? ESP8266_SendData(json);
}

// 主函數(shù)
int?main(void)?{
? ??// 系統(tǒng)初始化
? ? System_Init();
? ??
? ??// 主循環(huán)
? ??while?(1) {
? ? ? ??// 數(shù)據(jù)采集
? ? ? ? Data_Acquisition();
? ? ? ??
? ? ? ??// 數(shù)據(jù)顯示
? ? ? ? Data_Display();
? ? ? ??
? ? ? ??// 數(shù)據(jù)上傳
? ? ? ? Data_Upload();
? ? ? ??
? ? ? ??// 檢測按鍵輸入
? ? ? ??if?(KEY_GetState() == KEY_PRESSED) {
? ? ? ? ? ? Relay_Toggle(); ?// 切換繼電器狀態(tài)
? ? ? ? }
? ? }
}

// 定時器中斷服務(wù)函數(shù)(用于定時采集數(shù)據(jù))
void?TIM2_IRQHandler(void)?{
? ??if?(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
? ? ? ? TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
? ? ? ??
? ? ? ??// 觸發(fā)數(shù)據(jù)采集
? ? ? ? Data_Acquisition();
? ? }
}

4.3 代碼設(shè)計思路說明

(1)模塊化設(shè)計

? 每個功能模塊(如數(shù)據(jù)采集、顯示、上傳等)都封裝成獨立的函數(shù),便于維護(hù)和擴(kuò)展。

? 例如,Data_Acquisition負(fù)責(zé)采集數(shù)據(jù),Data_Display負(fù)責(zé)顯示數(shù)據(jù),Data_Upload負(fù)責(zé)上傳數(shù)據(jù)。

(2)定時采集與實時顯示

    • ? 使用定時器中斷定時觸發(fā)數(shù)據(jù)采集,確保數(shù)據(jù)的實時性。? 主循環(huán)中調(diào)用Data_Display函數(shù),將采集的數(shù)據(jù)實時顯示在OLED屏幕上。

(3)數(shù)據(jù)上傳

    ? 通過ESP8266模塊將數(shù)據(jù)封裝成JSON格式,上傳至OneNet物聯(lián)網(wǎng)服務(wù)器。? 數(shù)據(jù)上傳頻率可以根據(jù)實際需求調(diào)整。

(4)用戶交互

    ? 通過按鍵檢測實現(xiàn)本地控制功能(如開關(guān)插座)。? 按鍵狀態(tài)檢測在主循環(huán)中進(jìn)行,確保響應(yīng)用戶操作。

(5)低功耗優(yōu)化

    ? 在數(shù)據(jù)采集和上傳完成后,可以進(jìn)入低功耗模式,降低系統(tǒng)功耗。

4.4 總結(jié)

main.c代碼實現(xiàn)了智能插座的核心功能,包括數(shù)據(jù)采集、顯示、上傳和用戶交互。通過模塊化設(shè)計和定時器中斷,確保了系統(tǒng)的實時性和穩(wěn)定性。代碼結(jié)構(gòu)清晰,便于后續(xù)功能擴(kuò)展和維護(hù)。

意法半導(dǎo)體

意法半導(dǎo)體

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷售收入在半導(dǎo)體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(17%),計算機(jī)(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車用集成電路領(lǐng)域居世界前列.

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷售收入在半導(dǎo)體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(17%),計算機(jī)(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車用集成電路領(lǐng)域居世界前列.收起

查看更多

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄