那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32+華為云IOT設(shè)計(jì)的智能溫室大棚監(jiān)控系統(tǒng)

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-04-26 11:08 ? 次閱讀

一、項(xiàng)目背景

當(dāng)前文章介紹基于STM32單片機(jī)智能溫室大棚監(jiān)控系統(tǒng),當(dāng)前系統(tǒng)由溫濕度傳感器、二氧化碳傳感器光敏電阻傳感器、土壤濕度傳感器笨時(shí)溫宏大棚中內(nèi)作物生長環(huán)境因子主要包括溫度、濕度、光度、土壤濕度傳感、二氧化碳濃度等參數(shù)進(jìn)行監(jiān)控。

采集數(shù)據(jù),判斷是否在系統(tǒng)設(shè)定上限、下限范圍,如果超出了上限下限蜂鳴器報(bào)警、通風(fēng)系統(tǒng)、LED補(bǔ)光系統(tǒng)、水泵系統(tǒng)就會(huì)啟也可以通過手機(jī)APP和華為云華為云物聯(lián)網(wǎng)云平臺(tái)對溫室大棚中的數(shù)據(jù)進(jìn)行修改和設(shè)定新的數(shù)據(jù)。

本設(shè)計(jì)整體主要采用STM32單片機(jī)為核心、溫濕度傳感器、二氧化碳傳感器、光敏電阻傳感器、土壤濕度傳感器、通風(fēng)系統(tǒng)、LED補(bǔ)光系統(tǒng)、水泵系統(tǒng)組成。

(1) 溫濕度傳感器: 主要對溫室大棚中農(nóng)作物環(huán)境進(jìn)行溫濕度監(jiān)控,把數(shù)據(jù)傳到控制系統(tǒng),由控制系統(tǒng)傳到OLED顯示屏上顯示出來。

(2) 二氧化碳傳感器: 工作過程對溫室大棚中的農(nóng)作物環(huán)境二氧化碳濃度進(jìn)行監(jiān)控采集數(shù)據(jù),把數(shù)據(jù)傳到控制系統(tǒng)后,再把控制系統(tǒng)中的當(dāng)前環(huán)境數(shù)據(jù)傳顯示屏上顯示出來。

(3) 光敏電阻傳感器: 工作過程主要通過對溫室大棚中的農(nóng)作物環(huán)境光照強(qiáng)度進(jìn)行監(jiān)控采集數(shù)據(jù),把數(shù)據(jù)傳到控制系統(tǒng)后,再從控制系統(tǒng)的數(shù)據(jù)傳到顯示屏上顯示。

(4) 土壤濕度傳感器: 工作過程對溫室大棚中的農(nóng)作物生長環(huán)境的土壤濕度進(jìn)行監(jiān)控采集數(shù)據(jù),把數(shù)據(jù)傳到控制系統(tǒng)中,再從控制系統(tǒng)中的數(shù)據(jù)傳到顯示屏上顯示出來。

(5) OLED顯示屏: 主要用來對二氧化碳、溫濕度、光照強(qiáng)度以及土壤濕度傳感器中的數(shù)據(jù)顯示出來。

(6) 蜂鳴器模塊: 主要對二氧化碳濃度、溫濕度、土壤濕度、光照強(qiáng)度等傳感器的采集數(shù)據(jù)是否高過或低于上限、下限值時(shí)蜂鳴器報(bào)警等功能,并提醒用戶。

(7) 繼電器模塊: 主要通過把溫濕度、土壤濕度傳感器中的溫濕度過高時(shí)或過低時(shí),把溫濕度轉(zhuǎn)換成電信號(hào),使通風(fēng)、水泵啟動(dòng)等功能。

(8) 通風(fēng)系統(tǒng): 當(dāng)溫室大棚中環(huán)境溫度過高時(shí),通風(fēng)系統(tǒng)啟動(dòng)對室內(nèi)進(jìn)行通風(fēng),使溫度降下到設(shè)定值內(nèi)通風(fēng)系統(tǒng)關(guān)閉停止工作。

