• 方案介紹
    • 一、前言
    • 二、硬件選型(搭建模型參考)
    • 三、部署華為云物聯(lián)網(wǎng)平臺(tái)
    • 四、STM32設(shè)備端代碼設(shè)計(jì)
    • 五、上位機(jī)開發(fā)
    • 六、總結(jié)
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

基于STM32單片機(jī)設(shè)計(jì)的土壤質(zhì)量監(jiān)測(cè)系統(tǒng)

06/12 10:18
646
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

更多詳細(xì)資料請(qǐng)聯(lián)系.docx

共1個(gè)文件

一、前言

1.1 項(xiàng)目介紹

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

隨著現(xiàn)代農(nóng)業(yè)的快速發(fā)展,傳統(tǒng)依賴經(jīng)驗(yàn)的耕作方式已逐漸無法滿足精細(xì)化、智能化種植的需求。農(nóng)業(yè)生產(chǎn)中土壤作為植物生長(zhǎng)的基礎(chǔ),其質(zhì)量直接關(guān)系到作物的產(chǎn)量與品質(zhì)。因此,對(duì)土壤質(zhì)量的實(shí)時(shí)監(jiān)測(cè)和分析成為農(nóng)業(yè)現(xiàn)代化管理中的關(guān)鍵環(huán)節(jié)。尤其是在溫室種植、精準(zhǔn)農(nóng)業(yè)以及設(shè)施農(nóng)業(yè)等場(chǎng)景中,對(duì)土壤濕度、溫度、PH值以及氮磷鉀等化學(xué)元素的含量進(jìn)行有效監(jiān)測(cè),有助于科學(xué)施肥與灌溉,從而實(shí)現(xiàn)水肥資源的優(yōu)化配置,提高農(nóng)業(yè)產(chǎn)出效率,降低環(huán)境污染。

近年來,隨著物聯(lián)網(wǎng)傳感器技術(shù)、嵌入式系統(tǒng)以及無線通信的不斷發(fā)展,將這些先進(jìn)技術(shù)與農(nóng)業(yè)環(huán)境監(jiān)測(cè)相結(jié)合,為農(nóng)業(yè)信息化建設(shè)提供了新的手段。尤其是STM32單片機(jī)以其高性能、低功耗、豐富的外設(shè)接口等特點(diǎn),成為農(nóng)業(yè)智能設(shè)備開發(fā)的理想平臺(tái)。通過集成多種傳感器模塊,實(shí)現(xiàn)對(duì)土壤溫濕度、PH值、氮磷鉀等關(guān)鍵參數(shù)的綜合采集,為農(nóng)業(yè)決策提供科學(xué)依據(jù)。

在本項(xiàng)目中,系統(tǒng)基于STM32F103C8T6單片機(jī)設(shè)計(jì),配備多功能土壤質(zhì)量傳感器、環(huán)境溫濕度傳感器光照強(qiáng)度檢測(cè)模塊、自動(dòng)灌溉控制模塊等關(guān)鍵硬件,實(shí)現(xiàn)對(duì)農(nóng)業(yè)環(huán)境中土壤與氣候條件的實(shí)時(shí)監(jiān)測(cè)與管理。系統(tǒng)采用OLED顯示屏進(jìn)行本地信息展示,同時(shí)配置蜂鳴器對(duì)異常情況進(jìn)行實(shí)時(shí)報(bào)警,便于現(xiàn)場(chǎng)運(yùn)維人員及時(shí)干預(yù)。

此外,為實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)查看與分析,系統(tǒng)集成了Air780e 4G通信模塊,通過MQTT協(xié)議與華為云IoT物聯(lián)網(wǎng)平臺(tái)進(jìn)行數(shù)據(jù)通信。平臺(tái)可對(duì)來自多個(gè)終端的監(jiān)測(cè)數(shù)據(jù)進(jìn)行集中管理,實(shí)現(xiàn)不同種植區(qū)域設(shè)備的分布式部署與統(tǒng)一云端接入。用戶可通過Android手機(jī)APP或Windows上位機(jī)軟件遠(yuǎn)程查看實(shí)時(shí)參數(shù)和歷史折線圖,全面掌握各類環(huán)境變化趨勢(shì),提升管理的科學(xué)性與前瞻性。

為增強(qiáng)系統(tǒng)的實(shí)用性與可持續(xù)運(yùn)行能力,設(shè)備采用太陽能供電方案,實(shí)現(xiàn)全天候不間斷監(jiān)測(cè),適用于缺乏常規(guī)電力供應(yīng)的田間地頭或偏遠(yuǎn)農(nóng)場(chǎng)。整體系統(tǒng)設(shè)計(jì)注重低功耗、高集成、易部署的原則,可廣泛應(yīng)用于農(nóng)業(yè)科研試驗(yàn)、設(shè)施農(nóng)業(yè)監(jiān)控、精準(zhǔn)農(nóng)業(yè)種植等多個(gè)領(lǐng)域,為推動(dòng)農(nóng)業(yè)智能化轉(zhuǎn)型提供堅(jiān)實(shí)的技術(shù)支撐。

image-20250525104502312

image-20250525104426768

image-20250525104524935

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

(1)土壤PH檢測(cè)功能:通過485接口的多合一土壤質(zhì)量傳感器,實(shí)時(shí)檢測(cè)當(dāng)前土壤的PH值,評(píng)估土壤酸堿度,輔助判斷土壤是否適合當(dāng)前作物生長(zhǎng)。

(2)土壤溫度、濕度檢測(cè)功能:傳感器可同步檢測(cè)土壤的溫度和含水量,結(jié)合灌溉邏輯,實(shí)現(xiàn)精準(zhǔn)水分管理,防止干旱或過濕。

(3)土壤氮磷鉀含量檢測(cè)功能:檢測(cè)土壤中氮、磷、鉀三種關(guān)鍵營(yíng)養(yǎng)元素的含量,為科學(xué)施肥提供數(shù)據(jù)支持,避免營(yíng)養(yǎng)過?;虿蛔?。

(4)環(huán)境溫度、濕度檢測(cè)功能:采用DHT11傳感器監(jiān)測(cè)環(huán)境空氣的溫度和濕度,輔助綜合分析種植環(huán)境對(duì)土壤和作物的影響。

(5)自動(dòng)灌溉控制功能:系統(tǒng)根據(jù)土壤濕度值的實(shí)時(shí)變化自動(dòng)判斷是否啟動(dòng)灌溉,通過繼電器控制5V抽水電機(jī)精準(zhǔn)補(bǔ)水。

(6)環(huán)境光照強(qiáng)度檢測(cè)功能:通過BH1750光照傳感器采集當(dāng)前環(huán)境光強(qiáng)數(shù)據(jù),為作物生長(zhǎng)光照管理和農(nóng)業(yè)作業(yè)時(shí)間安排提供參考。

(7)數(shù)據(jù)上云功能:利用Air780e 4G模塊,通過MQTT協(xié)議將土壤與環(huán)境數(shù)據(jù)上傳至華為云IOT物聯(lián)網(wǎng)服務(wù)器,實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)集中管理。

(8)本地OLED顯示功能:使用0.96寸IIC接口OLED顯示屏,實(shí)時(shí)顯示采集的土壤和環(huán)境參數(shù),便于現(xiàn)場(chǎng)查看。

(9)異常報(bào)警功能:系統(tǒng)對(duì)PH值、濕度、氮磷鉀等參數(shù)設(shè)定閾值,當(dāng)監(jiān)測(cè)數(shù)據(jù)異常時(shí)自動(dòng)觸發(fā)蜂鳴器報(bào)警,提醒用戶注意環(huán)境變化。

(10)太陽能供電功能:通過太陽能充電板、鋰電池及充電管理電路,實(shí)現(xiàn)全天候獨(dú)立供電,適用于無市電或野外種植環(huán)境。

(11)多設(shè)備部署與獨(dú)立運(yùn)行功能:支持多個(gè)設(shè)備同時(shí)部署在不同區(qū)域,每個(gè)設(shè)備作為獨(dú)立節(jié)點(diǎn)采集數(shù)據(jù)并上傳至云端,互不干擾,隨插隨用。

(12)遠(yuǎn)程查看與趨勢(shì)分析功能:通過Android手機(jī)APP和Windows上位機(jī)軟件,用戶可遠(yuǎn)程查看各項(xiàng)實(shí)時(shí)數(shù)據(jù),并可查看溫濕度、PH值、氮磷鉀含量等參數(shù)的歷史折線圖,輔助分析種植環(huán)境變化趨勢(shì)。

【3】項(xiàng)目硬件模塊組成

(1)主控模塊(STM32F103C8T6):負(fù)責(zé)系統(tǒng)各傳感器數(shù)據(jù)的采集、邏輯控制、顯示驅(qū)動(dòng)、通信管理等核心處理功能。

(2)土壤質(zhì)量檢測(cè)模塊(485接口傳感器):用于檢測(cè)土壤的PH值、溫度、濕度以及氮、磷、鉀三種化學(xué)元素的含量,通過RS-485接口與主控進(jìn)行數(shù)據(jù)通信。

