一、前言
1.1 項(xiàng)目介紹
【1】項(xiàng)目開(kāi)發(fā)背景
隨著現(xiàn)代農(nóng)業(yè)的快速發(fā)展,傳統(tǒng)依賴經(jīng)驗(yàn)的耕作方式已逐漸無(wú)法滿足精細(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)境污染。
近年來(lái),隨著物聯(lián)網(wǎng)、傳感器技術(shù)、嵌入式系統(tǒng)以及無(wú)線通信的不斷發(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è)備開(kāi)發(fā)的理想平臺(tái)。通過(guò)集成多種傳感器模塊,實(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通信模塊,通過(guò)MQTT協(xié)議與華為云IoT物聯(lián)網(wǎng)平臺(tái)進(jìn)行數(shù)據(jù)通信。平臺(tái)可對(duì)來(lái)自多個(gè)終端的監(jiān)測(cè)數(shù)據(jù)進(jìn)行集中管理,實(shí)現(xiàn)不同種植區(qū)域設(shè)備的分布式部署與統(tǒng)一云端接入。用戶可通過(guò)Android手機(jī)APP或Windows上位機(jī)軟件遠(yuǎn)程查看實(shí)時(shí)參數(shù)和歷史折線圖,全面掌握各類環(huán)境變化趨勢(shì),提升管理的科學(xué)性與前瞻性。
為增強(qiáng)系統(tǒng)的實(shí)用性與可持續(xù)運(yùn)行能力,設(shè)備采用太陽(yáng)能供電方案,實(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ù)支撐。
【2】設(shè)計(jì)實(shí)現(xiàn)的功能
(1)土壤PH檢測(cè)功能:通過(guò)485接口的多合一土壤質(zhì)量傳感器,實(shí)時(shí)檢測(cè)當(dāng)前土壤的PH值,評(píng)估土壤酸堿度,輔助判斷土壤是否適合當(dāng)前作物生長(zhǎng)。
(2)土壤溫度、濕度檢測(cè)功能:傳感器可同步檢測(cè)土壤的溫度和含水量,結(jié)合灌溉邏輯,實(shí)現(xiàn)精準(zhǔn)水分管理,防止干旱或過(guò)濕。
(3)土壤氮磷鉀含量檢測(cè)功能:檢測(cè)土壤中氮、磷、鉀三種關(guān)鍵營(yíng)養(yǎng)元素的含量,為科學(xué)施肥提供數(shù)據(jù)支持,避免營(yíng)養(yǎng)過(guò)?;虿蛔恪?/p>
(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)灌溉,通過(guò)繼電器控制5V抽水電機(jī)精準(zhǔn)補(bǔ)水。
(6)環(huán)境光照強(qiáng)度檢測(cè)功能:通過(guò)BH1750光照傳感器采集當(dāng)前環(huán)境光強(qiáng)數(shù)據(jù),為作物生長(zhǎng)光照管理和農(nóng)業(yè)作業(yè)時(shí)間安排提供參考。
(7)數(shù)據(jù)上云功能:利用Air780e 4G模塊,通過(guò)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)太陽(yáng)能供電功能:通過(guò)太陽(yáng)能充電板、鋰電池及充電管理電路,實(shí)現(xiàn)全天候獨(dú)立供電,適用于無(wú)市電或野外種植環(huán)境。
(11)多設(shè)備部署與獨(dú)立運(yùn)行功能:支持多個(gè)設(shè)備同時(shí)部署在不同區(qū)域,每個(gè)設(shè)備作為獨(dú)立節(jié)點(diǎn)采集數(shù)據(jù)并上傳至云端,互不干擾,隨插隨用。
(12)遠(yuǎn)程查看與趨勢(shì)分析功能:通過(guò)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é)元素的含量,通過(guò)RS-485接口與主控進(jìn)行數(shù)據(jù)通信。
(3)環(huán)境溫濕度檢測(cè)模塊(DHT11):用于實(shí)時(shí)監(jiān)測(cè)空氣中的溫度和濕度,數(shù)據(jù)通過(guò)單總線接口輸入主控芯片。
(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模塊):通過(guò)串口與主控連接,使用MQTT協(xié)議將采集數(shù)據(jù)上傳至華為云IOT物聯(lián)網(wǎng)平臺(tái),同時(shí)支持遠(yuǎn)程控制指令下發(fā)。
(9)電源管理與供電模塊(太陽(yáng)能板+鋰電池+充電管理板):太陽(yáng)能板為鋰電池充電,鋰電池為系統(tǒng)供電,實(shí)現(xiàn)野外無(wú)市電情況下的獨(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è)與智能管理展開(kāi),結(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ì)量傳感器,通過(guò)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ù)采集到的土壤濕度值,通過(guò)繼電器控制抽水電機(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ā)。
用戶可通過(guò)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)采用太陽(yá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è)土壤的酸堿度,通過(guò)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è) | 通過(guò)DHT11傳感器采集空氣中的溫度與濕度,了解外部環(huán)境變化。 |
5 | 自動(dòng)灌溉控制 | 根據(jù)土壤濕度自動(dòng)控制繼電器開(kāi)關(guān),啟動(dòng)/關(guān)閉抽水電機(jī)進(jìn)行灌溉。 |
6 | 環(huán)境光照檢測(cè) | 通過(guò)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ù)異常(如濕度過(guò)低、PH異常)時(shí)觸發(fā)蜂鳴器發(fā)出警報(bào)提示。 |
9 | 數(shù)據(jù)上傳至云平臺(tái) | 利用Air780e模塊通過(guò)MQTT協(xié)議上傳數(shù)據(jù)至華為云IOT物聯(lián)網(wǎng)平臺(tái)。 |
10 | 手機(jī)APP遠(yuǎn)程查看 | 用戶可通過(guò)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 | 太陽(yáng)能供電 | 使用太陽(yáng)能板為鋰電池充電,實(shí)現(xiàn)系統(tǒng)離網(wǎng)獨(dú)立供電,適用于野外場(chǎng)景。 |
1.4 開(kāi)發(fā)工具的選擇
【1】設(shè)備端開(kāi)發(fā)
硬件設(shè)備端的開(kāi)發(fā)主要依賴于C語(yǔ)言,利用該語(yǔ)言直接操作硬件寄存器,確保系統(tǒng)運(yùn)行的高效性和低延遲。C語(yǔ)言在嵌入式開(kāi)發(fā)中具有廣泛的應(yīng)用,它能夠直接訪問(wèn)硬件,滿足對(duì)資源消耗和響應(yīng)速度的嚴(yán)格要求。為了編寫(xiě)高效、穩(wěn)定的代碼,開(kāi)發(fā)工具選擇了Keil uVision 5作為主要的開(kāi)發(fā)環(huán)境。Keil是一個(gè)專業(yè)的嵌入式開(kāi)發(fā)工具,廣泛應(yīng)用于基于ARM架構(gòu)的微控制器(如STM32)開(kāi)發(fā)。Keil提供了完善的調(diào)試、編譯和仿真支持,能夠幫助在軟件開(kāi)發(fā)過(guò)程中高效地進(jìn)行調(diào)試、單步執(zhí)行以及斷點(diǎn)設(shè)置,確保開(kāi)發(fā)的穩(wěn)定性和高效性。
STM32F103RCT6是項(xiàng)目中使用的主控芯片,它基于ARM Cortex-M3架構(gòu),擁有強(qiáng)大的計(jì)算能力和豐富的外設(shè)接口。在硬件編程中,寄存器級(jí)編程是常用的方式,這要求開(kāi)發(fā)者對(duì)芯片的硬件寄存器有深入的理解。在Keil環(huán)境中,通過(guò)STM32的寄存器直接控制GPIO、ADC、I2C、SPI等硬件接口,以滿足各個(gè)硬件模塊(如傳感器、執(zhí)行器、顯示屏等)與主控芯片的交互。使用寄存器編程能夠提供更高效、精確的控制,避免了外部庫(kù)的開(kāi)銷,同時(shí)也能深入調(diào)控硬件特性,提升系統(tǒng)性能。
【2】上位機(jī)開(kāi)發(fā)
本項(xiàng)目的上位機(jī)開(kāi)發(fā)基于Qt 5框架,使用**C++**作為主要編程語(yǔ)言。Qt是一個(gè)跨平臺(tái)的應(yīng)用開(kāi)發(fā)框架,廣泛用于開(kāi)發(fā)GUI應(yīng)用程序。Qt提供了豐富的GUI組件和工具,能夠高效地實(shí)現(xiàn)圖形界面的設(shè)計(jì)與開(kāi)發(fā)。C++則作為Qt的底層語(yǔ)言,具有高效的性能和良好的控制力,非常適合用于處理設(shè)備與系統(tǒng)之間的數(shù)據(jù)交互、通信協(xié)議的實(shí)現(xiàn)和復(fù)雜的計(jì)算任務(wù)。在項(xiàng)目中,Qt被用于開(kāi)發(fā)Windows平臺(tái)的桌面應(yīng)用程序以及Android平臺(tái)的手機(jī)APP。Qt框架的跨平臺(tái)特性使得開(kāi)發(fā)者能夠使用同一套代碼在不同操作系統(tǒng)上進(jìn)行構(gòu)建和部署,大大提高了開(kāi)發(fā)效率。
為了方便開(kāi)發(fā)和調(diào)試,上位機(jī)的開(kāi)發(fā)采用了Qt Creator作為主要的集成開(kāi)發(fā)環(huán)境(IDE)。Qt Creator是一款由Qt官方提供的開(kāi)發(fā)工具,專為Qt應(yīng)用程序開(kāi)發(fā)設(shè)計(jì),支持C++、QML和JavaScript等語(yǔ)言。Qt Creator提供了豐富的功能,如代碼編輯、調(diào)試、構(gòu)建、版本控制集成等,能夠顯著提升開(kāi)發(fā)者的生產(chǎn)力。在本項(xiàng)目中,Qt Creator為開(kāi)發(fā)者提供了自動(dòng)化構(gòu)建、界面設(shè)計(jì)工具(如Qt Designer)和調(diào)試工具(如QDebug和QML調(diào)試工具),使得開(kāi)發(fā)過(guò)程更加高效和流暢。
上位機(jī)與硬件設(shè)備端的通信采用了基于TCP/IP協(xié)議的數(shù)據(jù)傳輸方式。為了實(shí)現(xiàn)這一功能,Qt提供了豐富的網(wǎng)絡(luò)編程支持,尤其是QTcpSocket和QTcpServer類,使得上位機(jī)能夠輕松地與硬件設(shè)備建立TCP連接,進(jìn)行數(shù)據(jù)收發(fā)。上位機(jī)通過(guò)WIFI連接ESP8266-WIFI模塊,ESP8266模塊創(chuàng)建TCP服務(wù)器,上位機(jī)應(yīng)用則作為客戶端連接到服務(wù)器,進(jìn)行實(shí)時(shí)的數(shù)據(jù)傳輸與控制命令的下發(fā)。
為了滿足不同用戶的需求,本項(xiàng)目需要支持Windows平臺(tái)的桌面應(yīng)用和Android平臺(tái)的移動(dòng)APP。Qt的跨平臺(tái)特性使得開(kāi)發(fā)人員能夠在一個(gè)代碼庫(kù)下完成多平臺(tái)應(yīng)用的開(kāi)發(fā)和移植。開(kāi)發(fā)者僅需要編寫(xiě)一次應(yīng)用邏輯和用戶界面,就可以通過(guò)Qt的跨平臺(tái)構(gòu)建工具生成Windows和Android兩個(gè)平臺(tái)的可執(zhí)行文件。此外,Qt提供了豐富的文檔和社區(qū)支持,幫助開(kāi)發(fā)者解決平臺(tái)差異和兼容性問(wèn)題,確保應(yīng)用在不同平臺(tái)上都能穩(wěn)定運(yùn)行。
總體而言,上位機(jī)開(kāi)發(fā)環(huán)境采用了Qt 5框架和C++語(yǔ)言,結(jié)合Qt Creator集成開(kāi)發(fā)環(huán)境,提供了一個(gè)高效、穩(wěn)定、跨平臺(tái)的開(kāi)發(fā)工具鏈。通過(guò)Qt強(qiáng)大的GUI設(shè)計(jì)、網(wǎng)絡(luò)通信、多線程支持以及數(shù)據(jù)庫(kù)管理功能,開(kāi)發(fā)者能夠輕松實(shí)現(xiàn)與硬件設(shè)備的交互、控制設(shè)備、處理傳感器數(shù)據(jù),并為用戶提供直觀、流暢的操作體驗(yàn)。
1.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腳本開(kāi)發(fā),也可以通過(guò)AT指令控制,開(kāi)發(fā)靈活便捷,開(kāi)發(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ī)功耗極低,適合太陽(yáng)能、鋰電池等低功耗供電場(chǎng)景。
Air780E是一個(gè)功能全面、開(kāi)發(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)烈陽(yá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)過(guò)校準(zhǔn)的數(shù)字信號(hào),方便微控制器進(jìn)行讀取和處理。
該模塊采用單總線數(shù)字通信接口,通過(guò)一個(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ī)開(kāi)發(fā)板 —— 作為主控芯片,負(fù)責(zé)整個(gè)系統(tǒng)的控制與數(shù)據(jù)處理。
2.?0.96寸IIC接口OLED顯示屏?—— 實(shí)時(shí)顯示土壤及環(huán)境參數(shù)。
3.?Air780E 4G通信模塊?—— 用于通過(guò)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.?太陽(yáng)能充電板?—— 太陽(yáng)能供電系統(tǒng)中的光伏板,為鋰電池充電。
10.?充電管理板(充電控制器)?—— 負(fù)責(zé)太陽(yáng)能電池板給鋰電池充電的管理與保護(hù)。
11.?鋰電池組?—— 儲(chǔ)存太陽(yáng)能電能,為系統(tǒng)供電。
12.?電源管理電路?—— 穩(wěn)壓與保護(hù)電路,確保系統(tǒng)穩(wěn)定運(yùn)行。
13.?電源連接線和接口?—— 連接太陽(yáng)能板、鋰電池和系統(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表示開(kāi)啟)
11.?device_id?—— 設(shè)備唯一標(biāo)識(shí),用于區(qū)分多個(gè)設(shè)備上傳的數(shù)據(jù)
這些字段基本涵蓋了系統(tǒng)所有關(guān)鍵監(jiān)測(cè)點(diǎn)和控制狀態(tài),上傳后可以通過(guò)云平臺(tái)實(shí)現(xiàn)遠(yuǎn)程監(jiān)控、歷史數(shù)據(jù)分析及設(shè)備管理。
三、部署華為云物聯(lián)網(wǎng)平臺(tái)
華為云官網(wǎng): https://www.huaweicloud.com/
打開(kāi)官網(wǎng),搜索物聯(lián)網(wǎng),就能快速找到?設(shè)備接入IoTDA
。
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)大的開(kāi)放能力,支撐行業(yè)用戶構(gòu)建各種物聯(lián)網(wǎng)解決方案。
設(shè)備可以通過(guò)固網(wǎng)、2G/3G/4G/5G、NB-IoT、Wifi等多種網(wǎng)絡(luò)接入物聯(lián)網(wǎng)平臺(tái),并使用LWM2M/CoAP、MQTT、HTTPS協(xié)議將業(yè)務(wù)數(shù)據(jù)上報(bào)到平臺(tái),平臺(tái)也可以將控制命令下發(fā)給設(shè)備。
業(yè)務(wù)應(yīng)用通過(guò)調(diào)用物聯(lián)網(wǎng)平臺(tái)提供的API,實(shí)現(xiàn)設(shè)備數(shù)據(jù)采集、命令下發(fā)、設(shè)備管理等業(yè)務(wù)場(chǎng)景。
3.2 開(kāi)通物聯(lián)網(wǎng)服務(wù)
地址: https://www.huaweicloud.com/product/iothub.html
開(kāi)通免費(fèi)單元。
點(diǎn)擊立即創(chuàng)建
。
正在創(chuàng)建標(biāo)準(zhǔn)版實(shí)例,需要等待片刻。
創(chuàng)建完成之后,點(diǎn)擊詳情。 可以看到標(biāo)準(zhǔn)版實(shí)例的設(shè)備接入端口和地址。
下面框起來(lái)的就是端口號(hào)
和域名
點(diǎn)擊實(shí)例名稱,可以查看當(dāng)前免費(fèi)單元
的配置情況。
開(kāi)通之后,點(diǎn)擊接入信息
,也能查看接入信息。 我們當(dāng)前設(shè)備準(zhǔn)備采用MQTT協(xié)議接入華為云平臺(tái),這里可以看到MQTT協(xié)議的地址和端口號(hào)等信息。
總結(jié):
端口號(hào): ? MQTT (1883)| MQTTS (8883) ? ?
接入地址: dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com
根據(jù)域名地址得到IP地址信息:
打開(kāi)Windows電腦的命令行控制臺(tái)終端,使用ping
?命令。ping
一下即可。
Microsoft Windows [版本 10.0.19045.5011]
(c) Microsoft Corporation。保留所有權(quán)利。
C:UsersLenovo>ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com
正在 Ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字節(jié)的數(shù)據(jù):
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
117.78.5.125 的 Ping 統(tǒng)計(jì)信息:
? ? 數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計(jì)時(shí)間(以毫秒為單位):
? ? 最短 = 37ms,最長(zhǎng) = 37ms,平均 = 37ms
C:UsersLenovo>
MQTT協(xié)議接入端口號(hào)有兩個(gè),1883是非加密端口,8883是證書(shū)加密端口,單片機(jī)無(wú)法加載證書(shū),所以使用1883端口合適
。
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)品
(2)填寫(xiě)產(chǎn)品信息
根據(jù)自己產(chǎn)品名字填寫(xiě),下面的設(shè)備類型選擇自定義類型。
(3)產(chǎn)品創(chuàng)建成功
創(chuàng)建完成之后點(diǎn)擊查看詳情。
(4)添加自定義模型
產(chǎn)品創(chuàng)建完成之后,點(diǎn)擊進(jìn)入產(chǎn)品詳情頁(yè)面,翻到最下面可以看到模型定義。
模型簡(jiǎn)單來(lái)說(shuō): 就是存放設(shè)備上傳到云平臺(tái)的數(shù)據(jù)。
你可以根據(jù)自己的產(chǎn)品進(jìn)行創(chuàng)建。
比如:
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表示開(kāi)啟)
device_id —— 設(shè)備唯一標(biāo)識(shí),用于區(qū)分多個(gè)設(shè)備上傳的數(shù)據(jù)
先點(diǎn)擊自定義模型。
再創(chuàng)建一個(gè)服務(wù)ID。
接著點(diǎn)擊新增屬性。
3.4 添加設(shè)備
產(chǎn)品是屬于上層的抽象模型,接下來(lái)在產(chǎn)品模型下添加實(shí)際的設(shè)備。添加的設(shè)備最終需要與真實(shí)的設(shè)備關(guān)聯(lián)在一起,完成數(shù)據(jù)交互。
(1)注冊(cè)設(shè)備
(2)根據(jù)自己的設(shè)備填寫(xiě)
(3)保存設(shè)備信息
創(chuàng)建完畢之后,點(diǎn)擊保存并關(guān)閉,得到創(chuàng)建的設(shè)備密匙信息。該信息在后續(xù)生成MQTT三元組的時(shí)候需要使用。
(4)設(shè)備創(chuàng)建完成
(5)設(shè)備詳情
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是專門(mén)針對(duì)物聯(lián)網(wǎng)開(kāi)發(fā)的輕量級(jí)傳輸協(xié)議。MQTT協(xié)議針對(duì)低帶寬網(wǎng)絡(luò),低計(jì)算能力的設(shè)備,做了特殊的優(yōu)化,使得其能適應(yīng)各種物聯(lián)網(wǎng)應(yīng)用場(chǎng)景。目前MQTT擁有各種平臺(tái)和設(shè)備上的客戶端,已經(jīng)形成了初步的生態(tài)系統(tǒng)。
MQTT是一種消息隊(duì)列協(xié)議,使用發(fā)布/訂閱消息模式,提供一對(duì)多的消息發(fā)布,解除應(yīng)用程序耦合,相對(duì)于其他協(xié)議,開(kāi)發(fā)更簡(jiǎn)單;MQTT協(xié)議是工作在TCP/IP協(xié)議上;由TCP/IP協(xié)議提供穩(wěn)定的網(wǎng)絡(luò)連接;所以,只要具備TCP協(xié)議棧的網(wǎng)絡(luò)設(shè)備都可以使用MQTT協(xié)議。 本次設(shè)備采用的ESP8266就具備TCP協(xié)議棧,能夠建立TCP連接,所以,配合STM32代碼里封裝的MQTT協(xié)議,就可以與華為云平臺(tái)完成通信。
華為云的MQTT協(xié)議接入幫助文檔在這里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
業(yè)務(wù)流程:
(2)華為云平臺(tái)MQTT協(xié)議使用限制
描述 | 限制 |
支持的MQTT協(xié)議版本 | 3.1.1 |
與標(biāo)準(zhǔn)MQTT協(xié)議的區(qū)別 | 支持Qos 0和Qos 1支持Topic自定義不支持QoS2不支持will、retain msg |
MQTTS支持的安全等級(jí) | 采用TCP通道基礎(chǔ) + TLS協(xié)議(最高TLSv1.3版本) |
單帳號(hào)每秒最大MQTT連接請(qǐng)求數(shù) | 無(wú)限制 |
單個(gè)設(shè)備每分鐘支持的最大MQTT連接數(shù) | 1 |
單個(gè)MQTT連接每秒的吞吐量,即帶寬,包含直連設(shè)備和網(wǎng)關(guān) | 3KB/s |
MQTT單個(gè)發(fā)布消息最大長(zhǎng)度,超過(guò)此大小的發(fā)布請(qǐng)求將被直接拒絕 | 1MB |
MQTT連接心跳時(shí)間建議值 | 心跳時(shí)間限定為30至1200秒,推薦設(shè)置為120秒 |
產(chǎn)品是否支持自定義Topic | 支持 |
消息發(fā)布與訂閱 | 設(shè)備只能對(duì)自己的Topic進(jìn)行消息發(fā)布與訂閱 |
每個(gè)訂閱請(qǐng)求的最大訂閱數(shù) | 無(wú)限制 |
(3)主題訂閱格式
幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
對(duì)于設(shè)備而言,一般會(huì)訂閱平臺(tái)下發(fā)消息給設(shè)備 這個(gè)主題。
設(shè)備想接收平臺(tái)下發(fā)的消息,就需要訂閱平臺(tái)下發(fā)消息給設(shè)備 的主題,訂閱后,平臺(tái)下發(fā)消息給設(shè)備,設(shè)備就會(huì)收到消息。
如果設(shè)備想要知道平臺(tái)下發(fā)的消息,需要訂閱上面圖片里標(biāo)注的主題。
以當(dāng)前設(shè)備為例,最終訂閱主題的格式如下:
$oc/devices/{device_id}/sys/messages/down
? ??
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down
(4)主題發(fā)布格式
對(duì)于設(shè)備來(lái)說(shuō),主題發(fā)布表示向云平臺(tái)上傳數(shù)據(jù),將最新的傳感器數(shù)據(jù),設(shè)備狀態(tài)上傳到云平臺(tái)。
這個(gè)操作稱為:屬性上報(bào)。
幫助文檔地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
根據(jù)幫助文檔的介紹, 當(dāng)前設(shè)備發(fā)布主題,上報(bào)屬性的格式總結(jié)如下:
發(fā)布的主題格式:
$oc/devices/{device_id}/sys/properties/report
?
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
發(fā)布主題時(shí),需要上傳數(shù)據(jù),這個(gè)數(shù)據(jù)格式是JSON格式。
上傳的JSON數(shù)據(jù)格式如下:
{
??"services": [
? ? {
? ? ??"service_id": <填服務(wù)ID>,
? ? ??"properties": {
? ? ? ??"<填屬性名稱1>": <填屬性值>,
? ? ? ??"<填屬性名稱2>": <填屬性值>,
? ? ? ? ..........
? ? ? }
? ? }
? ]
}
根據(jù)JSON格式,一次可以上傳多個(gè)屬性字段。 這個(gè)JSON格式里的,服務(wù)ID,屬性字段名稱,屬性值類型,在前面創(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三元組。
接下來(lái)介紹,華為云平臺(tái)的MQTT三元組參數(shù)如何得到。
(1)MQTT服務(wù)器地址
要登錄MQTT服務(wù)器,首先記得先知道服務(wù)器的地址是多少,端口是多少。
幫助文檔地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home
MQTT協(xié)議的端口支持1883和8883,它們的區(qū)別是:8883 是加密端口更加安全。但是單片機(jī)上使用比較困難,所以當(dāng)前的設(shè)備是采用1883端口進(jìn)連接的。
根據(jù)上面的域名和端口號(hào),得到下面的IP地址和端口號(hào)信息:?如果設(shè)備支持填寫(xiě)域名可以直接填域名,不支持就直接填寫(xiě)IP地址。 (IP地址就是域名解析得到的)
華為云的MQTT服務(wù)器地址:117.78.5.125
華為云的MQTT端口號(hào):1883
如何得到IP地址?如何域名轉(zhuǎn)IP? 打開(kāi)Windows的命令行輸入以下命令。
ping ?ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
(2)生成MQTT三元組
華為云提供了一個(gè)在線工具,用來(lái)生成MQTT鑒權(quán)三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打開(kāi)這個(gè)工具,填入設(shè)備的信息(也就是剛才創(chuàng)建完設(shè)備之后保存的信息),點(diǎn)擊生成,就可以得到MQTT的登錄信息了。
下面是打開(kāi)的頁(yè)面:
填入設(shè)備的信息:?(上面兩行就是設(shè)備創(chuàng)建完成之后保存得到的)
直接得到三元組信息。
得到三元組之后,設(shè)備端通過(guò)MQTT協(xié)議登錄鑒權(quán)的時(shí)候,填入?yún)?shù)即可。
ClientId ?663cb18871d845632a0912e7_dev1_0_0_2024050911
Username ?663cb18871d845632a0912e7_dev1
Password ?71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237
3.7 模擬設(shè)備登錄測(cè)試
經(jīng)過(guò)上面的步驟介紹,已經(jīng)創(chuàng)建了產(chǎn)品,設(shè)備,數(shù)據(jù)模型,得到MQTT登錄信息。 接下來(lái)就用MQTT客戶端軟件模擬真實(shí)的設(shè)備來(lái)登錄平臺(tái)。測(cè)試與服務(wù)器通信是否正常。
MQTT軟件下載地址【免費(fèi)】:?https://download.csdn.net/download/xiaolong1126626497/89928772
(1)填入登錄信息
打開(kāi)MQTT客戶端軟件,對(duì)號(hào)填入相關(guān)信息(就是上面的文本介紹)。然后,點(diǎn)擊登錄,訂閱主題,發(fā)布主題。
(2)打開(kāi)網(wǎng)頁(yè)查看
完成上面的操作之后,打開(kāi)華為云網(wǎng)頁(yè)后臺(tái),可以看到設(shè)備已經(jīng)在線了。
點(diǎn)擊詳情頁(yè)面,可以看到上傳的數(shù)據(jù):
到此,云平臺(tái)的部署已經(jīng)完成,設(shè)備已經(jīng)可以正常上傳數(shù)據(jù)了。
(3)MQTT登錄測(cè)試參數(shù)總結(jié)
MQTT服務(wù)器: ?117.78.5.125
MQTT端口號(hào): ?183
//物聯(lián)網(wǎng)服務(wù)器的設(shè)備信息
#define?MQTT_ClientID?"663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define?MQTT_UserName?"663cb18871d845632a0912e7_dev1"
#define?MQTT_PassWord?"71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"
//訂閱與發(fā)布的主題
#define?SET_TOPIC ?"$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down"??//訂閱
#define?POST_TOPIC?"$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report"??//發(fā)布
發(fā)布的數(shù)據(jù):
{"services": [{"service_id":?"stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}
3.8 創(chuàng)建IAM賬戶
創(chuàng)建一個(gè)IAM賬戶,因?yàn)榻酉聛?lái)開(kāi)發(fā)上位機(jī),需要使用云平臺(tái)的API接口,這些接口都需要token進(jìn)行鑒權(quán)。簡(jiǎn)單來(lái)說(shuō),就是身份的認(rèn)證。 調(diào)用接口獲取Token時(shí),就需要填寫(xiě)IAM賬號(hào)信息。所以,接下來(lái)演示一下過(guò)程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
**【1】獲取項(xiàng)目憑證 ** 點(diǎn)擊左上角用戶名,選擇下拉菜單里的我的憑證
項(xiàng)目憑證:
28add376c01e4a61ac8b621c714bf459
【2】創(chuàng)建IAM用戶
鼠標(biāo)放在左上角頭像上,在下拉菜單里選擇統(tǒng)一身份認(rèn)證
。
點(diǎn)擊左上角創(chuàng)建用戶
。
創(chuàng)建成功:
【3】創(chuàng)建完成
用戶信息如下:
主用戶名 ?l19504562721
IAM用戶 ?ds_abc
密碼 ? ? DS12345678
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ù)
無(wú)論該設(shè)備是否在線,都可以通過(guò)該影子獲取和設(shè)置設(shè)備的屬性
簡(jiǎn)單來(lái)說(shuō):設(shè)備影子就是保存,設(shè)備最新上傳的一次數(shù)據(jù)。
我們?cè)O(shè)計(jì)的軟件里,如果想要獲取設(shè)備的最新?tīng)顟B(tài)信息,就采用設(shè)備影子接口。
如果對(duì)接口不熟悉,可以先進(jìn)行在線調(diào)試:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow
在線調(diào)試接口,可以請(qǐng)求影子接口,了解請(qǐng)求,與返回的數(shù)據(jù)格式。
調(diào)試完成看右下角的響應(yīng)體,就是返回的影子數(shù)據(jù)。
設(shè)備影子接口返回的數(shù)據(jù)如下:
{
?"device_id":?"663cb18871d845632a0912e7_dev1",
?"shadow": [
? {
? ?"service_id":?"stm32",
? ?"desired": {
? ??"properties": null,
? ??"event_time": null
? ?},
? ?"reported": {
? ??"properties": {
? ? ?"DHT11_T":?18,
? ? ?"DHT11_H":?90,
? ? ?"BH1750":?38,
? ? ?"MQ135":?70
? ? },
? ??"event_time":?"20240509T113448Z"
? ?},
? ?"version":?3
? }
?]
}
調(diào)試成功之后,可以得到訪問(wèn)影子數(shù)據(jù)的真實(shí)鏈接,接下來(lái)的代碼開(kāi)發(fā)中,就采用Qt寫(xiě)代碼訪問(wèn)此鏈接,獲取影子數(shù)據(jù),完成上位機(jī)開(kāi)發(fā)。
鏈接如下:
https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow
3.10 訪問(wèn)接口的代碼實(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è)置訪問(wèn)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ù)) 來(lái)解析返回的 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ù)組包,通過(guò)MQTT協(xié)議經(jīng)Air780e 4G模塊上傳至華為云IoT平臺(tái)。
系統(tǒng)支持多設(shè)備獨(dú)立運(yùn)行,設(shè)備ID需唯一。
當(dāng)前項(xiàng)目使用的相關(guān)軟件工具、模塊源碼已經(jīng)上傳到網(wǎng)盤(pán):https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
當(dāng)前項(xiàng)目使用的相關(guān)軟件工具、模塊源碼已經(jīng)上傳到網(wǎng)盤(pán):https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
當(dāng)前項(xiàng)目使用的相關(guān)軟件工具、模塊源碼已經(jīng)上傳到網(wǎng)盤(pán):https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
當(dāng)前項(xiàng)目使用的相關(guān)軟件工具、模塊源碼已經(jīng)上傳到網(wǎng)盤(pán):https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
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(); ?// 打開(kāi)水泵灌溉
? ? }
? ??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ù)上傳至云端(通過(guò)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);
}
代碼說(shuō)明
??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字符串,通過(guò)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ī)開(kāi)發(fā)
為了方便查看設(shè)備上傳的數(shù)據(jù),接下來(lái)利用Qt開(kāi)發(fā)一款A(yù)ndroid手機(jī)APP 和 Windows上位機(jī)。
使用華為云平臺(tái)提供的API接口獲取設(shè)備上傳的數(shù)據(jù),進(jìn)行可視化顯示,以及遠(yuǎn)程控制設(shè)備。
5.1 Qt開(kāi)發(fā)環(huán)境安裝
Qt的中文官網(wǎng): https://www.qt.io/zh-cn/
QT5.12.6的下載地址:https://download.qt.io/archive/qt/5.12/5.12.6
打開(kāi)下載鏈接后選擇下面的版本進(jìn)行下載:
如果下載不了,可以在網(wǎng)盤(pán)里找到安裝包下載:?https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
軟件安裝時(shí)斷網(wǎng)安裝,否則會(huì)提示輸入賬戶。
安裝的時(shí)候,第一個(gè)復(fù)選框里的編譯器可以全選,直接點(diǎn)擊下一步繼續(xù)安裝。
選擇編譯器: (一定要看清楚了)
前面2講解了需要用的API接口,接下來(lái)就使用Qt設(shè)計(jì)上位機(jī),設(shè)計(jì)界面,完成整體上位機(jī)的邏輯設(shè)計(jì)。
【1】新建工程
【2】設(shè)置項(xiàng)目的名稱。
【3】選擇編譯系統(tǒng)
【4】選擇默認(rèn)繼承的類
【5】選擇編譯器
【6】點(diǎn)擊完成
【7】工程創(chuàng)建完成
5.3 切換編譯器
在左下角是可以切換編譯器的。 可以選擇用什么樣的編譯器編譯程序。
目前新建工程的時(shí)候選擇了2種編譯器。 一種是mingw32
這個(gè)編譯Windows下運(yùn)行的程序。 一種是Android
編譯器,可以生成Android
手機(jī)APP。
不過(guò)要注意:Android的編譯器需要配置一些環(huán)境才可以正常使用,這個(gè)大家可以看下面的教程配置一下就行了。
Android環(huán)境搭建的博客鏈接:?https://blog.csdn.net/xiaolong1126626497/article/details/117254453
windows的編譯器就沒(méi)有這么麻煩,安裝好Qt就可以編譯使用。
下面我這里就選擇的?mingw32
這個(gè)編譯器,編譯Windows下運(yùn)行的程序。
5.4 編譯測(cè)試功能
創(chuàng)建完畢之后,編譯測(cè)試一下功能是否OK。
點(diǎn)擊左下角的綠色三角形按鈕
。
正常運(yùn)行就可以看到彈出一個(gè)白色的框框。這就表示工程環(huán)境沒(méi)有問(wèn)題了。 接下來(lái)就可以放心的設(shè)計(jì)界面了。
5.5 設(shè)計(jì)UI界面與工程配置
【1】打開(kāi)UI文件
打開(kāi)默認(rèn)的界面如下:
【2】開(kāi)始設(shè)計(jì)界面
根據(jù)自己需求設(shè)計(jì)界面。
5.5 編譯Windows上位機(jī)
點(diǎn)擊軟件左下角的綠色三角形按鈕進(jìn)行編譯運(yùn)行。
5.6 配置Android環(huán)境
如果想編譯Android手機(jī)APP,必須要先自己配置好自己的Android環(huán)境。(搭建環(huán)境的過(guò)程可以自行百度搜索學(xué)習(xí))
然后才可以進(jìn)行下面的步驟。
【1】選擇Android編譯器
選擇編譯器。
切換編譯器。
【2】創(chuàng)建Android配置文件
創(chuàng)建完成。
【3】配置Android圖標(biāo)與名稱
【3】編譯Android上位機(jī)
Qt本身是跨平臺(tái)的,直接選擇Android的編譯器,就可以將程序編譯到Android平臺(tái)。
然后點(diǎn)擊構(gòu)建。
成功之后,在目錄下可以看到生成的apk
文件,也就是Android手機(jī)的安裝包,電腦端使用QQ
發(fā)送給手機(jī)QQ,手機(jī)登錄QQ接收,就能直接安裝。
生成的apk
的目錄在哪里呢? 編譯完成之后,在控制臺(tái)會(huì)輸出APK文件的路徑。
知道目錄在哪里之后,在Windows的文件資源管理器里,找到路徑,具體看下圖,找到生成的apk文件。
? -- File: D:/QtProject/build-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)通過(guò)多種傳感器對(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)支持太陽(yáng)能供電,提升了設(shè)備的適用環(huán)境范圍和續(xù)航能力。
通過(guò)本項(xiàng)目的開(kāi)發(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í)踐參考。