(9) 水泵系統(tǒng): 當(dāng)土壤濕度傳感器檢測土壤濕度低于下限值時(shí),水泵系統(tǒng)開啟進(jìn)行澆水灌溉,當(dāng)土壤濕度到達(dá)土壤濕度傳感器上下限內(nèi),水泵系統(tǒng)關(guān)閉停止工作。

(10) LED補(bǔ)光系統(tǒng): 通過光敏電阻傳感器檢測溫室大棚中環(huán)境光照強(qiáng)度低于下限值時(shí),LED補(bǔ)光系統(tǒng)開啟對農(nóng)作物進(jìn)行補(bǔ)光,當(dāng)光敏電阻傳感器檢測達(dá)到上下限內(nèi)LED補(bǔ)光系統(tǒng)關(guān)閉停止補(bǔ)光。

(11) 按鍵模塊: 主要用來調(diào)采集數(shù)據(jù)模塊的上、下限值,可以通過按鍵切換手動(dòng)和自動(dòng)和云端三種模式,手動(dòng)按鍵控制通風(fēng)系統(tǒng)、LED補(bǔ)光系統(tǒng)、水泵系統(tǒng)打開和關(guān)閉功能。

(12) WIFI模塊: 通過控制系統(tǒng)數(shù)據(jù)處理之后傳輸給外網(wǎng),手機(jī)APP主要用來接收傳來的數(shù)據(jù)顯示出來

(13). 上機(jī)模塊: 監(jiān)控各個(gè)傳感器的采集數(shù)據(jù)工作情況,執(zhí)行硬件工作狀態(tài),也可以通過手機(jī)和華為云物聯(lián)網(wǎng)云平臺(tái)切換手動(dòng)以及自動(dòng)控制模式,對各傳感器的設(shè)置上下限值。

image-20230426105155237image-20230426105657733

二、硬件設(shè)計(jì)

【1】硬件設(shè)計(jì)

本系統(tǒng)硬件設(shè)計(jì)包括控制模塊、傳感器模塊和執(zhí)行模塊三部分。

控制模塊: 該模塊使用STM32F103C8T6單片機(jī)作為主控制器,負(fù)責(zé)處理各個(gè)傳感器的數(shù)據(jù)和控制執(zhí)行模塊。此外,控制模塊還需要與各個(gè)執(zhí)行模塊和外部設(shè)備進(jìn)行通信,以實(shí)現(xiàn)數(shù)據(jù)的處理和傳輸。

傳感器模塊: 傳感器模塊包括溫濕度傳感器、二氧化碳傳感器、光敏電阻傳感器和土壤濕度傳感器,主要負(fù)責(zé)感應(yīng)和采集生長環(huán)境的溫濕度、二氧化碳濃度、光照強(qiáng)度和土壤濕度等參數(shù),并將數(shù)據(jù)傳輸給控制模塊處理。

執(zhí)行模塊: 執(zhí)行模塊包括通風(fēng)系統(tǒng)、LED補(bǔ)光系統(tǒng)、水泵系統(tǒng)等,用于根據(jù)傳感器采集到的數(shù)據(jù)直接或間接地調(diào)節(jié)生長環(huán)境因子,并保證生長環(huán)境達(dá)到穩(wěn)定的狀態(tài)。

【2】軟件設(shè)計(jì)

軟件設(shè)計(jì)主要分為以下四個(gè)模塊:傳感器數(shù)據(jù)采集模塊、數(shù)據(jù)處理模塊、控制模塊和遠(yuǎn)程控制模塊。

傳感器數(shù)據(jù)采集模塊: 該模塊負(fù)責(zé)對傳感器數(shù)據(jù)進(jìn)行采集,包括溫濕度傳感器、二氧化碳傳感器、光敏電阻傳感器和土壤濕度傳感器。采集到的數(shù)據(jù)通過串口接口發(fā)送給控制模塊。