(3)環(huán)境溫濕度檢測(cè)模塊(DHT11):用于實(shí)時(shí)監(jiān)測(cè)空氣中的溫度和濕度,數(shù)據(jù)通過單總線接口輸入主控芯片。

(4)環(huán)境光照檢測(cè)模塊(BH1750):采用IIC接口光照強(qiáng)度傳感器,檢測(cè)當(dāng)前環(huán)境的光照強(qiáng)度,為環(huán)境分析提供數(shù)據(jù)支持。

(5)自動(dòng)灌溉控制模塊(繼電器+抽水電機(jī)):根據(jù)土壤濕度自動(dòng)控制繼電器通斷,驅(qū)動(dòng)5V抽水電機(jī)進(jìn)行灌溉。

(6)OLED顯示模塊(0.96寸 IIC OLED):用于顯示土壤溫濕度、PH值、氮磷鉀含量、環(huán)境溫濕度、光照強(qiáng)度等各項(xiàng)數(shù)據(jù)。

(7)報(bào)警模塊(有源蜂鳴器:當(dāng)檢測(cè)到環(huán)境參數(shù)異常(如PH值、濕度等超出設(shè)定閾值)時(shí),蜂鳴器自動(dòng)響起進(jìn)行本地報(bào)警提示。

(8)通信模塊(Air780e 4G模塊):通過串口與主控連接,使用MQTT協(xié)議將采集數(shù)據(jù)上傳至華為云IOT物聯(lián)網(wǎng)平臺(tái),同時(shí)支持遠(yuǎn)程控制指令下發(fā)。

(9)電源管理與供電模塊(太陽能板+鋰電池+充電管理板):太陽能板為鋰電池充電,鋰電池為系統(tǒng)供電,實(shí)現(xiàn)野外無市電情況下的獨(dú)立供電。

(10)RS-485通信轉(zhuǎn)換模塊(TTL轉(zhuǎn)485模塊):用于主控STM32與土壤傳感器之間的RS-485信號(hào)通信轉(zhuǎn)換,確保穩(wěn)定可靠的數(shù)據(jù)傳輸

1.2 設(shè)計(jì)思路

本系統(tǒng)以STM32F103C8T6單片機(jī)作為核心控制器,圍繞土壤質(zhì)量監(jiān)測(cè)與智能管理展開,結(jié)合多種傳感器模塊和通信技術(shù),實(shí)現(xiàn)對(duì)農(nóng)業(yè)種植環(huán)境的全面感知與遠(yuǎn)程管理。系統(tǒng)設(shè)計(jì)注重功能的集成性、數(shù)據(jù)的實(shí)用性和部署的靈活性,適用于農(nóng)業(yè)種植中的精準(zhǔn)監(jiān)測(cè)需求。

系統(tǒng)采用集成式土壤質(zhì)量傳感器,通過RS-485接口實(shí)時(shí)采集土壤的PH值、溫度、濕度以及氮、磷、鉀三種主要養(yǎng)分的含量。這些關(guān)鍵參數(shù)為農(nóng)作物的種植提供科學(xué)依據(jù),幫助農(nóng)戶及時(shí)掌握土壤肥力和酸堿度等信息,優(yōu)化施肥和耕種策略。

為了獲取更全面的環(huán)境信息,系統(tǒng)還集成了DHT11環(huán)境溫濕度傳感器和BH1750光照傳感器,分別用于監(jiān)測(cè)空氣溫濕度和光照強(qiáng)度,進(jìn)一步輔助分析種植區(qū)域的氣候條件。這些數(shù)據(jù)與土壤信息共同構(gòu)成了完整的環(huán)境監(jiān)測(cè)體系。

在執(zhí)行控制方面,系統(tǒng)依據(jù)采集到的土壤濕度值,通過繼電器控制抽水電機(jī)自動(dòng)進(jìn)行灌溉,實(shí)現(xiàn)智能補(bǔ)水功能。這一設(shè)計(jì)不僅提升了灌溉的效率與精準(zhǔn)性,也避免了人為誤操作和資源浪費(fèi)。

系統(tǒng)通信模塊采用Air780e 4G模塊作為數(shù)據(jù)傳輸媒介,利用MQTT協(xié)議將采集到的各項(xiàng)數(shù)據(jù)實(shí)時(shí)上傳至華為云IOT物聯(lián)網(wǎng)服務(wù)器,保障數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性與可靠性。云平臺(tái)作為數(shù)據(jù)中心,支持歷史數(shù)據(jù)存儲(chǔ)、趨勢(shì)分析和遠(yuǎn)程指令下發(fā)。

用戶可通過Android手機(jī)APP或Windows上位機(jī)軟件,實(shí)時(shí)查看土壤和環(huán)境的當(dāng)前數(shù)據(jù)及歷史變化曲線,全面掌握種植區(qū)域的情況,實(shí)現(xiàn)遠(yuǎn)程可視化管理。同時(shí),每個(gè)設(shè)備為獨(dú)立節(jié)點(diǎn),可部署于不同區(qū)域,隨插隨用,方便擴(kuò)展。

系統(tǒng)還配備OLED本地顯示模塊和蜂鳴器報(bào)警模塊,實(shí)現(xiàn)數(shù)據(jù)的現(xiàn)場(chǎng)可視和異常告警,增強(qiáng)現(xiàn)場(chǎng)運(yùn)維的直觀性和安全性。此外,系統(tǒng)采用太陽能供電,結(jié)合鋰電池與充電管理電路,確保設(shè)備在野外環(huán)境下長(zhǎng)時(shí)間穩(wěn)定運(yùn)行。整體設(shè)計(jì)充分考慮了農(nóng)業(yè)現(xiàn)場(chǎng)的實(shí)用性、穩(wěn)定性與可擴(kuò)展性。

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

序號(hào) 功能名稱 功能描述
1 土壤PH值檢測(cè) 實(shí)時(shí)監(jiān)測(cè)土壤的酸堿度,通過RS-485接口采集PH值數(shù)據(jù)。
2 土壤溫濕度檢測(cè) 監(jiān)測(cè)土壤的溫度和濕度,反映土壤環(huán)境條件,指導(dǎo)灌溉與管理。
3 土壤氮磷鉀檢測(cè) 檢測(cè)土壤中氮、磷、鉀三種營(yíng)養(yǎng)元素的含量,輔助判斷土壤肥力。
4 環(huán)境溫濕度檢測(cè) 通過DHT11傳感器采集空氣中的溫度與濕度,了解外部環(huán)境變化。
5 自動(dòng)灌溉控制 根據(jù)土壤濕度自動(dòng)控制繼電器開關(guān),啟動(dòng)/關(guān)閉抽水電機(jī)進(jìn)行灌溉。
6 環(huán)境光照檢測(cè) 通過BH1750光敏傳感器檢測(cè)環(huán)境光照強(qiáng)度,為植物生長(zhǎng)和數(shù)據(jù)分析提供依據(jù)。
7 數(shù)據(jù)本地顯示 采用0.96寸OLED顯示屏實(shí)時(shí)顯示當(dāng)前各項(xiàng)土壤和環(huán)境數(shù)據(jù)。
8 異常蜂鳴器報(bào)警 當(dāng)某些檢測(cè)參數(shù)異常(如濕度過低、PH異常)時(shí)觸發(fā)蜂鳴器發(fā)出警報(bào)提示。
9 數(shù)據(jù)上傳至云平臺(tái) 利用Air780e模塊通過MQTT協(xié)議上傳數(shù)據(jù)至華為云IOT物聯(lián)網(wǎng)平臺(tái)。
10 手機(jī)APP遠(yuǎn)程查看 用戶可通過Android APP實(shí)時(shí)查看當(dāng)前數(shù)據(jù)與歷史變化趨勢(shì)。
11 電腦上位機(jī)查看 支持Windows平臺(tái)Qt上位機(jī)軟件,查看實(shí)時(shí)數(shù)據(jù)與歷史曲線,遠(yuǎn)程控制設(shè)備。
12 獨(dú)立設(shè)備部署支持 每個(gè)設(shè)備獨(dú)立運(yùn)行,支持多區(qū)域部署,隨插隨用,靈活采集不同區(qū)域數(shù)據(jù)。
13 太陽能供電 使用太陽能板為鋰電池充電,實(shí)現(xiàn)系統(tǒng)離網(wǎng)獨(dú)立供電,適用于野外場(chǎng)景。

1.4 開發(fā)工具的選擇

【1】設(shè)備端開發(fā)

硬件設(shè)備端的開發(fā)主要依賴于C語言,利用該語言直接操作硬件寄存器,確保系統(tǒng)運(yùn)行的高效性和低延遲。C語言在嵌入式開發(fā)中具有廣泛的應(yīng)用,它能夠直接訪問硬件,滿足對(duì)資源消耗和響應(yīng)速度的嚴(yán)格要求。為了編寫高效、穩(wěn)定的代碼,開發(fā)工具選擇了Keil uVision 5作為主要的開發(fā)環(huán)境。Keil是一個(gè)專業(yè)的嵌入式開發(fā)工具,廣泛應(yīng)用于基于ARM架構(gòu)微控制器(如STM32)開發(fā)。Keil提供了完善的調(diào)試、編譯和仿真支持,能夠幫助在軟件開發(fā)過程中高效地進(jìn)行調(diào)試、單步執(zhí)行以及斷點(diǎn)設(shè)置,確保開發(fā)的穩(wěn)定性和高效性。
STM32F103RCT6是項(xiàng)目中使用的主控芯片,它基于ARM Cortex-M3架構(gòu),擁有強(qiáng)大的計(jì)算能力和豐富的外設(shè)接口。在硬件編程中,寄存器級(jí)編程是常用的方式,這要求開發(fā)者對(duì)芯片的硬件寄存器有深入的理解。在Keil環(huán)境中,通過STM32的寄存器直接控制GPIO、ADC、I2CSPI等硬件接口,以滿足各個(gè)硬件模塊(如傳感器、執(zhí)行器、顯示屏等)與主控芯片的交互。使用寄存器編程能夠提供更高效、精確的控制,避免了外部庫(kù)的開銷,同時(shí)也能深入調(diào)控硬件特性,提升系統(tǒng)性能。

【2】上位機(jī)開發(fā)

本項(xiàng)目的上位機(jī)開發(fā)基于Qt 5框架,使用**C++**作為主要編程語言。Qt是一個(gè)跨平臺(tái)的應(yīng)用開發(fā)框架,廣泛用于開發(fā)GUI應(yīng)用程序。Qt提供了豐富的GUI組件和工具,能夠高效地實(shí)現(xiàn)圖形界面的設(shè)計(jì)與開發(fā)。C++則作為Qt的底層語言,具有高效的性能和良好的控制力,非常適合用于處理設(shè)備與系統(tǒng)之間的數(shù)據(jù)交互、通信協(xié)議的實(shí)現(xiàn)和復(fù)雜的計(jì)算任務(wù)。在項(xiàng)目中,Qt被用于開發(fā)Windows平臺(tái)的桌面應(yīng)用程序以及Android平臺(tái)的手機(jī)APP。Qt框架的跨平臺(tái)特性使得開發(fā)者能夠使用同一套代碼在不同操作系統(tǒng)上進(jìn)行構(gòu)建和部署,大大提高了開發(fā)效率。

為了方便開發(fā)和調(diào)試,上位機(jī)的開發(fā)采用了Qt Creator作為主要的集成開發(fā)環(huán)境(IDE)。Qt Creator是一款由Qt官方提供的開發(fā)工具,專為Qt應(yīng)用程序開發(fā)設(shè)計(jì),支持C++、QML和JavaScript等語言。Qt Creator提供了豐富的功能,如代碼編輯、調(diào)試、構(gòu)建、版本控制集成等,能夠顯著提升開發(fā)者的生產(chǎn)力。在本項(xiàng)目中,Qt Creator為開發(fā)者提供了自動(dòng)化構(gòu)建、界面設(shè)計(jì)工具(如Qt Designer)和調(diào)試工具(如QDebug和QML調(diào)試工具),使得開發(fā)過程更加高效和流暢。
上位機(jī)與硬件設(shè)備端的通信采用了基于TCP/IP協(xié)議的數(shù)據(jù)傳輸方式。為了實(shí)現(xiàn)這一功能,Qt提供了豐富的網(wǎng)絡(luò)編程支持,尤其是QTcpSocketQTcpServer類,使得上位機(jī)能夠輕松地與硬件設(shè)備建立TCP連接,進(jìn)行數(shù)據(jù)收發(fā)。上位機(jī)通過WIFI連接ESP8266-WIFI模塊,ESP8266模塊創(chuàng)建TCP服務(wù)器,上位機(jī)應(yīng)用則作為客戶端連接到服務(wù)器,進(jìn)行實(shí)時(shí)的數(shù)據(jù)傳輸與控制命令的下發(fā)。
為了滿足不同用戶的需求,本項(xiàng)目需要支持Windows平臺(tái)的桌面應(yīng)用和Android平臺(tái)的移動(dòng)APP。Qt的跨平臺(tái)特性使得開發(fā)人員能夠在一個(gè)代碼庫(kù)下完成多平臺(tái)應(yīng)用的開發(fā)和移植。開發(fā)者僅需要編寫一次應(yīng)用邏輯和用戶界面,就可以通過Qt的跨平臺(tái)構(gòu)建工具生成Windows和Android兩個(gè)平臺(tái)的可執(zhí)行文件。此外,Qt提供了豐富的文檔和社區(qū)支持,幫助開發(fā)者解決平臺(tái)差異和兼容性問題,確保應(yīng)用在不同平臺(tái)上都能穩(wěn)定運(yùn)行。

總體而言,上位機(jī)開發(fā)環(huán)境采用了Qt 5框架和C++語言,結(jié)合Qt Creator集成開發(fā)環(huán)境,提供了一個(gè)高效、穩(wěn)定、跨平臺(tái)的開發(fā)工具鏈。通過Qt強(qiáng)大的GUI設(shè)計(jì)、網(wǎng)絡(luò)通信、多線程支持以及數(shù)據(jù)庫(kù)管理功能,開發(fā)者能夠輕松實(shí)現(xiàn)與硬件設(shè)備的交互、控制設(shè)備、處理傳感器數(shù)據(jù),并為用戶提供直觀、流暢的操作體驗(yàn)。

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

【1】Aair780模塊

Air780E是合宙科技(Luat合宙)推出的一款低功耗、高性能的4G全網(wǎng)通通信模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)設(shè)備的數(shù)據(jù)傳輸場(chǎng)景中。該模塊基于紫光展銳芯片平臺(tái),具備優(yōu)異的通信性能、豐富的外圍接口和可靠的運(yùn)行環(huán)境,適用于智慧農(nóng)業(yè)、環(huán)境監(jiān)測(cè)、車載設(shè)備、工業(yè)控制等多種應(yīng)用領(lǐng)域。

