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

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

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

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

共1個文件

一、前言

1.1 項目介紹

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

隨著現(xiàn)代農(nóng)業(yè)的快速發(fā)展,傳統(tǒng)依賴經(jīng)驗的耕作方式已逐漸無法滿足精細(xì)化、智能化種植的需求。農(nóng)業(yè)生產(chǎn)中土壤作為植物生長的基礎(chǔ),其質(zhì)量直接關(guān)系到作物的產(chǎn)量與品質(zhì)。因此,對土壤質(zhì)量的實時監(jiān)測和分析成為農(nóng)業(yè)現(xiàn)代化管理中的關(guān)鍵環(huán)節(jié)。尤其是在溫室種植、精準(zhǔn)農(nóng)業(yè)以及設(shè)施農(nóng)業(yè)等場景中,對土壤濕度、溫度、PH值以及氮磷鉀等化學(xué)元素的含量進(jìn)行有效監(jiān)測,有助于科學(xué)施肥與灌溉,從而實現(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)測相結(jié)合,為農(nóng)業(yè)信息化建設(shè)提供了新的手段。尤其是STM32單片機以其高性能、低功耗、豐富的外設(shè)接口等特點,成為農(nóng)業(yè)智能設(shè)備開發(fā)的理想平臺。通過集成多種傳感器模塊,實現(xiàn)對土壤溫濕度、PH值、氮磷鉀等關(guān)鍵參數(shù)的綜合采集,為農(nóng)業(yè)決策提供科學(xué)依據(jù)。

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

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

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

image-20250525104502312

image-20250525104426768

image-20250525104524935

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

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

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

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

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

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

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

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

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

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

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

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

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

【3】項目硬件模塊組成

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

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

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

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

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

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

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

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

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

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

1.2 設(shè)計思路

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

【1】Aair780模塊

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

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

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

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

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

【2】BH1750模塊

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

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

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

在實際使用中,BH1750能夠快速響應(yīng)環(huán)境光線的變化,且具有良好的線性輸出特性,使得它能夠為光照控制系統(tǒng)、自動調(diào)光系統(tǒng)等提供可靠的數(shù)據(jù)支持。在農(nóng)業(yè)領(lǐng)域,BH1750可以幫助監(jiān)測光照強度,輔助判斷作物的生長環(huán)境,從而指導(dǎo)補光設(shè)備的啟停和調(diào)節(jié)。

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

【3】DHT11模塊

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

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

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

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

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

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

如果大家想自己搭建模型,完成這個項目的功能測試。

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

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

基于STM32的土壤質(zhì)量監(jiān)測系統(tǒng),上傳到華為云IoT平臺的數(shù)據(jù)字段包括以下內(nèi)容,覆蓋系統(tǒng)監(jiān)測的全部核心參數(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)境光照強度(單位:Lux)
  10. water_pump_status —— 自動灌溉狀態(tài)(如0表示關(guān)閉,1表示開啟)
  11. device_id —— 設(shè)備唯一標(biāo)識,用于區(qū)分多個設(shè)備上傳的數(shù)據(jù)

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

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

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

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

image-20221204193824815

3.1 物聯(lián)網(wǎng)平臺介紹

華為云物聯(lián)網(wǎng)平臺(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)平臺構(gòu)建一個完整的物聯(lián)網(wǎng)解決方案主要包括3部分:物聯(lián)網(wǎng)平臺、業(yè)務(wù)應(yīng)用和設(shè)備。

物聯(lián)網(wǎng)平臺作為連接業(yè)務(wù)應(yīng)用和設(shè)備的中間層,屏蔽了各種復(fù)雜的設(shè)備接口,實現(xiàn)設(shè)備的快速接入;同時提供強大的開放能力,支撐行業(yè)用戶構(gòu)建各種物聯(lián)網(wǎng)解決方案。

設(shè)備可以通過固網(wǎng)、2G/3G/4G/5G、NB-IoT、Wifi等多種網(wǎng)絡(luò)接入物聯(lián)網(wǎng)平臺,并使用LWM2M/CoAP、MQTT、HTTPS協(xié)議將業(yè)務(wù)數(shù)據(jù)上報到平臺,平臺也可以將控制命令下發(fā)給設(shè)備。

業(yè)務(wù)應(yīng)用通過調(diào)用物聯(lián)網(wǎng)平臺提供的API,實現(xiàn)設(shè)備數(shù)據(jù)采集、命令下發(fā)、設(shè)備管理等業(yè)務(wù)場景。

img

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

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

image-20241028135834377

開通免費單元。

image-20241028135935457

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

image-20240117134653452

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

image-20241028140048811

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

image-20241028140129102

下面框起來的就是端口號域名

image-20241028140229696

點擊實例名稱,可以查看當(dāng)前免費單元的配置情況。

image-20241028140331523