數(shù)據(jù)處理模塊: 該模塊負(fù)責(zé)對采集到的傳感器數(shù)據(jù)進(jìn)行處理,判斷當(dāng)前環(huán)境因子是否超出設(shè)定范圍,如果超出,則觸發(fā)報(bào)警和控制執(zhí)行模塊的操作。同時(shí),該模塊還要將處理后的數(shù)據(jù)發(fā)送給控制模塊進(jìn)行控制操作。

控制模塊: 該模塊負(fù)責(zé)控制執(zhí)行模塊,根據(jù)數(shù)據(jù)處理模塊的指令,啟動(dòng)通風(fēng)系統(tǒng)、LED補(bǔ)光系統(tǒng)、水泵系統(tǒng)等設(shè)備,以保證生長環(huán)境穩(wěn)定和水平。

遠(yuǎn)程控制模塊: 該模塊實(shí)現(xiàn)通過手機(jī)APP和華為云IOT平臺(tái)遠(yuǎn)程管理系統(tǒng),對溫室大棚中的數(shù)據(jù)進(jìn)行修改和設(shè)定新的數(shù)據(jù)。用戶可以通過手機(jī)APP或者華為云IOT平臺(tái),實(shí)時(shí)查看和修改溫室大棚的環(huán)境因子,實(shí)現(xiàn)遠(yuǎn)程控制和管理。

三、華為云IOT平臺(tái)開發(fā)

在華為云IOT平臺(tái)上,需要進(jìn)行設(shè)備接入、數(shù)據(jù)模型定義、規(guī)則引擎配置和應(yīng)用開發(fā)等四個(gè)核心模塊的開發(fā)。其中,設(shè)備接入模塊包括設(shè)備注冊、獲取設(shè)備證書、建立連接等步驟,以保障設(shè)備與云平臺(tái)之間的安全通信;數(shù)據(jù)模型定義模塊需要根據(jù)實(shí)際需求定義相應(yīng)的數(shù)據(jù)模型,包括上傳數(shù)據(jù)格式、設(shè)備屬性和服務(wù)等。規(guī)則引擎配置模塊需要完成實(shí)時(shí)消息推送、遠(yuǎn)程控制和告警等功能。應(yīng)用開發(fā)模塊則是將完整的智能井蓋系統(tǒng)進(jìn)行打包,為用戶提供統(tǒng)一的操作接口。

華為云官網(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/5GNB-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ù)場景。

img

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

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

image-20221204194233414

開通標(biāo)準(zhǔn)版免費(fèi)單元。

image-20230420181306316image-20230420181322092

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

image-20230423111235524

總結(jié):

端口號(hào):  MQTT (1883)| MQTTS (8883)    
接入地址: a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com

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

Microsoft Windows [版本 10.0.19044.2846]
(c) Microsoft Corporation。保留所有權(quán)利。
?
C:Users11266>ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com
?
正在 Ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 字節(jié)的數(shù)據(jù):
來自 121.36.42.100 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=31
來自 121.36.42.100 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=31
來自 121.36.42.100 的回復(fù): 字節(jié)=32 時(shí)間=36ms TTL=31
來自 121.36.42.100 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=31
?
121.36.42.100 的 Ping 統(tǒng)計(jì)信息:
  數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計(jì)時(shí)間(以毫秒為單位):
  最短 = 36ms,最長 = 37ms,平均 = 36ms
?
C:Users11266>
image-20230423111213624

MQTT協(xié)議接入端口號(hào)有兩個(gè),1883是非加密端口,8883是證書加密端口,單片機(jī)無法加載證書,所以使用1883端口比較合適。 接下來的ESP8266就采用1883端口連接華為云物聯(lián)網(wǎng)平臺(tái)。

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

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

點(diǎn)擊右上角創(chuàng)建產(chǎn)品。

image-20230420181503524

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

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

(3)添加自定義模型

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

image-20230420181615129