Air780E支持4G LTE Cat.1網(wǎng)絡(luò)制式,兼容移動(dòng)、聯(lián)通、電信三大運(yùn)營(yíng)商的網(wǎng)絡(luò),具備全國(guó)廣覆蓋、低延遲、高速率的特點(diǎn),能夠滿足物聯(lián)網(wǎng)設(shè)備在各種環(huán)境下的數(shù)據(jù)上傳與下發(fā)需求。對(duì)于物聯(lián)網(wǎng)中的遠(yuǎn)程控制、云平臺(tái)數(shù)據(jù)交互等需求,該模塊提供了穩(wěn)定的蜂窩網(wǎng)絡(luò)通信保障。

該模塊內(nèi)置Luat OS系統(tǒng),支持Lua腳本開發(fā),也可以通過AT指令控制,開發(fā)靈活便捷,開發(fā)者可以快速構(gòu)建通信邏輯、MQTT協(xié)議棧、HTTP請(qǐng)求、TCP/UDP通信等功能。Air780E天然支持MQTT協(xié)議,可輕松對(duì)接華為云、阿里云、騰訊云等主流物聯(lián)網(wǎng)平臺(tái)。

在接口方面,Air780E提供了UART串口通信接口,方便與STM32等主控芯片通信連接。同時(shí)模塊還支持GPIO、ADC、PWM等常用接口資源,拓展能力強(qiáng)。它的工作電壓范圍通常為3.4V~4.2V,待機(jī)功耗極低,適合太陽能、鋰電池等低功耗供電場(chǎng)景。

Air780E是一個(gè)功能全面、開發(fā)簡(jiǎn)單、適配性強(qiáng)的4G模塊,非常適合用于STM32等嵌入式系統(tǒng)中,用作數(shù)據(jù)上傳、遠(yuǎn)程通信的核心通信模塊。它在土壤質(zhì)量監(jiān)測(cè)系統(tǒng)中的應(yīng)用,可以有效實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)遠(yuǎn)程上傳,提升系統(tǒng)的智能化水平和管理效率。

【2】BH1750模塊

BH1750是一款廣泛應(yīng)用于環(huán)境光照強(qiáng)度檢測(cè)的數(shù)字光照傳感器模塊。它采用I2C通信協(xié)議,能夠方便地與各種微控制器(如STM32)進(jìn)行數(shù)據(jù)交換,適合用于智能家居、農(nóng)業(yè)監(jiān)測(cè)、手機(jī)屏幕亮度調(diào)節(jié)等多種應(yīng)用場(chǎng)景。

該模塊內(nèi)部集成了高靈敏度的光敏傳感器和模數(shù)轉(zhuǎn)換器,可以直接輸出光照強(qiáng)度的數(shù)字值,單位為勒克斯(Lux),測(cè)量范圍通常在1到65535 Lux之間,覆蓋從微弱環(huán)境光到強(qiáng)烈陽光的廣泛光照條件。BH1750的高精度和高分辨率使其能夠準(zhǔn)確反映環(huán)境的光照變化。