image-20241028140428663

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

image-20241028140511105

總結(jié):

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

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

打開Windows電腦的命令行控制臺終端,使用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 時間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時間=37ms TTL=44

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

C:UsersLenovo>

MQTT協(xié)議接入端口號有兩個,1883是非加密端口,8883是證書加密端口,單片機無法加載證書,所以使用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)建完成之后點擊查看詳情。

image-20240612095134263

(4)添加自定義模型

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

模型簡單來說: 就是存放設(shè)備上傳到云平臺的數(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)境光照強度(單位:Lux)

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

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

先點擊自定義模型。

image-20240612095517900

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

image-20240612095542749

接著點擊新增屬性。

image-20240612095648815

image-20240612095711898

3.4 添加設(shè)備

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

(1)注冊設(shè)備

image-20240425181935561

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

image-20240612100115167

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

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

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é)議與華為云平臺進(jìn)行通信。

MQTT是一個物聯(lián)網(wǎng)傳輸協(xié)議,它被設(shè)計用于輕量級的發(fā)布/訂閱式消息傳輸,旨在為低帶寬和不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中的物聯(lián)網(wǎng)設(shè)備提供可靠的網(wǎng)絡(luò)服務(wù)。MQTT是專門針對物聯(lián)網(wǎng)開發(fā)的輕量級傳輸協(xié)議。MQTT協(xié)議針對低帶寬網(wǎng)絡(luò),低計算能力的設(shè)備,做了特殊的優(yōu)化,使得其能適應(yīng)各種物聯(lián)網(wǎng)應(yīng)用場景。目前MQTT擁有各種平臺和設(shè)備上的客戶端,已經(jīng)形成了初步的生態(tài)系統(tǒng)。

MQTT是一種消息隊列協(xié)議,使用發(fā)布/訂閱消息模式,提供一對多的消息發(fā)布,解除應(yīng)用程序耦合,相對于其他協(xié)議,開發(fā)更簡單;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é)議,就可以與華為云平臺完成通信。

華為云的MQTT協(xié)議接入幫助文檔在這里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

img

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

img

(2)華為云平臺MQTT協(xié)議使用限制

描述 限制
支持的MQTT協(xié)議版本 3.1.1
與標(biāo)準(zhǔn)MQTT協(xié)議的區(qū)別 支持Qos 0和Qos 1支持Topic自定義不支持QoS2不支持will、retain msg
MQTTS支持的安全等級 采用TCP通道基礎(chǔ) + TLS協(xié)議(最高TLSv1.3版本)
單帳號每秒最大MQTT連接請求數(shù) 無限制
單個設(shè)備每分鐘支持的最大MQTT連接數(shù) 1
單個MQTT連接每秒的吞吐量,即帶寬,包含直連設(shè)備和網(wǎng)關(guān) 3KB/s
MQTT單個發(fā)布消息最大長度,超過此大小的發(fā)布請求將被直接拒絕 1MB
MQTT連接心跳時間建議值 心跳時間限定為30至1200秒,推薦設(shè)置為120秒
產(chǎn)品是否支持自定義Topic 支持
消息發(fā)布與訂閱 設(shè)備只能對自己的Topic進(jìn)行消息發(fā)布與訂閱
每個訂閱請求的最大訂閱數(shù) 無限制

(3)主題訂閱格式

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

image-20221207153310037

對于設(shè)備而言,一般會訂閱平臺下發(fā)消息給設(shè)備 這個主題。

設(shè)備想接收平臺下發(fā)的消息,就需要訂閱平臺下發(fā)消息給設(shè)備 的主題,訂閱后,平臺下發(fā)消息給設(shè)備,設(shè)備就會收到消息。

如果設(shè)備想要知道平臺下發(fā)的消息,需要訂閱上面圖片里標(biāo)注的主題。

以當(dāng)前設(shè)備為例,最終訂閱主題的格式如下:
$oc/devices/{device_id}/sys/messages/down
    
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down

(4)主題發(fā)布格式

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

這個操作稱為:屬性上報。

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

image-20221207153637391

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

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

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

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

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

3.6 MQTT三元組

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

接下來介紹,華為云平臺的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 是加密端口更加安全。但是單片機上使用比較困難,所以當(dāng)前的設(shè)備是采用1883端口進(jìn)連接的。

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

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

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

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

image-20240425182610048

(2)生成MQTT三元組

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

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

下面是打開的頁面:

image-20240425183025893

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

直接得到三元組信息。

image-20240509193310020

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

ClientId  663cb18871d845632a0912e7_dev1_0_0_2024050911
Username  663cb18871d845632a0912e7_dev1
Password  71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237

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

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

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

(1)填入登錄信息

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

image-20240509193457358

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

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

image-20240612100508790

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

image-20240612100529581

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

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