模型簡單來說: 就是存放設(shè)備上傳到云平臺(tái)的數(shù)據(jù)。比如:環(huán)境溫度、環(huán)境濕度、環(huán)境煙霧濃度、火焰檢測狀態(tài)圖等等,這些我們都可以單獨(dú)創(chuàng)建一個(gè)模型保存。

3.4 添加設(shè)備

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

(1)注冊設(shè)備

點(diǎn)擊右上角注冊設(shè)備。

image-20230421091842025

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

在彈出的對話框里填寫自己設(shè)備的信息。根據(jù)自己設(shè)備詳細(xì)情況填寫。

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

創(chuàng)建完畢之后,點(diǎn)擊保存并關(guān)閉,得到創(chuàng)建的設(shè)備密匙信息。該信息在后續(xù)生成MQTT三元組的時(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是專門針對物聯(lián)網(wǎng)開發(fā)的輕量級(jí)傳輸協(xié)議。MQTT協(xié)議針對低帶寬網(wǎng)絡(luò),低計(jì)算能力的設(shè)備,做了特殊的優(yōu)化,使得其能適應(yīng)各種物聯(lián)網(wǎng)應(yīng)用場景。目前MQTT擁有各種平臺(tái)和設(shè)備上的客戶端,已經(jīng)形成了初步的生態(tài)系統(tǒng)。

MQTT是一種消息隊(duì)列協(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é)議,就可以與華為云平臺(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連接請求數(shù) 無限制
單個(gè)設(shè)備每分鐘支持的最大MQTT連接數(shù) 1
單個(gè)MQTT連接每秒的吞吐量,即帶寬,包含直連設(shè)備和網(wǎng)關(guān) 3KB/s
MQTT單個(gè)發(fā)布消息最大長度,超過此大小的發(fā)布請求將被直接拒絕 1MB
MQTT連接心跳時(shí)間建議值 心跳時(shí)間限定為30至1200秒,推薦設(shè)置為120秒
產(chǎn)品是否支持自定義Topic 支持
消息發(fā)布與訂閱 設(shè)備只能對自己的Topic進(jìn)行消息發(fā)布與訂閱
每個(gè)訂閱請求的最大訂閱數(shù) 無限制

(3)主題訂閱格式

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

image-20221207153310037

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

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

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

對于設(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

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-20230411141412090

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

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

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

(2)生成MQTT三元組

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

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

下面是打開的頁面:

image-20221207154917230

3.7 參考案例

華為云平臺(tái)部署開發(fā)也可以參考這里:

https://bbs.huaweicloud.com/blogs/381072

【基于華為云IOT平臺(tái)實(shí)現(xiàn)多節(jié)點(diǎn)溫度采集(STM32+NBIOT)】

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

【1】DHT11溫濕度數(shù)據(jù)讀取

以下是基于HAL庫的STM32F103ZET6讀取DHT11溫濕度傳感器的代碼:

#include "dht11.h"
?
#define DHT11_GPIO_PORT   GPIOA
#define DHT11_GPIO_PIN   GPIO_PIN_0
?
/* DHT11引腳初始化 */
void DHT11_Init()
{
   GPIO_InitTypeDef GPIO_InitStruct = {0};
?
   /* 打開GPIO時(shí)鐘 */
   __HAL_RCC_GPIOA_CLK_ENABLE();
?
   /* 配置GPIO為推挽輸出模式 */
   GPIO_InitStruct.Pin = DHT11_GPIO_PIN;
   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
   HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
}
?
/* 從DHT11讀取一次溫濕度數(shù)據(jù) */
DHT11_Result_t DHT11_Read_Data()
{
   uint8_t data[5] = {0};
   uint8_t check = 0;
   uint8_t i = 0;
?
   /* 向DHT11發(fā)送起始信號(hào) */
   HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_RESET);
   HAL_Delay(20);
   HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_SET);
   HAL_Delay(30);
?
   /* 切換到輸入模式等待DHT11的響應(yīng) */
   GPIO_InitTypeDef GPIO_InitStruct = {0};
   GPIO_InitStruct.Pin = DHT11_GPIO_PIN;
   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
   GPIO_InitStruct.Pull = GPIO_PULLUP;
   HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
?
   /* 等待DHT11響應(yīng) */
   while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET);
?
   /* 等待DHT11發(fā)送完畢 */
   while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET);