BH1750模塊的I2C接口簡(jiǎn)化了硬件連接,僅需兩根線(SCL和SDA)即可實(shí)現(xiàn)數(shù)據(jù)通信,支持多主多從通信模式,且通訊速度最高可達(dá)400kHz(快速模式),這為系統(tǒng)設(shè)計(jì)提供了很大便利。模塊的工作電壓一般為3.3V或5V,功耗較低,適合電池供電的便攜設(shè)備。

在實(shí)際使用中,BH1750能夠快速響應(yīng)環(huán)境光線的變化,且具有良好的線性輸出特性,使得它能夠?yàn)楣庹?a class="article-link" target="_blank" href="/tag/%E6%8E%A7%E5%88%B6%E7%B3%BB%E7%BB%9F/">控制系統(tǒng)、自動(dòng)調(diào)光系統(tǒng)等提供可靠的數(shù)據(jù)支持。在農(nóng)業(yè)領(lǐng)域,BH1750可以幫助監(jiān)測(cè)光照強(qiáng)度,輔助判斷作物的生長(zhǎng)環(huán)境,從而指導(dǎo)補(bǔ)光設(shè)備的啟停和調(diào)節(jié)。

BH1750模塊結(jié)構(gòu)簡(jiǎn)單、精度高、易于集成,是實(shí)現(xiàn)環(huán)境光照檢測(cè)的理想選擇,能夠?yàn)橥寥蕾|(zhì)量監(jiān)測(cè)系統(tǒng)提供重要的光照數(shù)據(jù)支持,幫助系統(tǒng)更全面地感知種植環(huán)境。

【3】DHT11模塊

DHT11是一款常用的數(shù)字溫濕度傳感器模塊,廣泛應(yīng)用于環(huán)境監(jiān)測(cè)、智能家居、農(nóng)業(yè)種植等領(lǐng)域。它集成了溫度和濕度傳感器芯片,并內(nèi)置了專用的數(shù)字信號(hào)處理器,能夠直接輸出經(jīng)過校準(zhǔn)的數(shù)字信號(hào),方便微控制器進(jìn)行讀取和處理。

該模塊采用單總線數(shù)字通信接口,通過一個(gè)數(shù)據(jù)線即可實(shí)現(xiàn)與STM32等主控芯片的數(shù)據(jù)交換,硬件連接簡(jiǎn)單,軟件驅(qū)動(dòng)也較為容易實(shí)現(xiàn)。DHT11測(cè)量范圍適合一般環(huán)境需求,溫度測(cè)量范圍為050℃,濕度測(cè)量范圍為20%90%相對(duì)濕度,精度分別為±2℃和±5%RH,滿足一般農(nóng)業(yè)環(huán)境監(jiān)測(cè)的基本需求。

DHT11響應(yīng)速度較快,能夠?qū)崟r(shí)反映環(huán)境溫濕度的變化。其內(nèi)部帶有防干擾設(shè)計(jì),使得數(shù)據(jù)傳輸較為穩(wěn)定。模塊工作電壓為3.3V到5V,功耗較低,適合電池供電的嵌入式系統(tǒng)。

雖然DHT11的測(cè)量精度和范圍相較于高端傳感器略有不足,但其成本低廉、體積小巧、使用方便,使其成為許多中低端環(huán)境監(jiān)測(cè)項(xiàng)目的首選傳感器。在土壤質(zhì)量監(jiān)測(cè)系統(tǒng)中,DHT11用于檢測(cè)環(huán)境空氣的溫度和濕度,為系統(tǒng)提供輔助環(huán)境數(shù)據(jù),幫助實(shí)現(xiàn)更全面的環(huán)境感知與智能控制。

DHT11模塊是一款性價(jià)比高、易于集成的溫濕度傳感器,非常適合用于需要基礎(chǔ)環(huán)境監(jiān)測(cè)的嵌入式系統(tǒng)。

二、硬件選型(搭建模型參考)

如果大家想自己搭建模型,完成這個(gè)項(xiàng)目的功能測(cè)試。

那么可以看參考下面的部分硬件模塊選型。

  1. STM32F103C8T6單片機(jī)開發(fā)板 —— 作為主控芯片,負(fù)責(zé)整個(gè)系統(tǒng)的控制與數(shù)據(jù)處理。
  2. 0.96寸IIC接口OLED顯示屏 —— 實(shí)時(shí)顯示土壤及環(huán)境參數(shù)。
  3. Air780E 4G通信模塊 —— 用于通過MQTT協(xié)議連接華為云IOT服務(wù)器,實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)上傳和控制。
  4. 土壤質(zhì)量檢測(cè)傳感器(支持RS485接口) —— 用于檢測(cè)土壤的溫度、濕度、氮磷鉀含量和PH值。
  5. DHT11溫濕度傳感器 —— 用于監(jiān)測(cè)環(huán)境空氣的溫度和濕度。
  6. 繼電器模塊 —— 用于控制5V抽水電機(jī),實(shí)現(xiàn)自動(dòng)灌溉。
  7. 抽水電機(jī) —— 用于土壤的自動(dòng)灌溉。
  8. BH1750光照強(qiáng)度傳感器模塊 —— 用于環(huán)境光照強(qiáng)度檢測(cè)。
  9. 太陽能充電板 —— 太陽能供電系統(tǒng)中的光伏板,為鋰電池充電。
  10. 充電管理板(充電控制器) —— 負(fù)責(zé)太陽能電池板給鋰電池充電的管理與保護(hù)。
  11. 鋰電池組 —— 儲(chǔ)存太陽能電能,為系統(tǒng)供電。
  12. 電源管理電路 —— 穩(wěn)壓與保護(hù)電路,確保系統(tǒng)穩(wěn)定運(yùn)行。
  13. 電源連接線和接口 —— 連接太陽能板、鋰電池和系統(tǒng)主板的導(dǎo)線和接口。
  14. RS485通信接口轉(zhuǎn)換模塊 —— 用于土壤傳感器與STM32單片機(jī)之間的通信。
  15. PCB板或?qū)嶒?yàn)板 —— 用于硬件電路的焊接和組裝。
  16. 蜂鳴器模塊 —— 用于異常報(bào)警提示。

基于STM32的土壤質(zhì)量監(jiān)測(cè)系統(tǒng),上傳到華為云IoT平臺(tái)的數(shù)據(jù)字段包括以下內(nèi)容,覆蓋系統(tǒng)監(jiān)測(cè)的全部核心參數(shù)和狀態(tài)信息:

  1. soil_pH —— 土壤的pH值
  2. soil_temperature —— 土壤溫度(單位:℃)
  3. soil_humidity —— 土壤濕度(單位:%)
  4. soil_nitrogen —— 土壤中氮元素含量(單位:ppm或mg/kg,根據(jù)傳感器規(guī)格)
  5. soil_phosphorus —— 土壤中磷元素含量(單位:ppm或mg/kg)
  6. soil_potassium —— 土壤中鉀元素含量(單位:ppm或mg/kg)
  7. environment_temperature —— 環(huán)境空氣溫度(單位:℃)
  8. environment_humidity —— 環(huán)境空氣濕度(單位:%)
  9. light_intensity —— 環(huán)境光照強(qiáng)度(單位:Lux)
  10. water_pump_status —— 自動(dòng)灌溉狀態(tài)(如0表示關(guān)閉,1表示開啟)
  11. device_id —— 設(shè)備唯一標(biāo)識(shí),用于區(qū)分多個(gè)設(shè)備上傳的數(shù)據(jù)

這些字段基本涵蓋了系統(tǒng)所有關(guān)鍵監(jiān)測(cè)點(diǎn)和控制狀態(tài),上傳后可以通過云平臺(tái)實(shí)現(xiàn)遠(yuǎn)程監(jiān)控、歷史數(shù)據(jù)分析及設(shè)備管理。

三、部署華為云物聯(lián)網(wǎng)平臺(tái)

華為云官網(wǎng): https://www.huaweicloud.com/

打開官網(wǎng),搜索物聯(lián)網(wǎng),就能快速找到 設(shè)備接入IoTDA。

image-20221204193824815

3.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)大的開放能力,支撐行業(yè)用戶構(gòu)建各種物聯(lián)網(wǎng)解決方案。

設(shè)備可以通過固網(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)用通過調(diào)用物聯(lián)網(wǎng)平臺(tái)提供的API,實(shí)現(xiàn)設(shè)備數(shù)據(jù)采集、命令下發(fā)、設(shè)備管理等業(yè)務(wù)場(chǎng)景。

img

3.2 開通物聯(lián)網(wǎng)服務(wù)

地址: https://www.huaweicloud.com/product/iothub.html

image-20241028135834377

開通免費(fèi)單元。

image-20241028135935457

點(diǎn)擊立即創(chuàng)建。

image-20240117134653452

正在創(chuàng)建標(biāo)準(zhǔn)版實(shí)例,需要等待片刻。

image-20241028140048811

創(chuàng)建完成之后,點(diǎn)擊詳情。 可以看到標(biāo)準(zhǔn)版實(shí)例的設(shè)備接入端口和地址。