MQTT服務(wù)器:  117.78.5.125
MQTT端口號:  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)建一個IAM賬戶,因為接下來開發(fā)上位機,需要使用云平臺的API接口,這些接口都需要token進(jìn)行鑒權(quán)。簡單來說,就是身份的認(rèn)證。 調(diào)用接口獲取Token時,就需要填寫IAM賬號信息。所以,接下來演示一下過程。

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

**【1】獲取項目憑證 ** 點擊左上角用戶名,選擇下拉菜單里的我的憑證

image-20240509193646253

image-20240509193701262

項目憑證:

28add376c01e4a61ac8b621c714bf459

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

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

image-20240509193729078

點擊左上角創(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è)備影子是一個用于存儲和檢索設(shè)備當(dāng)前狀態(tài)信息的JSON文檔。
每個設(shè)備有且只有一個設(shè)備影子,由設(shè)備ID唯一標(biāo)識
設(shè)備影子僅保存最近一次設(shè)備的上報數(shù)據(jù)和預(yù)期數(shù)據(jù)
無論該設(shè)備是否在線,都可以通過該影子獲取和設(shè)置設(shè)備的屬性

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

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

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

在線調(diào)試接口,可以請求影子接口,了解請求,與返回的數(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ù)的真實鏈接,接下來的代碼開發(fā)中,就采用Qt寫代碼訪問此鏈接,獲取影子數(shù)據(jù),完成上位機開發(fā)。

image-20240509194214716

鏈接如下:

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

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

(1)配置 Qt 項目

在 Qt 項目的 .pro 文件中,加入對 libcurl 的支持:

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

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

SOURCES += main.cpp

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

main.cpp 文件中實現(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;  // 用于存儲響應(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請求頭
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Authorization: Bearer <Your_Access_Token>"); // 這里需要替換為你的實際 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請求
        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 (一個用于解析 JSON 數(shù)據(jù)的輕量級 C 庫) 來解析返回的 JSON 數(shù)據(jù)。

(1)配置 Qt 項目

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

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

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

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

LIBS += -lcurl  # 鏈接 libcurl 庫

(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) {
            // 解析每個 shadow 項目
            cJSON *serviceId = cJSON_GetObjectItemCaseSensitive(shadowItem, "service_id");
            if (cJSON_IsString(serviceId) && (serviceId->valuestring != NULL)) {
                qDebug() << "Service ID:" << serviceId->valuestring;
            }

            // 解析 "reported" 對象
            cJSON *reported = cJSON_GetObjectItemCaseSensitive(shadowItem, "reported");
            if (cJSON_IsObject(reported)) {
                // 解析 "properties" 對象
                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 對象
    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è)計

設(shè)計思路概述

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

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

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

系統(tǒng)支持多設(shè)備獨立運行,設(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"

// 土壤濕度閾值,低于該值啟動灌溉
#define SOIL_HUMIDITY_THRESHOLD 40  

// 報警閾值(示例,實際需調(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

// 定時讀取間隔(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)
{
    // 初始化時鐘系統(tǒng)
    SystemInit();

    // 初始化延時函數(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);

    // 讀取光照強度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)閉水泵
    }
}

// 異常情況報警檢測
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屏幕上實時顯示關(guān)鍵數(shù)據(jù)。
  • Control_Watering()根據(jù)土壤濕度自動控制繼電器驅(qū)動抽水電機灌溉。
  • Check_Alarm()根據(jù)預(yù)設(shè)閾值判斷是否異常,觸發(fā)蜂鳴器報警。
  • Upload_Data_MQTT()將傳感器數(shù)據(jù)封裝成JSON字符串,通過Air780e的MQTT協(xié)議上傳至華為云IoT平臺。

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

五、上位機開發(fā)

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

使用華為云平臺提供的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

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

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

image-20221203151742653

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

image-20241028152725134

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

【1】新建工程

image-20240117144052547

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

image-20241112142627805

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

image-20240117144239681

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

image-20240117144302275

【5】選擇編譯器

image-20241028153603487

【6】點擊完成

image-20240117144354252

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

image-20241112142836874

5.3 切換編譯器

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

目前新建工程的時候選擇了2種編譯器。 一種是mingw32這個編譯Windows下運行的程序。 一種是Android編譯器,可以生成Android手機APP。

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

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

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

下面我這里就選擇的 mingw32這個編譯器,編譯Windows下運行的程序。

image-20241112142912481

5.4 編譯測試功能

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

點擊左下角的綠色三角形按鈕。

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

image-20241112142939735

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

【1】打開UI文件

image-20241112143019233

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

image-20240425194845233

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

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

5.5 編譯Windows上位機

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

image-20241112153656462

5.6 配置Android環(huán)境

如果想編譯Android手機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上位機

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

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

image-20241112154026342

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

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

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

相關(guān)推薦