?
   /* 讀取DHT11發(fā)送的數(shù)據(jù) */
   for (i = 0; i < 5; i++) {
? ? ? ?  uint8_t j = 0;
? ? ? ?  for (j = 0; j < 8; j++) {
? ? ? ? ? ?  /* 等待低電平結(jié)束 */
? ? ? ? ? ?  while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET);
??
? ? ? ? ? ?  /* 等待高電平結(jié)束,并記錄時(shí)間 */
? ? ? ? ? ?  uint32_t t = 0;
? ? ? ? ? ?  while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET) {
? ? ? ? ? ? ? ?  t++;
? ? ? ? ? ? ? ?  if (t > 100) break;
       }
?
       /* 根據(jù)時(shí)間計(jì)算數(shù)據(jù)位的值 */
       data[i] <<= 1;
? ? ? ? ? ?  if (t >= 50) {
         data[i] |= 0x01;
       }
     }
   }
?
   /* 切換回輸出模式 */
   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
   HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
?
   /* 驗(yàn)證數(shù)據(jù)的正確性 */
   check = data[0] + data[1] + data[2] + data[3];
   if (check != data[4]) {
     return DHT11_ERROR_CHECKSUM;
   }
?
   /* 讀取溫濕度數(shù)據(jù)結(jié)果 */
   DHT11_Result_t result;
   result.humidity = data[0];
   result.temperature = data[2];
   return result;
}

該代碼基于HAL庫的STM32F103ZET6讀取DHT11溫濕度傳感器的代碼示例:

/* 獲取溫濕度數(shù)據(jù) */
void get_temperature_humidity()
{
   DHT11_Result_t res = DHT11_Read_Data();
   if (res != DHT11_ERROR_CHECKSUM)
   {
     float humidity = res.humidity;
     float temperature = res.temperature;
     printf("溫度:%.1f°C 濕度:%.1f%%RHrn", temperature, humidity);
   }
   else
   {
     printf("讀取失敗,請檢查連接和傳感器是否正常!rn");
   }
}
?
int main()
{
   HAL_Init();
?
   // 初始化串口輸出
   uart_init();
?
   printf("DHT11溫濕度傳感器讀取測試開始rn");
?
   // 初始化DHT11引腳
   DHT11_Init();
?
   while (1)
   {
     // 讀取溫濕度傳感器數(shù)據(jù)
     get_temperature_humidity();
     HAL_Delay(2000);
   }
}

需要注意的是,在主函數(shù)中,我們先初始化了串口輸出和DHT11引腳,然后通過循環(huán)一直讀取溫濕度數(shù)據(jù)并打印輸出。其中,get_temperature_humidity()函數(shù)負(fù)責(zé)調(diào)用DHT11_Read_Data()函數(shù)讀取溫濕度數(shù)據(jù),并將結(jié)果打印出來。如果讀取失敗,get_temperature_humidity()函數(shù)也會(huì)將錯(cuò)誤信息打印出來。

【2】讀取BH1750光敏傳感器的值

以下是基于HAL庫的STM32F103ZET6讀取BH1750光照強(qiáng)度傳感器的代碼:

#include "bh1750.h"
?
/* BH1750地址 */
#define BH1750_ADDR     0x23
?
/* BH1750命令 */
#define BH1750_CMD_POWER_ON    0x01
#define BH1750_CMD_POWER_DOWN   0x00
#define BH1750_CMD_RESET     0x07
#define BH1750_CMD_ONE_TIME_H   0x20
#define BH1750_CMD_ONE_TIME_L   0x23
?
/* BH1750初始化配置 */
void BH1750_Init()
{
   I2C_HandleTypeDef hi2c1 = {0};
   hi2c1.Instance = I2C1;
   hi2c1.Init.ClockSpeed = 200000;
   hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
   hi2c1.Init.OwnAddress1 = 0;
   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
   hi2c1.Init.OwnAddress2 = 0;
   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
   HAL_I2C_Init(&hi2c1);
?
   uint8_t init_data = BH1750_CMD_POWER_ON;
   HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR, &init_data, 1, HAL_MAX_DELAY);
}
?
/* 從BH1750讀取光照強(qiáng)度數(shù)據(jù) */
float BH1750_Read_Lux()
{
   I2C_HandleTypeDef hi2c1 = {0};
   hi2c1.Instance = I2C1;
   hi2c1.Init.ClockSpeed = 200000;
   hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
   hi2c1.Init.OwnAddress1 = 0;
   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
   hi2c1.Init.OwnAddress2 = 0;
   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
   HAL_I2C_Init(&hi2c1);
?
   /* 發(fā)送手動(dòng)讀取命令 */
   uint8_t cmd_data = BH1750_CMD_ONE_TIME_H;
   HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR, &cmd_data, 1, HAL_MAX_DELAY);
?
   /* 等待讀取完成 */
   HAL_Delay(180);
?
   /* 讀取數(shù)據(jù) */
   uint8_t buf[2];
   HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDR, buf, 2, HAL_MAX_DELAY);
?
   /* 計(jì)算光照強(qiáng)度 */
   uint16_t val = (buf[0] << 8) | buf[1];
? ?  float lux = val / 1.2;
? ?  return lux;
?}

該代碼首先在BH1750_Init()函數(shù)中初始化了I2C相關(guān)的參數(shù),并使用HAL_I2C_Master_Transmit()函數(shù)向BH1750發(fā)送了開啟電源的命令。在BH1750_Read_Lux()函數(shù)中,我們首先發(fā)送手動(dòng)讀取命令,等待數(shù)據(jù)準(zhǔn)備完成后,使用 HAL_I2C_Master_Receive() 函數(shù)讀取BH1750返回的2字節(jié)數(shù)據(jù)。隨后通過計(jì)算獲得光照強(qiáng)度值。

使用時(shí),只需要在主函數(shù)中調(diào)用BH1750_Init()函數(shù)初始化I2C參數(shù)和發(fā)送開啟電源命令,然后在需要讀取光照強(qiáng)度數(shù)據(jù)時(shí)調(diào)用BH1750_Read_Lux()函數(shù)即可,如下所示:

int main(void) 
{
   HAL_Init();
?
   /* 初始化BH1750 */
   BH1750_Init();
?
   /* 讀取BH1750光照強(qiáng)度 */
   float lux = BH1750_Read_Lux();
   printf("光照強(qiáng)度:%.1f Luxrn", lux);
?
   while (1) 
   {
     /* 主程序循環(huán),可以進(jìn)行其他操作或等待 */
   }
}

五、總結(jié)