image-20241028140129102

下面框起來的就是端口號(hào)域名

image-20241028140229696

點(diǎn)擊實(shí)例名稱,可以查看當(dāng)前免費(fèi)單元的配置情況。

image-20241028140331523

image-20241028140428663

開通之后,點(diǎn)擊接入信息,也能查看接入信息。 我們當(dāng)前設(shè)備準(zhǔn)備采用MQTT協(xié)議接入華為云平臺(tái),這里可以看到MQTT協(xié)議的地址和端口號(hào)等信息。

image-20241028140511105

總結(jié):

端口號(hào):   MQTT (1883)| MQTTS (8883)    
接入地址: dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com

根據(jù)域名地址得到IP地址信息:

打開Windows電腦的命令行控制臺(tái)終端,使用ping 命令。ping一下即可。

Microsoft Windows [版本 10.0.19045.5011]
(c) Microsoft Corporation。保留所有權(quán)利。

C:UsersLenovo>ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com

正在 Ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字節(jié)的數(shù)據(jù):
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44

117.78.5.125 的 Ping 統(tǒng)計(jì)信息:
    數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計(jì)時(shí)間(以毫秒為單位):
    最短 = 37ms,最長(zhǎng) = 37ms,平均 = 37ms

C:UsersLenovo>

MQTT協(xié)議接入端口號(hào)有兩個(gè),1883是非加密端口,8883是證書加密端口,單片機(jī)無法加載證書,所以使用1883端口合適

3.3 創(chuàng)建產(chǎn)品

鏈接:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product?instanceId=03c5c68c-e588-458c-90c3-9e4c640be7af

(1)創(chuàng)建產(chǎn)品

image-20241028141601305

(2)填寫產(chǎn)品信息

根據(jù)自己產(chǎn)品名字填寫,下面的設(shè)備類型選擇自定義類型。

image-20240612094809689

(3)產(chǎn)品創(chuàng)建成功

image-20240612095148945

創(chuàng)建完成之后點(diǎn)擊查看詳情。

image-20240612095134263

(4)添加自定義模型

產(chǎn)品創(chuàng)建完成之后,點(diǎn)擊進(jìn)入產(chǎn)品詳情頁(yè)面,翻到最下面可以看到模型定義。

模型簡(jiǎn)單來說: 就是存放設(shè)備上傳到云平臺(tái)的數(shù)據(jù)。

你可以根據(jù)自己的產(chǎn)品進(jìn)行創(chuàng)建。

比如:

soil_pH —— 土壤的pH值

soil_temperature —— 土壤溫度(單位:℃)

soil_humidity —— 土壤濕度(單位:%)

soil_nitrogen —— 土壤中氮元素含量(單位:ppm或mg/kg,根據(jù)傳感器規(guī)格)

soil_phosphorus —— 土壤中磷元素含量(單位:ppm或mg/kg)

soil_potassium —— 土壤中鉀元素含量(單位:ppm或mg/kg)

environment_temperature —— 環(huán)境空氣溫度(單位:℃)

environment_humidity —— 環(huán)境空氣濕度(單位:%)

light_intensity —— 環(huán)境光照強(qiáng)度(單位:Lux)

water_pump_status —— 自動(dòng)灌溉狀態(tài)(如0表示關(guān)閉,1表示開啟)

device_id —— 設(shè)備唯一標(biāo)識(shí),用于區(qū)分多個(gè)設(shè)備上傳的數(shù)據(jù)

先點(diǎn)擊自定義模型。

image-20240612095517900

再創(chuàng)建一個(gè)服務(wù)ID。

image-20240612095542749

接著點(diǎn)擊新增屬性。

image-20240612095648815

image-20240612095711898

3.4 添加設(shè)備

產(chǎn)品是屬于上層的抽象模型,接下來在產(chǎn)品模型下添加實(shí)際的設(shè)備。添加的設(shè)備最終需要與真實(shí)的設(shè)備關(guān)聯(lián)在一起,完成數(shù)據(jù)交互。

(1)注冊(cè)設(shè)備

image-20240425181935561

(2)根據(jù)自己的設(shè)備填寫

image-20240612100115167

(3)保存設(shè)備信息

創(chuàng)建完畢之后,點(diǎn)擊保存并關(guān)閉,得到創(chuàng)建的設(shè)備密匙信息。該信息在后續(xù)生成MQTT三元組的時(shí)候需要使用。

image-20240612100128061

(4)設(shè)備創(chuàng)建完成

image-20240612100147232

(5)設(shè)備詳情

image-20240612100202960

image-20240612100217236

3.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是專門針對(duì)物聯(lián)網(wǎng)開發(fā)的輕量級(jí)傳輸協(xié)議。MQTT協(xié)議針對(duì)低帶寬網(wǎng)絡(luò),低計(jì)算能力的設(shè)備,做了特殊的優(yōu)化,使得其能適應(yīng)各種物聯(lián)網(wǎng)應(yīng)用場(chǎng)景。目前MQTT擁有各種平臺(tái)和設(shè)備上的客戶端,已經(jīng)形成了初步的生態(tài)系統(tǒng)。

MQTT是一種消息隊(duì)列協(xié)議,使用發(fā)布/訂閱消息模式,提供一對(duì)多的消息發(fā)布,解除應(yīng)用程序耦合,相對(duì)于其他協(xié)議,開發(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

img

業(yè)務(wù)流程:

img

(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ù) 無限制
單個(gè)設(shè)備每分鐘支持的最大MQTT連接數(shù) 1
單個(gè)MQTT連接每秒的吞吐量,即帶寬,包含直連設(shè)備和網(wǎng)關(guān) 3KB/s
MQTT單個(gè)發(fā)布消息最大長(zhǎng)度,超過此大小的發(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ù) 無限制

(3)主題訂閱格式

幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

image-20221207153310037

對(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è)備來說,主題發(fā)布表示向云平臺(tái)上傳數(shù)據(jù),將最新的傳感器數(shù)據(jù),設(shè)備狀態(tài)上傳到云平臺(tái)。

這個(gè)操作稱為:屬性上報(bào)。

幫助文檔地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html

image-20221207153637391

根據(jù)幫助文檔的介紹, 當(dāng)前設(shè)備發(fā)布主題,上報(bào)屬性的格式總結(jié)如下:

發(fā)布的主題格式:
$oc/devices/{device_id}/sys/properties/report
 
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
發(fā)布主題時(shí),需要上傳數(shù)據(jù),這個(gè)數(shù)據(jù)格式是JSON格式。

上傳的JSON數(shù)據(jù)格式如下:

{
  "services": [
    {
      "service_id": <填服務(wù)ID>,
      "properties": {
        "<填屬性名稱1>": <填屬性值>,
        "<填屬性名稱2>": <填屬性值>,
        ..........
      }
    }
  ]
}
根據(jù)JSON格式,一次可以上傳多個(gè)屬性字段。 這個(gè)JSON格式里的,服務(wù)ID,屬性字段名稱,屬性值類型,在前面創(chuàng)建產(chǎn)品的時(shí)候就已經(jīng)介紹了,不記得可以翻到前面去查看。

根據(jù)這個(gè)格式,組合一次上傳的屬性數(shù)據(jù):
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}

3.6 MQTT三元組

MQTT協(xié)議登錄需要填用戶ID,設(shè)備ID,設(shè)備密碼等信息,就像我們平時(shí)登錄QQ,微信一樣要輸入賬號(hào)密碼才能登錄。MQTT協(xié)議登錄的這3個(gè)參數(shù),一般稱為MQTT三元組。

接下來介紹,華為云平臺(tái)的MQTT三元組參數(shù)如何得到。

(1)MQTT服務(wù)器地址

要登錄MQTT服務(wù)器,首先記得先知道服務(wù)器的地址是多少,端口是多少。

幫助文檔地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home

image-20240509193207359

MQTT協(xié)議的端口支持1883和8883,它們的區(qū)別是:8883 是加密端口更加安全。但是單片機(jī)上使用比較困難,所以當(dāng)前的設(shè)備是采用1883端口進(jìn)連接的。

根據(jù)上面的域名和端口號(hào),得到下面的IP地址和端口號(hào)信息: 如果設(shè)備支持填寫域名可以直接填域名,不支持就直接填寫IP地址。 (IP地址就是域名解析得到的)

華為云的MQTT服務(wù)器地址:117.78.5.125
華為云的MQTT端口號(hào):1883

如何得到IP地址?如何域名轉(zhuǎn)IP? 打開Windows的命令行輸入以下命令。

ping  ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com

image-20240425182610048

(2)生成MQTT三元組

華為云提供了一個(gè)在線工具,用來生成MQTT鑒權(quán)三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

打開這個(gè)工具,填入設(shè)備的信息(也就是剛才創(chuàng)建完設(shè)備之后保存的信息),點(diǎn)擊生成,就可以得到MQTT的登錄信息了。

下面是打開的頁(yè)面:

image-20240425183025893

填入設(shè)備的信息: (上面兩行就是設(shè)備創(chuàng)建完成之后保存得到的)

直接得到三元組信息。

image-20240509193310020

得到三元組之后,設(shè)備端通過MQTT協(xié)議登錄鑒權(quán)的時(shí)候,填入?yún)?shù)即可。

ClientId  663cb18871d845632a0912e7_dev1_0_0_2024050911
Username  663cb18871d845632a0912e7_dev1
Password  71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237

3.7 模擬設(shè)備登錄測(cè)試

經(jīng)過上面的步驟介紹,已經(jīng)創(chuàng)建了產(chǎn)品,設(shè)備,數(shù)據(jù)模型,得到MQTT登錄信息。 接下來就用MQTT客戶端軟件模擬真實(shí)的設(shè)備來登錄平臺(tái)。測(cè)試與服務(wù)器通信是否正常。

MQTT軟件下載地址【免費(fèi)】: https://download.csdn.net/download/xiaolong1126626497/89928772

(1)填入登錄信息

打開MQTT客戶端軟件,對(duì)號(hào)填入相關(guān)信息(就是上面的文本介紹)。然后,點(diǎn)擊登錄,訂閱主題,發(fā)布主題。

image-20240509193457358

(2)打開網(wǎng)頁(yè)查看

完成上面的操作之后,打開華為云網(wǎng)頁(yè)后臺(tái),可以看到設(shè)備已經(jīng)在線了。

image-20240612100508790

點(diǎn)擊詳情頁(yè)面,可以看到上傳的數(shù)據(jù):

image-20240612100529581

到此,云平臺(tái)的部署已經(jīng)完成,設(shè)備已經(jīng)可以正常上傳數(shù)據(jù)了。

(3)MQTT登錄測(cè)試參數(shù)總結(jié)

MQTT服務(wù)器:  117.78.5.125
MQTT端口號(hào):  183

//物聯(lián)網(wǎng)服務(wù)器的設(shè)備信息
#define MQTT_ClientID "663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define MQTT_UserName "663cb18871d845632a0912e7_dev1"
#define MQTT_PassWord "71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"

//訂閱與發(fā)布的主題
#define SET_TOPIC  "$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down"  //訂閱
#define POST_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report"  //發(fā)布


發(fā)布的數(shù)據(jù):
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}

3.8 創(chuàng)建IAM賬戶

創(chuàng)建一個(gè)IAM賬戶,因?yàn)榻酉聛黹_發(fā)上位機(jī),需要使用云平臺(tái)的API接口,這些接口都需要token進(jìn)行鑒權(quán)。簡(jiǎn)單來說,就是身份的認(rèn)證。 調(diào)用接口獲取Token時(shí),就需要填寫IAM賬號(hào)信息。所以,接下來演示一下過程。

地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users

**【1】獲取項(xiàng)目憑證 ** 點(diǎn)擊左上角用戶名,選擇下拉菜單里的我的憑證

image-20240509193646253

image-20240509193701262

項(xiàng)目憑證:

28add376c01e4a61ac8b621c714bf459

【2】創(chuàng)建IAM用戶

鼠標(biāo)放在左上角頭像上,在下拉菜單里選擇統(tǒng)一身份認(rèn)證。

image-20240509193729078

點(diǎn)擊左上角創(chuàng)建用戶

image-20240509193744287

image-20240314153208692

image-20240314153228359

image-20240314153258229

創(chuàng)建成功:

image-20240314153315444

【3】創(chuàng)建完成

image-20240509193828289

用戶信息如下:

主用戶名  l19504562721
IAM用戶  ds_abc
密碼     DS12345678

3.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ù)
無論該設(shè)備是否在線,都可以通過該影子獲取和設(shè)置設(shè)備的屬性

簡(jiǎn)單來說:設(shè)備影子就是保存,設(shè)備最新上傳的一次數(shù)據(jù)。

我們?cè)O(shè)計(jì)的軟件里,如果想要獲取設(shè)備的最新狀態(tài)信息,就采用設(shè)備影子接口。

如果對(duì)接口不熟悉,可以先進(jìn)行在線調(diào)試:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow

在線調(diào)試接口,可以請(qǐng)求影子接口,了解請(qǐng)求,與返回的數(shù)據(jù)格式。

調(diào)試完成看右下角的響應(yīng)體,就是返回的影子數(shù)據(jù)。

image-20240509194152229

設(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)試成功之后,可以得到訪問影子數(shù)據(jù)的真實(shí)鏈接,接下來的代碼開發(fā)中,就采用Qt寫代碼訪問此鏈接,獲取影子數(shù)據(jù),完成上位機(jī)開發(fā)。

image-20240509194214716

鏈接如下:

https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow

3.10 訪問接口的代碼實(shí)現(xiàn)

(1)配置 Qt 項(xiàng)目

在 Qt 項(xiàng)目的 .pro 文件中,加入對(duì) libcurl 的支持:

QT += core
CONFIG += console
CONFIG -= app_bundle

INCLUDEPATH += /usr/include/curl  # 根據(jù)你的系統(tǒng)設(shè)置 libcurl 的路徑
LIBS += -lcurl  # 鏈接 libcurl 庫(kù)

SOURCES += main.cpp

(2)代碼實(shí)現(xiàn)

main.cpp 文件中實(shí)現(xiàn)代碼如下:

#include <QCoreApplication>
#include <curl/curl.h>
#include <QDebug>
#include <QString>
#include <QByteArray>

// 回調(diào)函數(shù),處理libcurl下載數(shù)據(jù)
size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
    size_t totalSize = size * nmemb;
    QByteArray *response = static_cast<QByteArray *>(userp);
    response->append(static_cast<char *>(contents), totalSize);
    return totalSize;
}

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

    // 初始化libcurl
    CURL *curl;
    CURLcode res;
    QByteArray responseData;  // 用于存儲(chǔ)響應(yīng)數(shù)據(jù)

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    if (curl) {
        // 設(shè)置訪問URL
        const QString url = "https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow";

        // 設(shè)置HTTP請(qǐng)求頭
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Authorization: Bearer <Your_Access_Token>"); // 這里需要替換為你的實(shí)際 token

        curl_easy_setopt(curl, CURLOPT_URL, url.toStdString().c_str());
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseData);

        // 發(fā)起GET請(qǐng)求
        res = curl_easy_perform(curl);

        if (res != CURLE_OK) {
            qDebug() << "Curl request failed:" << curl_easy_strerror(res);
        } else {
            qDebug() << "Response data:" << responseData;
        }

        // 清理
        curl_easy_cleanup(curl);
        curl_slist_free_all(headers);
    }

    curl_global_cleanup();

    return a.exec();
}

3.11 數(shù)據(jù)解析代碼

在 Qt 中使用 CJSON (一個(gè)用于解析 JSON 數(shù)據(jù)的輕量級(jí) C 庫(kù)) 來解析返回的 JSON 數(shù)據(jù)。

(1)配置 Qt 項(xiàng)目

在 Qt 項(xiàng)目的 .pro 文件中,確保包括了 CJSON 的頭文件,并鏈接 CJSON 的源代碼。

QT += core
CONFIG += console
CONFIG -= app_bundle

SOURCES += main.cpp 
           cJSON.c  # 將 cJSON.c 文件添加到你的項(xiàng)目中

INCLUDEPATH += path/to/cjson/  # 添加 CJSON 頭文件的路徑

LIBS += -lcurl  # 鏈接 libcurl 庫(kù)

(2)解析 JSON 數(shù)據(jù)的完整代碼

main.cpp 中,以下代碼展示了如何解析你提供的 JSON 數(shù)據(jù)。

#include <QCoreApplication>
#include <curl/curl.h>
#include <QDebug>
#include <QString>
#include <QByteArray>
#include "cJSON.h"

// 回調(diào)函數(shù),處理libcurl下載數(shù)據(jù)
size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
    size_t totalSize = size * nmemb;
    QByteArray *response = static_cast<QByteArray *>(userp);
    response->append(static_cast<char *>(contents), totalSize);
    return totalSize;
}