當(dāng)前設(shè)計(jì)實(shí)現(xiàn)了一款基于STM32單片機(jī)的智能溫室大棚監(jiān)控系統(tǒng),該系統(tǒng)通過多種傳感器實(shí)現(xiàn)環(huán)境因子的實(shí)時(shí)監(jiān)測和數(shù)據(jù)上傳,在應(yīng)用上具有重要的作用和應(yīng)用價(jià)值。整體介紹了系統(tǒng)硬件和軟件設(shè)計(jì)的各個(gè)環(huán)節(jié),提供了一定的參考價(jià)值和設(shè)計(jì)思路。同時(shí),該系統(tǒng)還可以在未來加入更多的傳感器和控制設(shè)備,提升溫室大棚監(jiān)控系統(tǒng)的智能化和自動(dòng)化程度。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2553

    文章

    51390

    瀏覽量

    756567
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2913

    文章

    44923

    瀏覽量

    376994
  • STM32
    +關(guān)注

    關(guān)注

    2272

    文章

    10923

    瀏覽量

    357551
  • IOT
    IOT
    +關(guān)注

    關(guān)注

    187

    文章

    4230

    瀏覽量

    197595
  • 華為云
    +關(guān)注

    關(guān)注

    3

    文章

    2682

    瀏覽量

    17586
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Zigbee溫室大棚智能監(jiān)控系統(tǒng)

    的自然條件下,故障率高,容易出現(xiàn)故障隱患,當(dāng)環(huán)境內(nèi)線出現(xiàn)問題時(shí),維修人員難以展開工作排查故障,不能滿足溫室大棚智能監(jiān)控的安全運(yùn)行。三、系統(tǒng)實(shí)
    發(fā)表于 04-18 17:52

    基于stm32溫室大棚控制

    本人剛學(xué)stm32,想要參照別人做出的項(xiàng)目,例如一個(gè)基于stm32溫室大棚控制項(xiàng)目,里面需要對環(huán)境因素(光照、濕度、溫度)采集數(shù)據(jù)并且與自身設(shè)定值比較后用于反饋以此達(dá)到
    發(fā)表于 07-22 14:16

    labview 溫室大棚監(jiān)控

    labview 溫室大棚監(jiān)控
    發(fā)表于 04-06 10:00

    【MiCOKit申請】基于手機(jī)APP客戶端的溫室大棚參數(shù)監(jiān)控系統(tǒng)

    傳輸裝置傳送給溫室調(diào)控系統(tǒng)的主機(jī),主機(jī)根據(jù)APP發(fā)來的指令對各個(gè)執(zhí)行機(jī)構(gòu)(如電風(fēng)扇、加熱器、加濕器、燈光、電磁閥等)開關(guān)狀態(tài)進(jìn)行改變,從而實(shí)現(xiàn)對溫室大棚
    發(fā)表于 08-13 08:23

    基于機(jī)智IoT開發(fā)平臺(tái)的溫室番茄遠(yuǎn)程監(jiān)控系統(tǒng)

    摘要: 設(shè)計(jì)了基于機(jī)智IoT開發(fā)平臺(tái)的溫室番茄遠(yuǎn)程監(jiān)控系統(tǒng),上位機(jī)由手機(jī)APP終端和機(jī)智平臺(tái)
    發(fā)表于 05-18 17:36

    LoRa無線組網(wǎng)如何助力溫室大棚智能監(jiān)控

    LoRa無線組網(wǎng)如何助力溫室大棚智能監(jiān)控
    發(fā)表于 06-16 09:18

    請問怎樣去設(shè)計(jì)一種基于GPRS的溫室大棚監(jiān)控系統(tǒng)

    溫室大棚監(jiān)控系統(tǒng)是由哪些部分組成的?怎樣去設(shè)計(jì)溫室大棚監(jiān)控
    發(fā)表于 07-05 06:43

    基于PC主機(jī)和Android的溫室大棚監(jiān)控管理信息系統(tǒng)設(shè)計(jì)

    現(xiàn)代信息技術(shù)研究與開發(fā)智能溫室大棚監(jiān)控系統(tǒng),進(jìn)行多方位多點(diǎn)信息的精確采集和實(shí)時(shí)控制,是本課題研究的任務(wù).本文基于PC主機(jī)和Android平臺(tái)
    發(fā)表于 07-26 08:03

    基于機(jī)智物聯(lián)網(wǎng)平臺(tái)的智能溫室大棚控制系統(tǒng)

    控制加濕器和排風(fēng)扇,實(shí)時(shí)監(jiān)控和改善溫室大棚工作狀態(tài)。現(xiàn)場答辯+產(chǎn)品演示,獲得一致好評(píng)。正文摘取畢設(shè)項(xiàng)目部分進(jìn)行介紹。機(jī)智AIoT自助開發(fā)平臺(tái)提供了多種在線工具、多型號(hào)Gagent固件
    發(fā)表于 08-04 08:17

    怎樣去設(shè)計(jì)一種基于GPRS的溫室大棚監(jiān)控系統(tǒng)

    基于GPRS的溫室大棚監(jiān)控系統(tǒng)是由哪些部分組成?怎樣去設(shè)計(jì)一種基于GPRS的溫室大棚
    發(fā)表于 10-09 08:59

    怎樣去設(shè)計(jì)一種基于物聯(lián)網(wǎng)和STM32智能溫室大棚控制系統(tǒng)

    基于物聯(lián)網(wǎng)和STM32智能溫室大棚控制系統(tǒng)有何功能?怎樣去設(shè)計(jì)一種基于物聯(lián)網(wǎng)和STM32
    發(fā)表于 10-14 07:14

    基于NB-IoT技術(shù)智能溫室大棚溫濕度檢測系統(tǒng)

    u3000u3000基于窄帶物聯(lián)網(wǎng)NB-IoT(Narrow Band-Internet of Things) 技術(shù),設(shè)計(jì)一種智能溫室大棚溫濕度檢測
    發(fā)表于 09-26 07:37

    智能溫室大棚管理方式是怎樣的

    智能溫室大棚控制系統(tǒng)是針對溫室大棚正常有效運(yùn)轉(zhuǎn)的控制要求配置的遠(yuǎn)程
    發(fā)表于 04-21 16:01 ?1648次閱讀

    智慧農(nóng)業(yè)溫室大棚種植監(jiān)控系統(tǒng)

    背景介紹將物聯(lián)網(wǎng)平臺(tái)應(yīng)用于農(nóng)業(yè)溫室大棚種植上,使用藍(lán)蜂的邏輯控制器CLC-16R安裝在農(nóng)業(yè)溫室大棚
    的頭像 發(fā)表于 07-26 10:11 ?1734次閱讀
    智慧農(nóng)業(yè)<b class='flag-5'>溫室</b><b class='flag-5'>大棚</b>種植<b class='flag-5'>監(jiān)控</b><b class='flag-5'>系統(tǒng)</b>

    智能農(nóng)業(yè)溫室大棚環(huán)境監(jiān)控系統(tǒng)應(yīng)用方案

    優(yōu)勢,成為推動(dòng)現(xiàn)代農(nóng)業(yè)轉(zhuǎn)型升級(jí)的重要力量。 智能農(nóng)業(yè)溫室大棚環(huán)境監(jiān)控系統(tǒng),集數(shù)據(jù)采集、傳輸、處理、分析及
    的頭像 發(fā)表于 09-25 17:33 ?404次閱讀
    新乐市| 新东方百家乐官网娱乐城| 366百家乐娱乐城| 娱乐城送| 三国百家乐官网的玩法技巧和规则 | 大发888 迅雷快传| 澳门赌百家乐官网打法| 百家乐与21点| 哪个百家乐官网网站最大| 真人百家乐蓝盾娱乐平台| 太阳城百家乐官网软件| 百家乐游戏接口| 百家乐官网有无规律可循| 皇冠百家乐在线游戏| 百家乐官网不倒翁缺点| 麻将百家乐筹码| 澳门百家乐官网技巧皇冠网| 夜总会百家乐的玩法技巧和规则 | 百家乐游戏单机牌| 百家乐官网娱乐城体育| 百家乐vshow| 澳门百家乐官网规例| 大发888娱乐城新澳博| 鑫鼎百家乐官网的玩法技巧和规则| 大发888官方授权网| 澳门百家乐官网规| 永利| 百家乐览| 网上百家乐官网是假| 大发888娱乐城网站| 免费百家乐官网预测工具| 曲靖市| 五张百家乐的玩法技巧和规则| 赌场百家乐官网技巧| 大发888官网官方下载| 微信百家乐官网群资源| 水果机赌博| 网络百家乐的玩法技巧和规则| 百家乐官网游戏机压法| 威尼斯人娱乐城老品牌值得信赖| 百家乐官网平客户端|