// 解析 JSON 數(shù)據(jù)
void parseJson(const QByteArray &data) {
    // 將 QByteArray 轉(zhuǎn)換為 char*
    const char* jsonData = data.constData();

    // 解析 JSON
    cJSON *root = cJSON_Parse(jsonData);
    if (root == NULL) {
        qDebug() << "Error parsing JSON.";
        return;
    }

    // 解析 "device_id"
    cJSON *deviceId = cJSON_GetObjectItemCaseSensitive(root, "device_id");
    if (cJSON_IsString(deviceId) && (deviceId->valuestring != NULL)) {
        qDebug() << "Device ID:" << deviceId->valuestring;
    }

    // 解析 "shadow" 數(shù)組
    cJSON *shadow = cJSON_GetObjectItemCaseSensitive(root, "shadow");
    if (cJSON_IsArray(shadow)) {
        cJSON *shadowItem = NULL;
        cJSON_ArrayForEach(shadowItem, shadow) {
            // 解析每個(gè) shadow 項(xiàng)目
            cJSON *serviceId = cJSON_GetObjectItemCaseSensitive(shadowItem, "service_id");
            if (cJSON_IsString(serviceId) && (serviceId->valuestring != NULL)) {
                qDebug() << "Service ID:" << serviceId->valuestring;
            }

            // 解析 "reported" 對(duì)象
            cJSON *reported = cJSON_GetObjectItemCaseSensitive(shadowItem, "reported");
            if (cJSON_IsObject(reported)) {
                // 解析 "properties" 對(duì)象
                cJSON *properties = cJSON_GetObjectItemCaseSensitive(reported, "properties");
                if (cJSON_IsObject(properties)) {
                    cJSON *data1 = cJSON_GetObjectItemCaseSensitive(properties, "data1");
                    if (cJSON_IsNumber(data1)) {
                        qDebug() << "data1:" << data1->valueint;
                    }
                    cJSON *data2 = cJSON_GetObjectItemCaseSensitive(properties, "data2");
                    if (cJSON_IsNumber(data2)) {
                        qDebug() << "data2:" << data2->valueint;
                    }
                    cJSON *data3 = cJSON_GetObjectItemCaseSensitive(properties, "data3");
                    if (cJSON_IsNumber(data3)) {
                        qDebug() << "data3:" << data3->valueint;
                    }
                    cJSON *data4 = cJSON_GetObjectItemCaseSensitive(properties, "data4");
                    if (cJSON_IsNumber(data4)) {
                        qDebug() << "data4:" << data4->valueint;
                    }
                }

                // 解析 "event_time"
                cJSON *eventTime = cJSON_GetObjectItemCaseSensitive(reported, "event_time");
                if (cJSON_IsString(eventTime) && (eventTime->valuestring != NULL)) {
                    qDebug() << "Event Time:" << eventTime->valuestring;
                }
            }

            // 解析 version
            cJSON *version = cJSON_GetObjectItemCaseSensitive(shadowItem, "version");
            if (cJSON_IsNumber(version)) {
                qDebug() << "Version:" << version->valueint;
            }
        }
    }

    // 釋放 JSON 對(duì)象
    cJSON_Delete(root);
}

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

    // 模擬獲取到的 JSON 數(shù)據(jù)
    QByteArray jsonData = R"(
    {
        "device_id": "663cb18871d845632a0912e7_dev1",
        "shadow": [
            {
                "service_id": "stm32",
                "desired": {
                    "properties": null,
                    "event_time": null
                },
                "reported": {
                    "properties": {
                        "data1": 18,
                        "data2": 90,
                        "data3": 38,
                        "data4": 70
                    },
                    "event_time": "20240509T113448Z"
                },
                "version": 3
            }
        ]
    })";

    // 調(diào)用解析函數(shù)
    parseJson(jsonData);

    return a.exec();
}

四、STM32設(shè)備端代碼設(shè)計(jì)

設(shè)計(jì)思路概述

系統(tǒng)啟動(dòng)后,先初始化各個(gè)硬件模塊(OLED、傳感器接口、4G模塊、繼電器、蜂鳴器等)。主循環(huán)中周期性讀取各傳感器數(shù)據(jù):土壤PH、溫濕度、氮磷鉀含量、環(huán)境溫濕度、光照強(qiáng)度。

根據(jù)讀取的土壤濕度,判斷是否啟動(dòng)灌溉繼電器進(jìn)行補(bǔ)水。同時(shí)檢測(cè)數(shù)據(jù)是否超出異常閾值,異常時(shí)觸發(fā)蜂鳴器報(bào)警。

實(shí)時(shí)數(shù)據(jù)在OLED屏上顯示,并將數(shù)據(jù)組包,通過MQTT協(xié)議經(jīng)Air780e 4G模塊上傳至華為云IoT平臺(tái)。

系統(tǒng)支持多設(shè)備獨(dú)立運(yùn)行,設(shè)備ID需唯一。

main.c示例代碼

#include "stm32f10x.h"
#include "oled.h"
#include "bh1750.h"
#include "dht11.h"
#include "soil_sensor.h"      // 土壤485傳感器讀取相關(guān)函數(shù)
#include "air780e_mqtt.h"     // 4G模塊MQTT通信函數(shù)
#include "relay.h"
#include "buzzer.h"
#include "delay.h"
#include <stdio.h>

// 設(shè)備ID定義
#define DEVICE_ID "soil_monitor_001"

// 土壤濕度閾值,低于該值啟動(dòng)灌溉
#define SOIL_HUMIDITY_THRESHOLD 40  

// 報(bào)警閾值(示例,實(shí)際需調(diào)試確認(rèn))
#define PH_LOW_THRESHOLD 5.5
#define PH_HIGH_THRESHOLD 7.5
#define NITROGEN_HIGH_THRESHOLD 1500
#define PHOSPHORUS_HIGH_THRESHOLD 1000
#define POTASSIUM_HIGH_THRESHOLD 1200

// 定時(shí)讀取間隔(ms)
#define READ_INTERVAL 5000  

// 數(shù)據(jù)結(jié)構(gòu)
typedef struct {
    float soil_pH;
    float soil_temperature;
    float soil_humidity;
    float soil_nitrogen;
    float soil_phosphorus;
    float soil_potassium;
    float env_temperature;
    float env_humidity;
    uint16_t light_intensity;
} SoilData;

SoilData soilData;

// 函數(shù)聲明
void System_Init(void);
void Read_Sensors(SoilData* data);
void Display_Data(const SoilData* data);
void Control_Watering(float soil_humidity);
void Check_Alarm(const SoilData* data);
void Upload_Data_MQTT(const SoilData* data);

int main(void)
{
    System_Init();

    while(1)
    {
        Read_Sensors(&soilData);

        Display_Data(&soilData);

        Control_Watering(soilData.soil_humidity);

        Check_Alarm(&soilData);

        Upload_Data_MQTT(&soilData);

        Delay_ms(READ_INTERVAL);
    }
}

// 系統(tǒng)初始化
void System_Init(void)
{
    // 初始化時(shí)鐘系統(tǒng)
    SystemInit();

    // 初始化延時(shí)函數(shù)
    Delay_Init();

    // 初始化OLED顯示
    OLED_Init();

    // 初始化土壤傳感器485接口
    SoilSensor_Init();

    // 初始化DHT11環(huán)境溫濕度傳感器
    DHT11_Init();

    // 初始化BH1750光照傳感器
    BH1750_Init();

    // 初始化繼電器(控制水泵)
    Relay_Init();

    // 初始化蜂鳴器
    Buzzer_Init();

    // 初始化4G模塊MQTT
    Air780e_MQTT_Init(DEVICE_ID);

    OLED_Clear();
    OLED_ShowString(0,0,(uint8_t *)"Soil Monitor Init",16);
    Delay_ms(1000);
}

// 讀取所有傳感器數(shù)據(jù)
void Read_Sensors(SoilData* data)
{
    // 讀取土壤485傳感器,獲取PH、溫度、濕度、氮磷鉀
    SoilSensor_Read(&data->soil_pH, &data->soil_temperature, &data->soil_humidity,
                    &data->soil_nitrogen, &data->soil_phosphorus, &data->soil_potassium);

    // 讀取環(huán)境溫濕度DHT11
    DHT11_Read(&data->env_temperature, &data->env_humidity);

    // 讀取光照強(qiáng)度BH1750
    data->light_intensity = BH1750_ReadLightIntensity();
}

// OLED顯示數(shù)據(jù)
void Display_Data(const SoilData* data)
{
    char buf[32];

    OLED_Clear();
    sprintf(buf, "pH: %.2f", data->soil_pH);
    OLED_ShowString(0,0,(uint8_t*)buf,16);

    sprintf(buf, "Soil T: %.1fC", data->soil_temperature);
    OLED_ShowString(0,16,(uint8_t*)buf,16);

    sprintf(buf, "Soil H: %.1f%%", data->soil_humidity);
    OLED_ShowString(0,32,(uint8_t*)buf,16);

    sprintf(buf, "N:%d P:%d K:%d", (int)data->soil_nitrogen, (int)data->soil_phosphorus, (int)data->soil_potassium);
    OLED_ShowString(0,48,(uint8_t*)buf,16);

    // 根據(jù)需要,循環(huán)顯示環(huán)境數(shù)據(jù)等
}

// 根據(jù)土壤濕度控制灌溉繼電器
void Control_Watering(float soil_humidity)
{
    if(soil_humidity < SOIL_HUMIDITY_THRESHOLD)
    {
        Relay_On();  // 打開水泵灌溉
    }
    else
    {
        Relay_Off(); // 關(guān)閉水泵
    }
}

// 異常情況報(bào)警檢測(cè)
void Check_Alarm(const SoilData* data)
{
    uint8_t alarm_flag = 0;

    if(data->soil_pH < PH_LOW_THRESHOLD || data->soil_pH > PH_HIGH_THRESHOLD)
        alarm_flag = 1;
    if(data->soil_nitrogen > NITROGEN_HIGH_THRESHOLD)
        alarm_flag = 1;
    if(data->soil_phosphorus > PHOSPHORUS_HIGH_THRESHOLD)
        alarm_flag = 1;
    if(data->soil_potassium > POTASSIUM_HIGH_THRESHOLD)
        alarm_flag = 1;

    if(alarm_flag)
    {
        Buzzer_On();
    }
    else
    {
        Buzzer_Off();
    }
}

// 數(shù)據(jù)上傳至云端(通過MQTT協(xié)議)
void Upload_Data_MQTT(const SoilData* data)
{
    // 構(gòu)造JSON格式字符串上傳
    char json_data[256];
    sprintf(json_data,
            "{"device_id":"%s","
            ""soil_pH":%.2f,"
            ""soil_temperature":%.2f,"
            ""soil_humidity":%.2f,"
            ""soil_nitrogen":%.2f,"
            ""soil_phosphorus":%.2f,"
            ""soil_potassium":%.2f,"
            ""environment_temperature":%.2f,"
            ""environment_humidity":%.2f,"
            ""light_intensity":%d}",
            DEVICE_ID,
            data->soil_pH,
            data->soil_temperature,
            data->soil_humidity,
            data->soil_nitrogen,
            data->soil_phosphorus,
            data->soil_potassium,
            data->env_temperature,
            data->env_humidity,
            data->light_intensity);

    Air780e_MQTT_Publish("soil_monitor/topic", json_data);
}

代碼說明

  • System_Init()函數(shù)負(fù)責(zé)初始化所有硬件模塊。
  • Read_Sensors()周期性讀取土壤傳感器、DHT11和BH1750數(shù)據(jù)。
  • Display_Data()負(fù)責(zé)在OLED屏幕上實(shí)時(shí)顯示關(guān)鍵數(shù)據(jù)。
  • Control_Watering()根據(jù)土壤濕度自動(dòng)控制繼電器驅(qū)動(dòng)抽水電機(jī)灌溉。
  • Check_Alarm()根據(jù)預(yù)設(shè)閾值判斷是否異常,觸發(fā)蜂鳴器報(bào)警。
  • Upload_Data_MQTT()將傳感器數(shù)據(jù)封裝成JSON字符串,通過Air780e的MQTT協(xié)議上傳至華為云IoT平臺(tái)。

這個(gè)main.c結(jié)構(gòu)清晰,模塊職責(zé)分明,方便維護(hù)和擴(kuò)展。大家可根據(jù)實(shí)際驅(qū)動(dòng)庫(kù)函數(shù)名和具體硬件接口,調(diào)整調(diào)用細(xì)節(jié)。這樣可以保證整體系統(tǒng)邏輯完整、數(shù)據(jù)及時(shí)準(zhǔn)確上傳,并且本地交互友好。

五、上位機(jī)開發(fā)

為了方便查看設(shè)備上傳的數(shù)據(jù),接下來利用Qt開發(fā)一款A(yù)ndroid手機(jī)APP 和 Windows上位機(jī)。

使用華為云平臺(tái)提供的API接口獲取設(shè)備上傳的數(shù)據(jù),進(jìn)行可視化顯示,以及遠(yuǎn)程控制設(shè)備。

5.1 Qt開發(fā)環(huán)境安裝

Qt的中文官網(wǎng): https://www.qt.io/zh-cn/image-20221207160550486

image-20221207160606892

QT5.12.6的下載地址:https://download.qt.io/archive/qt/5.12/5.12.6

打開下載鏈接后選擇下面的版本進(jìn)行下載:

如果下載不了,可以在網(wǎng)盤里找到安裝包下載: https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink

軟件安裝時(shí)斷網(wǎng)安裝,否則會(huì)提示輸入賬戶。

安裝的時(shí)候,第一個(gè)復(fù)選框里的編譯器可以全選,直接點(diǎn)擊下一步繼續(xù)安裝。

image-20221203151742653

選擇編譯器: (一定要看清楚了)

image-20241028152725134

前面2講解了需要用的API接口,接下來就使用Qt設(shè)計(jì)上位機(jī),設(shè)計(jì)界面,完成整體上位機(jī)的邏輯設(shè)計(jì)。

【1】新建工程

image-20240117144052547

【2】設(shè)置項(xiàng)目的名稱。

image-20241112142627805

【3】選擇編譯系統(tǒng)

image-20240117144239681

【4】選擇默認(rèn)繼承的類

image-20240117144302275

【5】選擇編譯器

image-20241028153603487

【6】點(diǎn)擊完成

image-20240117144354252

【7】工程創(chuàng)建完成

image-20241112142836874

5.3 切換編譯器

在左下角是可以切換編譯器的。 可以選擇用什么樣的編譯器編譯程序。

目前新建工程的時(shí)候選擇了2種編譯器。 一種是mingw32這個(gè)編譯Windows下運(yùn)行的程序。 一種是Android編譯器,可以生成Android手機(jī)APP。

不過要注意:Android的編譯器需要配置一些環(huán)境才可以正常使用,這個(gè)大家可以看下面的教程配置一下就行了。

Android環(huán)境搭建的博客鏈接: https://blog.csdn.net/xiaolong1126626497/article/details/117254453

windows的編譯器就沒有這么麻煩,安裝好Qt就可以編譯使用。

下面我這里就選擇的 mingw32這個(gè)編譯器,編譯Windows下運(yùn)行的程序。

image-20241112142912481

5.4 編譯測(cè)試功能

創(chuàng)建完畢之后,編譯測(cè)試一下功能是否OK。

點(diǎn)擊左下角的綠色三角形按鈕。

正常運(yùn)行就可以看到彈出一個(gè)白色的框框。這就表示工程環(huán)境沒有問題了。 接下來就可以放心的設(shè)計(jì)界面了。

image-20241112142939735

5.5 設(shè)計(jì)UI界面與工程配置

【1】打開UI文件

image-20241112143019233

打開默認(rèn)的界面如下:

image-20240425194845233

【2】開始設(shè)計(jì)界面

根據(jù)自己需求設(shè)計(jì)界面。

5.5 編譯Windows上位機(jī)

點(diǎn)擊軟件左下角的綠色三角形按鈕進(jìn)行編譯運(yùn)行。

image-20241112153656462

5.6 配置Android環(huán)境

如果想編譯Android手機(jī)APP,必須要先自己配置好自己的Android環(huán)境。(搭建環(huán)境的過程可以自行百度搜索學(xué)習(xí))

然后才可以進(jìn)行下面的步驟。

【1】選擇Android編譯器

選擇編譯器。

image-20240425232651515

切換編譯器。

image-20241112153812833

【2】創(chuàng)建Android配置文件

image-20240117144604025

image-20240117144635052

image-20240117144652014

創(chuàng)建完成。

image-20241112153851571

【3】配置Android圖標(biāo)與名稱

image-20241113114730689

【3】編譯Android上位機(jī)

Qt本身是跨平臺(tái)的,直接選擇Android的編譯器,就可以將程序編譯到Android平臺(tái)。

然后點(diǎn)擊構(gòu)建。

image-20241112154026342

成功之后,在目錄下可以看到生成的apk文件,也就是Android手機(jī)的安裝包,電腦端使用QQ發(fā)送給手機(jī)QQ,手機(jī)登錄QQ接收,就能直接安裝。

生成的apk的目錄在哪里呢? 編譯完成之后,在控制臺(tái)會(huì)輸出APK文件的路徑。

知道目錄在哪里之后,在Windows的文件資源管理器里,找到路徑,具體看下圖,找到生成的apk文件。

image-20241112154142209

  -- File: D:/QtProject/build-265_AgritechIoTManager-Android_for_arm64_v8a_Clang_Qt_5_12_6_for_Android_ARM64_v8a-Release/android-build//build/outputs/apk/debug/android-build-debug.apk

六、總結(jié)

本文介紹了基于STM32單片機(jī)的土壤質(zhì)量監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。系統(tǒng)通過多種傳感器對(duì)土壤的PH值、溫濕度、氮磷鉀含量以及環(huán)境的溫濕度和光照強(qiáng)度進(jìn)行實(shí)時(shí)監(jiān)測(cè),并結(jié)合自動(dòng)灌溉功能,有效提升了土壤管理的智能化水平。采用Air780e 4G模塊實(shí)現(xiàn)了數(shù)據(jù)的遠(yuǎn)程上傳與云端管理,配合OLED本地顯示和蜂鳴器報(bào)警,確保系統(tǒng)具備良好的交互性和實(shí)時(shí)響應(yīng)能力。此外,系統(tǒng)支持太陽能供電,提升了設(shè)備的適用環(huán)境范圍和續(xù)航能力。通過本項(xiàng)目的開發(fā),驗(yàn)證了嵌入式技術(shù)物聯(lián)網(wǎng)技術(shù)在現(xiàn)代農(nóng)業(yè)環(huán)境監(jiān)測(cè)中的應(yīng)用價(jià)值,為智慧農(nóng)業(yè)的發(fā)展提供了有力的技術(shù)支持和實(shí)踐參考。

  • 更多詳細(xì)資料請(qǐng)聯(lián)系.docx
    下載

相關(guān)推薦