一、前言
1.1 項(xiàng)目開發(fā)背景
隨著現(xiàn)代農(nóng)業(yè)的快速發(fā)展,溫室大棚已成為提高作物產(chǎn)量和質(zhì)量的重要設(shè)施。然而,大棚環(huán)境的控制和管理仍面臨諸多挑戰(zhàn),尤其是溫濕度的調(diào)節(jié)。大棚內(nèi)的溫濕度直接影響作物的生長和產(chǎn)量,而傳統(tǒng)的人工管理方式存在不小的局限性,如勞動強(qiáng)度大、反應(yīng)速度慢和操作不精確等。因此,采用自動化控制系統(tǒng)對大棚環(huán)境進(jìn)行監(jiān)測和調(diào)節(jié),成為提高生產(chǎn)效率和降低人工成本的關(guān)鍵。
近年來,物聯(lián)網(wǎng)技術(shù)和嵌入式系統(tǒng)的迅速發(fā)展為智能農(nóng)業(yè)提供了新的解決方案。通過集成傳感器、執(zhí)行器、無線通信模塊等硬件設(shè)備,結(jié)合先進(jìn)的控制算法,可以實(shí)時監(jiān)控大棚內(nèi)的環(huán)境變化,并自動進(jìn)行調(diào)節(jié)。這不僅能夠確保大棚內(nèi)的溫濕度始終維持在作物生長的最佳范圍,還能實(shí)現(xiàn)遠(yuǎn)程監(jiān)控與管理,使農(nóng)業(yè)生產(chǎn)更加智能化、精準(zhǔn)化。
為了應(yīng)對這一需求,本項(xiàng)目基于STM32開發(fā)了一套大棚自動通風(fēng)系統(tǒng),旨在通過溫濕度監(jiān)測、自動風(fēng)扇控制、報警功能等一系列自動化操作,優(yōu)化大棚內(nèi)的環(huán)境條件。該系統(tǒng)能夠?qū)崟r采集溫濕度數(shù)據(jù),并根據(jù)預(yù)設(shè)的閾值自動開啟或關(guān)閉風(fēng)扇,確保大棚內(nèi)的溫濕度始終處于適宜范圍。此外,通過手動控制、數(shù)據(jù)可視化、歷史數(shù)據(jù)記錄等功能,用戶可以靈活地調(diào)整和查看大棚環(huán)境數(shù)據(jù),從而實(shí)現(xiàn)更高效的管理。
在硬件方面,選用了STM32F103RCT6主控芯片,其具備較強(qiáng)的處理能力和豐富的外設(shè)接口,能夠滿足本項(xiàng)目對實(shí)時監(jiān)控和控制的需求。溫濕度傳感器SHT30提供高精度的溫濕度測量,Wi-Fi模塊ESP8266則支持?jǐn)?shù)據(jù)遠(yuǎn)程傳輸,便于實(shí)現(xiàn)大棚遠(yuǎn)程監(jiān)控和控制。通過集成這些硬件,系統(tǒng)能夠提供一個高效、穩(wěn)定、智能的環(huán)境控制方案,進(jìn)一步推動智能農(nóng)業(yè)的發(fā)展。
1.2 設(shè)計(jì)實(shí)現(xiàn)的功能
(1)環(huán)境監(jiān)測功能
系統(tǒng)通過溫濕度傳感器SHT30實(shí)時監(jiān)測大棚內(nèi)的溫度和濕度,并提供實(shí)時的數(shù)據(jù)反饋。傳感器能夠精確地獲取環(huán)境數(shù)據(jù),為后續(xù)的控制和決策提供可靠的依據(jù)。
(2)自動開關(guān)風(fēng)扇控制
根據(jù)監(jiān)測到的溫濕度數(shù)據(jù),系統(tǒng)能夠自動控制風(fēng)扇的開啟或關(guān)閉。當(dāng)溫度超過設(shè)定的上限值時,系統(tǒng)自動開啟風(fēng)扇進(jìn)行通風(fēng),幫助降低溫度;當(dāng)溫濕度恢復(fù)到設(shè)定的范圍內(nèi)時,系統(tǒng)自動關(guān)閉風(fēng)扇,從而保證大棚內(nèi)的環(huán)境始終處于適宜范圍。
(3)手動控制功能
在自動控制模式下,用戶可以通過按鍵或手機(jī)APP手動控制風(fēng)扇的開關(guān),便于應(yīng)對特殊情況或緊急需求。該功能提供靈活性,確保用戶能夠隨時對系統(tǒng)進(jìn)行干預(yù)。
(4)數(shù)據(jù)可視化
系統(tǒng)通過OLED顯示屏實(shí)時顯示大棚內(nèi)的溫濕度數(shù)據(jù),用戶可以直觀地查看當(dāng)前環(huán)境狀況。該功能簡化了信息呈現(xiàn),幫助用戶快速獲取重要數(shù)據(jù),做出相應(yīng)決策。
(5)報警功能
當(dāng)溫度或濕度超過設(shè)定的閾值時,系統(tǒng)會發(fā)出警報,提醒用戶進(jìn)行干預(yù)。警報通過蜂鳴器發(fā)出聲音信號,確保用戶能夠及時發(fā)現(xiàn)問題并采取措施。
(6)歷史數(shù)據(jù)記錄
系統(tǒng)能夠存儲一定時間范圍內(nèi)的溫濕度數(shù)據(jù),并允許用戶查看歷史數(shù)據(jù)。通過記錄歷史數(shù)據(jù),用戶可以進(jìn)行數(shù)據(jù)分析和趨勢預(yù)測,幫助調(diào)整大棚管理策略。
(7)定時功能
系統(tǒng)支持定時開關(guān)風(fēng)扇的功能,用戶可以設(shè)置特定時間段內(nèi)自動進(jìn)行通風(fēng)。這一功能能夠減少人工干預(yù),優(yōu)化工作流程,提升系統(tǒng)的自動化水平。
(8)遠(yuǎn)程控制與監(jiān)控功能
通過Wi-Fi模塊ESP8266,系統(tǒng)可以將溫濕度數(shù)據(jù)實(shí)時傳輸至可視化網(wǎng)頁,用戶可以通過瀏覽器遠(yuǎn)程查看大棚的環(huán)境數(shù)據(jù)并控制風(fēng)扇的開關(guān)。這一功能使得用戶能夠隨時隨地監(jiān)控和管理大棚的環(huán)境,提高系統(tǒng)的智能化水平。
(9)服務(wù)器后端與數(shù)據(jù)處理
本系統(tǒng)的后端服務(wù)器采用Python語言進(jìn)行開發(fā),負(fù)責(zé)接收從設(shè)備端上傳的數(shù)據(jù),并將其展示在可視化網(wǎng)頁上。用戶可以通過網(wǎng)頁查看大棚的實(shí)時數(shù)據(jù)與歷史記錄。此外,服務(wù)器支持本地部署和云端部署兩種方式,滿足不同用戶需求。
1.3 項(xiàng)目硬件模塊組成
(1)主控芯片:STM32F103RCT6
STM32F103RCT6是一款基于ARM Cortex-M3架構(gòu)的微控制器,具備強(qiáng)大的處理能力和豐富的外設(shè)接口,適用于本項(xiàng)目對實(shí)時控制和數(shù)據(jù)處理的需求。它負(fù)責(zé)處理傳感器采集的數(shù)據(jù)、控制風(fēng)扇開關(guān)、管理報警功能以及與Wi-Fi模塊通信。
(2)溫濕度傳感器:SHT30
SHT30是一款高精度的溫濕度傳感器,能夠?qū)崟r監(jiān)測大棚內(nèi)的溫度和濕度。其測量范圍廣、響應(yīng)速度快、精度高,適合用于大棚環(huán)境的實(shí)時監(jiān)測,提供準(zhǔn)確的數(shù)據(jù)輸入給主控芯片進(jìn)行后續(xù)處理和控制。
(3)通風(fēng)風(fēng)扇:繼電器控制
風(fēng)扇通過繼電器進(jìn)行控制。繼電器的作用是根據(jù)主控芯片發(fā)出的控制信號,開關(guān)風(fēng)扇電源,從而實(shí)現(xiàn)風(fēng)扇的啟停。繼電器的選擇要考慮其負(fù)載能力,以確保穩(wěn)定可靠地控制風(fēng)扇。
(4)Wi-Fi模塊:ESP8266
ESP8266是一個低功耗的Wi-Fi模塊,支持與主控芯片進(jìn)行無線通信,將溫濕度數(shù)據(jù)上傳到服務(wù)器,并支持遠(yuǎn)程控制風(fēng)扇的開關(guān)。ESP8266能夠?qū)崿F(xiàn)大棚環(huán)境數(shù)據(jù)的無線傳輸和遠(yuǎn)程監(jiān)控功能,使用戶可以通過智能設(shè)備或網(wǎng)頁實(shí)時查看數(shù)據(jù)并進(jìn)行操作。
(5)顯示屏:0.96寸OLED
0.96寸OLED顯示屏用于顯示大棚內(nèi)的實(shí)時溫濕度數(shù)據(jù)。OLED顯示屏具有高對比度、低功耗、清晰可讀等優(yōu)點(diǎn),適合用于小型嵌入式顯示應(yīng)用。用戶可以通過此顯示屏直觀地查看環(huán)境數(shù)據(jù)。
(6)水汽檢測:雨滴傳感器
雨滴傳感器用于檢測大棚內(nèi)的水汽狀況,能夠在出現(xiàn)水滴或潮濕情況時發(fā)出信號。該模塊有助于檢測是否有過多水分積聚,從而對大棚的濕度進(jìn)行更精確的控制和預(yù)警。
(7)蜂鳴器:有源蜂鳴器
蜂鳴器用于系統(tǒng)的報警功能。當(dāng)溫濕度超出設(shè)定閾值時,蜂鳴器會發(fā)出警報聲,提醒用戶進(jìn)行干預(yù)。此蜂鳴器采用高電平觸發(fā)方式,能夠在短時間內(nèi)提供明顯的聲音提示。
(8)電源模塊
電源模塊為系統(tǒng)提供穩(wěn)定的電力支持。系統(tǒng)中的各個硬件組件(如主控芯片、Wi-Fi模塊、風(fēng)扇等)都需要穩(wěn)定的電源來保障其正常工作。電源模塊會根據(jù)需要為不同模塊提供相應(yīng)的電壓和電流。
1.4 設(shè)計(jì)思路
本項(xiàng)目的設(shè)計(jì)思路是以溫濕度控制為核心,結(jié)合現(xiàn)代物聯(lián)網(wǎng)技術(shù),通過集成多種傳感器和執(zhí)行器,打造一個自動化、大數(shù)據(jù)化、遠(yuǎn)程可控的大棚環(huán)境監(jiān)測與控制系統(tǒng)。系統(tǒng)的設(shè)計(jì)遵循智能化、自動化、穩(wěn)定性和用戶友好的原則,目的是通過自動化手段降低人工干預(yù),提高大棚環(huán)境的管理效率和作物生長條件的優(yōu)化。
系統(tǒng)通過高精度的溫濕度傳感器SHT30實(shí)時監(jiān)測大棚內(nèi)的溫度和濕度數(shù)據(jù)。溫濕度是影響作物生長的關(guān)鍵因素,因此實(shí)時監(jiān)測這些數(shù)據(jù)是系統(tǒng)的基礎(chǔ)。通過STM32F103RCT6微控制器采集并處理傳感器數(shù)據(jù),控制風(fēng)扇及報警系統(tǒng),根據(jù)預(yù)設(shè)的閾值進(jìn)行自動調(diào)節(jié)。當(dāng)溫濕度超出設(shè)定范圍時,控制風(fēng)扇自動啟動或停止,維持大棚內(nèi)的環(huán)境在最適宜的范圍內(nèi)。
為了提升系統(tǒng)的智能化水平,本設(shè)計(jì)加入了Wi-Fi模塊ESP8266,將大棚內(nèi)的溫濕度數(shù)據(jù)通過無線網(wǎng)絡(luò)上傳至遠(yuǎn)程服務(wù)器。服務(wù)器將數(shù)據(jù)進(jìn)行處理并展示在網(wǎng)頁端,用戶可以隨時隨地通過瀏覽器查看大棚內(nèi)的環(huán)境狀態(tài)。此外,系統(tǒng)還提供遠(yuǎn)程控制風(fēng)扇開關(guān)的功能,用戶可在不同地點(diǎn)通過智能設(shè)備實(shí)現(xiàn)對大棚的實(shí)時管理和調(diào)控,進(jìn)一步提高了系統(tǒng)的靈活性與可控性。
在設(shè)計(jì)過程中,還特別考慮到用戶的易用性和操作便捷性。系統(tǒng)提供了OLED顯示屏,用于實(shí)時顯示當(dāng)前溫濕度數(shù)據(jù),用戶無需額外工具就能快速查看大棚的環(huán)境狀態(tài)。同時,系統(tǒng)還具有手動控制功能,用戶可以通過按鍵或APP隨時干預(yù)系統(tǒng)工作,解決特殊情況下的緊急需求。為了確保安全與及時干預(yù),系統(tǒng)設(shè)定了溫濕度報警功能,當(dāng)環(huán)境參數(shù)異常時,蜂鳴器將發(fā)出警報,提醒用戶采取行動。
為了確保數(shù)據(jù)的長期穩(wěn)定性和參考價值,系統(tǒng)具有歷史數(shù)據(jù)記錄和分析功能。系統(tǒng)會定期保存溫濕度數(shù)據(jù),用戶可以查看歷史記錄,分析環(huán)境變化趨勢,進(jìn)而做出更精確的管理決策。此外,定時功能的加入讓風(fēng)扇的控制更具靈活性,用戶可以設(shè)置在特定時間段自動開啟風(fēng)扇,進(jìn)一步減少了人工操作的頻次。
整體設(shè)計(jì)將硬件和軟件緊密結(jié)合,注重每個環(huán)節(jié)的性能與穩(wěn)定性。通過高效的數(shù)據(jù)采集、智能的控制策略和簡便的操作界面,系統(tǒng)能夠?yàn)榇笈锕芾硖峁?qiáng)有力的支持,幫助用戶輕松實(shí)現(xiàn)環(huán)境的自動調(diào)節(jié)與監(jiān)控,優(yōu)化大棚的生產(chǎn)效率和作物的生長環(huán)境。
1.5 系統(tǒng)功能總結(jié)
功能模塊 | 功能描述 |
環(huán)境監(jiān)測功能 | 通過溫濕度傳感器實(shí)時監(jiān)測大棚內(nèi)的溫度和濕度,提供實(shí)時數(shù)據(jù)反饋。 |
自動開關(guān)風(fēng)扇控制 | 根據(jù)溫濕度數(shù)據(jù)自動控制風(fēng)扇的開關(guān),保持大棚內(nèi)的溫濕度在預(yù)設(shè)范圍內(nèi)。 |
手動控制功能 | 提供手動模式,用戶可通過按鍵或APP控制風(fēng)扇開關(guān),適應(yīng)特殊情況或緊急需求。 |
數(shù)據(jù)可視化 | 通過OLED顯示屏顯示實(shí)時的溫濕度數(shù)據(jù),方便用戶查看大棚環(huán)境狀況。 |
報警功能 | 當(dāng)溫濕度超過設(shè)定閾值時,通過蜂鳴器發(fā)出報警信號,提醒用戶采取措施。 |
歷史數(shù)據(jù)記錄 | 存儲一段時間內(nèi)的溫濕度數(shù)據(jù),支持用戶查看歷史記錄,進(jìn)行數(shù)據(jù)分析和趨勢預(yù)測。 |
定時功能 | 支持設(shè)置定時開關(guān)風(fēng)扇的功能,用戶可以設(shè)定特定時間段內(nèi)自動開啟風(fēng)扇。 |
遠(yuǎn)程控制與監(jiān)控功能 | 通過Wi-Fi模塊,遠(yuǎn)程上傳溫濕度數(shù)據(jù)并在網(wǎng)頁端展示,用戶可以通過智能設(shè)備遠(yuǎn)程查看并控制風(fēng)扇。 |
服務(wù)器數(shù)據(jù)處理 | 后端服務(wù)器使用Python接收數(shù)據(jù)并展示在可視化網(wǎng)頁上,支持本地和云端部署,滿足不同的訪問需求。 |
1.6 參考文獻(xiàn)
1.?應(yīng)耿寧,陳啟東,樓澤華等.基于STM32的大棚智能通風(fēng)系統(tǒng)的設(shè)計(jì)與研究[J].機(jī)電工程技術(shù),2019.
2.?潘金珠,王興元,肖云龍等.基于物聯(lián)網(wǎng)的溫室大棚系統(tǒng)設(shè)計(jì)[J].傳感器與微系統(tǒng),2014.
3.?哈爾濱石油學(xué)院.基于ZigBee的智能農(nóng)業(yè)溫室大棚控制系統(tǒng)的設(shè)計(jì)[J].長江信息通信,2024.
4.?沈筱予,黃葆華,徐超等.基于STM32和物聯(lián)網(wǎng)云平臺的農(nóng)業(yè)環(huán)境監(jiān)控系統(tǒng)的設(shè)計(jì)[J].現(xiàn)代信息科技,2022.
5.?劉文生.基于物聯(lián)網(wǎng)智慧溫室大棚監(jiān)測控制系統(tǒng)[J].電子元器件與信息技術(shù),2021.
6.?陳卓.基于樹莓派的大棚聯(lián)網(wǎng)監(jiān)控系統(tǒng)的研究與設(shè)計(jì)[D].西安工業(yè)大學(xué),2018.
7.?齊齊哈爾大學(xué)計(jì)算機(jī)與控制工程學(xué)院.基于無線Mesh網(wǎng)絡(luò)的智慧農(nóng)業(yè)大棚監(jiān)控系統(tǒng)[J].現(xiàn)代電子技術(shù),2016.
8.?彭高豐.溫室大棚環(huán)境智能自動測量與調(diào)節(jié)系統(tǒng)研究[J].計(jì)算機(jī)測量與控制,2012.
9.?陳榮榮,顧靖峰.智能農(nóng)業(yè)溫室環(huán)境遠(yuǎn)程監(jiān)控系統(tǒng)在蔬菜基地的實(shí)踐應(yīng)用[J].農(nóng)業(yè)裝備技術(shù),2014.
10.?PDFC.?Saha,?Qianying?Yi?et?al.?“Opening?Size?Effects?on?Airflow?Pattern?and?Airflow?Rate?of?a?Naturally?Ventilated?Dairy?Building—A?CFD?Study.”?Applied?Sciences(2020).
11.?付克蘭.基于物聯(lián)網(wǎng)的溫室大棚智能監(jiān)測控制系統(tǒng)[J].科技資訊,2017.
12.?孔國利,蘇玉.日照溫室大棚自動卷簾機(jī)與智能通風(fēng)控制系統(tǒng)設(shè)計(jì)[J].湖北農(nóng)業(yè)科學(xué),2015.
13.?PDFU.?Yeo,?Sang-yeon?Lee?et?al.?“Rooftop?Greenhouse:?(1)?Design?and?Validation?of?a?BES?Model?for?a?Plastic-Covered?Greenhouse?Considering?the?Tomato?Crop?Model?and?Natural?Ventilation?Characteristics.”?Agriculture(2022).
14.?朱宇娟.智能溫室大棚全方位調(diào)溫系統(tǒng)創(chuàng)新設(shè)計(jì)與應(yīng)用[J].黑龍江糧食,2023.
15.?郭琳,張孝存,韓文霆等.基于多能互補(bǔ)的光伏木耳大棚智慧控制系統(tǒng)設(shè)計(jì)[J].西北農(nóng)林科技大學(xué)學(xué)報(自然科學(xué)版),2019.
16.?上海理工大學(xué)光電信息與計(jì)算機(jī)工程學(xué)院2.?北京東方振動和噪聲技術(shù)研究所.基于嵌入式的智能農(nóng)場設(shè)計(jì)與實(shí)現(xiàn).第十一屆全國信號和智能信息處理與應(yīng)用學(xué)術(shù)會議???2017.?
17.?PDFLei.?Zhang,?Xingan?Liu?et?al.?“A?microenvironment?prediction?model?for?Chinese?solar?greenhouses?based?on?the?bond?graph?approach.”?PLoS?ONE(2022).
18.?朱李寒.北方溫室大棚卷簾控制系統(tǒng)設(shè)計(jì)[J].農(nóng)技服務(wù),2017.
19.?張逢雪,王香婷,王通生等.基于STM32單片機(jī)的無線智能家居控制系統(tǒng)[J].自動化技術(shù)與應(yīng)用,2011.
20.?宋德俊,王冰峰.模糊控制在溫室噴灌自動控制中的應(yīng)用[J].控制工程,2005.
21.?李凱,麻紅昭.基于STM32的溫室環(huán)境監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].工業(yè)控制計(jì)算機(jī),2015.
22.?吳佳偉,朱桂兵,王成等.基于PLC的小型智慧大棚蔬果生長環(huán)境監(jiān)控系統(tǒng)設(shè)計(jì)[J].福建農(nóng)機(jī),2022.
23.?PDFA.?Bekraoui,?H.?Fatnassi?et?al.?“Study?of?Microclimate?and?Sapling?Citrus?Plant?Transpiration?in?Tunnel?Greenhouse?Under?Mediterranean?Conditions.”?Acta?Technologica?Agriculturae(2022)..?Nitra,?Slovaca?Universitas?Agriculturae?Nitriae.
24.?張道輝,曲健祿,黃華等.果蔬保護(hù)地栽培棚溫自動調(diào)控系統(tǒng)[J].農(nóng)業(yè)機(jī)械,2004.
25.?韓永佳.基于Arduino的蔬菜大棚智能灌溉控制系統(tǒng)設(shè)計(jì)[J].山西水利科技,2016.
26.?劉永濤,劉佳,吳金順.基于MSP430與單總線的溫室監(jiān)控終端的設(shè)計(jì)[J].中國農(nóng)機(jī)化學(xué)報,2015.
27.?陳高鋒,熊剛,龍建明等.基于STM32和ZigBee的小型溫室環(huán)境控制系統(tǒng)設(shè)計(jì)[J].江蘇農(nóng)業(yè)科學(xué),2017.
28.?PDFG.?Zhao,?Haiyan?Tu?et?al.?“A?Design?of?Magic?Cube?Robot?Based?on?STM32.”?IOP?Conference?Series:?Materials?Science?and?Engineering(2018)..?Guoyou?Zhao.
29.?PDFU.?El-Behairy.?“Simple?Substrate?Culture?in?Arid?Lands.”?(2015)..?IntechOpen.
30.?華中師范大學(xué)物理科學(xué)與技術(shù)學(xué)院.基于物聯(lián)網(wǎng)的智能澆花系統(tǒng)[J].電子測量技術(shù),2020.
1.7 模塊的技術(shù)詳情介紹
1.?主控芯片:STM32F103RCT6
STM32F103RCT6是意法半導(dǎo)體(STMicroelectronics)推出的基于ARM Cortex-M3架構(gòu)的32位微控制器。它擁有高效的運(yùn)算能力和豐富的外設(shè)接口,適合進(jìn)行嵌入式系統(tǒng)開發(fā)。該芯片的主頻可達(dá)72MHz,具備64KB的Flash存儲和20KB的SRAM,適用于實(shí)時數(shù)據(jù)處理和控制任務(wù)。STM32F103RCT6支持多種通信協(xié)議(如SPI、I2C、USART等),能夠與傳感器、顯示器、繼電器、Wi-Fi模塊等設(shè)備進(jìn)行高效通信,是本系統(tǒng)中核心的數(shù)據(jù)處理和控制單元。
2.?溫濕度傳感器:SHT30
SHT30是由瑞士Sensirion公司生產(chǎn)的高精度數(shù)字溫濕度傳感器。它使用I2C通信協(xié)議,能夠提供溫度和濕度的實(shí)時數(shù)字輸出,精度高,響應(yīng)速度快。其測量范圍為溫度-40°C至+125°C,濕度0%RH至100%RH,適用于各種環(huán)境監(jiān)測。SHT30的低功耗特點(diǎn)使其非常適合長時間工作的嵌入式系統(tǒng),且其穩(wěn)定性和可靠性在環(huán)境監(jiān)測中表現(xiàn)優(yōu)異。
3.?通風(fēng)風(fēng)扇:繼電器控制
在本項(xiàng)目中,通風(fēng)風(fēng)扇通過繼電器進(jìn)行控制。繼電器是一種電磁開關(guān)設(shè)備,可以在主控芯片通過低電平信號激活時打開或關(guān)閉風(fēng)扇電源。繼電器通常用于控制較大電流的負(fù)載,如風(fēng)扇等電器設(shè)備。本項(xiàng)目使用的繼電器具備較高的負(fù)載能力,可以可靠地驅(qū)動風(fēng)扇工作,同時避免直接使用微控制器直接驅(qū)動高電流負(fù)載的風(fēng)險。
4.?Wi-Fi模塊:ESP8266
ESP8266是一款低功耗的Wi-Fi模塊,由Espressif Systems公司生產(chǎn),廣泛應(yīng)用于物聯(lián)網(wǎng)(IoT)設(shè)備中。它具有內(nèi)置的Wi-Fi功能,支持802.11 b/g/n協(xié)議,能夠?qū)崿F(xiàn)無線通信,將數(shù)據(jù)從傳感器上傳到服務(wù)器,或者接收控制命令。ESP8266支持AT指令集,也可以通過Arduino或其他平臺進(jìn)行編程控制。在本項(xiàng)目中,ESP8266用于將溫濕度數(shù)據(jù)上傳至遠(yuǎn)程服務(wù)器,并支持通過網(wǎng)頁進(jìn)行遠(yuǎn)程控制。
5.?顯示屏:0.96寸OLED
0.96寸OLED顯示屏是一款小尺寸、高對比度的顯示模塊,常用于嵌入式項(xiàng)目中。它通常使用I2C通信協(xié)議,與主控芯片連接,能夠顯示溫濕度等實(shí)時數(shù)據(jù)。OLED屏幕沒有背光,顯示效果清晰且省電,尤其適合在低功耗的嵌入式系統(tǒng)中使用。該顯示屏具有128x64像素的分辨率,能夠清晰地呈現(xiàn)溫度和濕度數(shù)據(jù),幫助用戶快速查看大棚環(huán)境狀況。
6.?水汽檢測:雨滴傳感器
? 雨滴傳感器用于檢測大棚內(nèi)的水滴或濕氣狀況,能夠感知環(huán)境中的水分變化。該傳感器采用電阻式或電容式工作原理,在感應(yīng)到水滴或濕氣時改變其電阻值或電容值,從而向主控芯片發(fā)送信號。在本項(xiàng)目中,雨滴傳感器可用于檢測大棚內(nèi)是否有積水或潮濕現(xiàn)象,協(xié)助監(jiān)控大棚的濕度,防止過多水分影響作物生長。
7.?蜂鳴器:有源蜂鳴器
有源蜂鳴器是一種能夠發(fā)出聲音信號的電子元件。它內(nèi)部自帶振蕩電路,只需要提供適當(dāng)?shù)碾娫醇纯砂l(fā)出聲音。在本項(xiàng)目中,蜂鳴器用于報警功能,當(dāng)大棚內(nèi)的溫濕度超過設(shè)定閾值時,蜂鳴器將通過高電平觸發(fā)發(fā)出警報,提醒用戶及時處理異常情況。蜂鳴器的音量和頻率足以引起用戶的注意,確保及時采取措施。
8.?電源模塊
電源模塊負(fù)責(zé)為系統(tǒng)中的所有硬件組件提供穩(wěn)定的電力供應(yīng)。電源模塊一般包括DC-DC轉(zhuǎn)換器,能夠?qū)⑤斎氲碾妷恨D(zhuǎn)換為適合各個模塊的工作電壓(例如3.3V、5V等)。在本項(xiàng)目中,電源模塊必須能夠支持STM32、ESP8266、傳感器、顯示屏和風(fēng)扇等模塊的電力需求,同時保證電壓穩(wěn)定,避免電源波動對系統(tǒng)的影響。電源模塊的穩(wěn)定性是保證系統(tǒng)正常運(yùn)行的基礎(chǔ)。
二、服務(wù)器設(shè)計(jì)
設(shè)備通過TCP協(xié)議向服務(wù)器上傳溫濕度數(shù)據(jù),并在HTML前端進(jìn)行展示。
2.1?服務(wù)器后端代碼 (Python + Flask)
服務(wù)器后端將使用TCP協(xié)議接收來自設(shè)備端的數(shù)據(jù),并將數(shù)據(jù)存儲在內(nèi)存中。同時,F(xiàn)lask用于提供網(wǎng)頁界面,讓用戶能夠?qū)崟r查看溫濕度數(shù)據(jù)。
#?server.py
import?socket
import?threading
from?flask?import?Flask,?render_template
import?time
#?創(chuàng)建Flask應(yīng)用
app?=?Flask(__name__)
#?存儲接收到的溫濕度數(shù)據(jù)
temperature?=?None
humidity?=?None
#?TCP服務(wù)器設(shè)置
TCP_IP?=?"0.0.0.0"??#?監(jiān)聽所有IP
TCP_PORT?=?5005
BUFFER_SIZE?=?1024
def?handle_client(client_socket):
????global?temperature,?humidity
????while?True:
????????try:
????????????#?接收數(shù)據(jù)
????????????data?=?client_socket.recv(BUFFER_SIZE).decode("utf-8")
????????????if?not?data:
????????????????break
????????????print(f"Received?data:?{data}")
????????????
????????????#?解析溫濕度數(shù)據(jù)?(假設(shè)數(shù)據(jù)格式為?"temp:<temperature>,hum:<humidity>")
????????????if?"temp"?in?data?and?"hum"?in?data:
????????????????temp_data?=?data.split(",")
????????????????temperature?=?temp_data[0].split(":")[1]
????????????????humidity?=?temp_data[1].split(":")[1]
????????except?Exception?as?e:
????????????print(f"Error:?{e}")
????????????break
????
????client_socket.close()
def?start_tcp_server():
????server_socket?=?socket.socket(socket.AF_INET,?socket.SOCK_STREAM)
????server_socket.bind((TCP_IP,?TCP_PORT))
????server_socket.listen(5)
????print(f"Listening?on?{TCP_IP}:{TCP_PORT}...")
????
????while?True:
????????client_socket,?addr?=?server_socket.accept()
????????print(f"Connection?from?{addr}")
????????client_handler?=?threading.Thread(target=handle_client,?args=(client_socket,))
????????client_handler.start()
#?啟動TCP服務(wù)器
threading.Thread(target=start_tcp_server,?daemon=True).start()
#?主頁路由,渲染HTML頁面,顯示最新的溫濕度數(shù)據(jù)
@app.route('/')
def?index():
????return?render_template('index.html',?temperature=temperature,?humidity=humidity)
if?__name__?==?'__main__':
????app.run(debug=True,?host='0.0.0.0',?port=5000)
說明:
??TCP Server:服務(wù)器通過TCP協(xié)議接收數(shù)據(jù)。設(shè)備端通過TCP發(fā)送溫濕度數(shù)據(jù)到服務(wù)器,數(shù)據(jù)格式為"temp:<temperature>,hum:<humidity>"
。服務(wù)器解析這些數(shù)據(jù)并存儲在全局變量temperature
和humidity
中。
??Flask Web Server:Flask用于提供網(wǎng)頁界面,用戶訪問/
路徑時,F(xiàn)lask會渲染index.html
頁面,并將最新的溫濕度數(shù)據(jù)傳遞給前端顯示。
??多線程處理:使用threading
模塊實(shí)現(xiàn)了TCP服務(wù)器的多線程處理,允許多個設(shè)備同時連接并發(fā)送數(shù)據(jù)。
2.2?HTML前端代碼 (index.html)
HTML頁面用于顯示實(shí)時的溫濕度數(shù)據(jù)。頁面會定時刷新,以便實(shí)時查看數(shù)據(jù)變化。
<!DOCTYPE?html>
<html?lang="en">
<head>
????<meta?charset="UTF-8">
????<meta?name="viewport"?content="width=device-width,?initial-scale=1.0">
????<title>溫濕度監(jiān)控系統(tǒng)</title>
????<style>
????????body?{
????????????font-family:?Arial,?sans-serif;
????????????background-color:?#f4f4f4;
????????????text-align:?center;
????????????margin-top:?50px;
????????}
????????h1?{
????????????color:?#333;
????????}
????????.data-box?{
????????????background-color:?#fff;
????????????padding:?20px;
????????????margin:?20px;
????????????border-radius:?10px;
????????????box-shadow:?0?4px?8px?rgba(0,?0,?0,?0.1);
????????}
????????.data-box?h2?{
????????????font-size:?2em;
????????????margin-bottom:?10px;
????????}
????????.data-box?p?{
????????????font-size:?1.5em;
????????}
????????.refresh-button?{
????????????margin-top:?20px;
????????????padding:?10px?20px;
????????????background-color:?#4CAF50;
????????????color:?white;
????????????border:?none;
????????????border-radius:?5px;
????????????cursor:?pointer;
????????}
????????.refresh-button:hover?{
????????????background-color:?#45a049;
????????}
????</style>
</head>
<body>
????<h1>大棚溫濕度監(jiān)控系統(tǒng)</h1>
????
????<div?class="data-box">
????????<h2>實(shí)時溫度:?<span?id="temperature">{{?temperature?if?temperature?else?'無數(shù)據(jù)'?}}</span>°C</h2>
????????<p>實(shí)時濕度:?<span?id="humidity">{{?humidity?if?humidity?else?'無數(shù)據(jù)'?}}</span>%</p>
????</div>
????
????<button?class="refresh-button"?onclick="refreshData()">刷新數(shù)據(jù)</button>
????<script>
????????//?每5秒刷新一次頁面,確保數(shù)據(jù)實(shí)時更新
????????function?refreshData()?{
????????????window.location.reload();
????????}
????????setInterval(refreshData,?5000);?//?每5秒自動刷新
????</script>
</body>
</html>
說明:
??實(shí)時數(shù)據(jù)展示:{{ temperature }}
和{{ humidity }}
是Flask傳遞給模板的數(shù)據(jù)。通過Jinja模板語法,F(xiàn)lask將Python中的數(shù)據(jù)動態(tài)插入到HTML中。
??定時刷新:每5秒通過JavaScript的setInterval
方法自動刷新頁面,以保證前端能夠?qū)崟r獲取最新的溫濕度數(shù)據(jù)。
??刷新按鈕:用戶也可以通過點(diǎn)擊“刷新數(shù)據(jù)”按鈕手動刷新數(shù)據(jù)。
2.3?運(yùn)行項(xiàng)目
確保Python環(huán)境已安裝Flask模塊,使用以下命令安裝:
pip?install?flask
啟動Flask應(yīng)用:
python?server.py
? 服務(wù)器將啟動在http://0.0.0.0:5000
,并且能夠接收設(shè)備數(shù)據(jù)。
? 確保設(shè)備已正確連接至網(wǎng)絡(luò),并能夠向服務(wù)器的IP和端口發(fā)送數(shù)據(jù)。
2.4 HTML網(wǎng)頁-靜態(tài)測試頁面
<!DOCTYPE?html>
<html?lang="zh-CN">
<head>
????<meta?charset="UTF-8">
????<meta?name="viewport"?content="width=device-width,?initial-scale=1.0">
????<title>大棚自動通風(fēng)系統(tǒng)監(jiān)控</title>
????<style>
????????body?{
????????????font-family:?'Orbitron',?sans-serif;
????????????background-color:?#000;
????????????color:?#0f0;
????????????padding:?20px;
????????????text-align:?center;
????????}
????????h1?{
????????????font-size:?36px;
????????????text-shadow:?0?0?10px?#0f0;
????????}
????????.data-container?{
????????????display:?flex;
????????????justify-content:?center;
????????????gap:?20px;
????????????margin-bottom:?20px;
????????}
????????.data-box?{
????????????border:?2px?solid?#0f0;
????????????border-radius:?10px;
????????????padding:?20px;
????????????width:?200px;
????????????box-shadow:?0?0?10px?#0f0;
????????????animation:?glow?1.5s?ease-in-out?infinite?alternate;
????????}
????????@keyframes?glow?{
????????????from?{
????????????????box-shadow:?0?0?10px?#0f0;
????????????}
????????????to?{
????????????????box-shadow:?0?0?20px?#0f0,?0?0?30px?#0f0;
????????????}
????????}
????????.threshold-container?{
????????????margin-bottom:?20px;
????????}
????????.fan-control?{
????????????margin-bottom:?20px;
????????}
????????input[type="number"]?{
????????????background-color:?#000;
????????????color:?#0f0;
????????????border:?2px?solid?#0f0;
????????????border-radius:?5px;
????????????padding:?10px;
????????????margin:?5px;
????????}
????????button?{
????????????background-color:?#0f0;
????????????color:?#000;
????????????border:?none;
????????????border-radius:?5px;
????????????padding:?10px?20px;
????????????margin:?5px;
????????????cursor:?pointer;
????????????transition:?background-color?0.3s?ease;
????????}
????????button:hover?{
????????????background-color:?#0c0;
????????}
????</style>
????<link?>
</head>
<body>
????<h1>大棚自動通風(fēng)系統(tǒng)監(jiān)控</h1>
????<!--?顯示環(huán)境溫度和濕度?-->
????<div?class="data-container">
????????<div?class="data-box">
????????????<h2>環(huán)境溫度</h2>
????????????<p?id="temperature">暫無數(shù)據(jù)</p>
????????</div>
????????<div?class="data-box">
????????????<h2>環(huán)境濕度</h2>
????????????<p?id="humidity">暫無數(shù)據(jù)</p>
????????</div>
????</div>
????<!--?溫濕度閾值調(diào)整?-->
????<div?class="threshold-container">
????????<h2>溫濕度閾值調(diào)整</h2>
????????<label?for="temp-threshold">溫度閾值:</label>
????????<input?type="number"?id="temp-threshold"?value="25">
????????<label?for="humidity-threshold">濕度閾值:</label>
????????<input?type="number"?id="humidity-threshold"?value="60">
????????<button?onclick="saveThresholds()">保存閾值</button>
????</div>
????<!--?風(fēng)扇控制?-->
????<div?class="fan-control">
????????<h2>風(fēng)扇控制</h2>
????????<button?onclick="turnOnFan()">開啟風(fēng)扇</button>
????????<button?onclick="turnOffFan()">關(guān)閉風(fēng)扇</button>
????</div>
????<script>
????????//?模擬獲取環(huán)境溫度和濕度數(shù)據(jù)
????????function?updateData()?{
????????????//?這里應(yīng)該替換為實(shí)際的?API?請求來獲取數(shù)據(jù)
????????????const?temperature?=?Math.random()?*?40;
????????????const?humidity?=?Math.random()?*?100;
????????????document.getElementById('temperature').textContent?=?temperature.toFixed(2)?+?'?°C';
????????????document.getElementById('humidity').textContent?=?humidity.toFixed(2)?+?'?%';
????????}
????????//?保存溫濕度閾值
????????function?saveThresholds()?{
????????????const?tempThreshold?=?document.getElementById('temp-threshold').value;
????????????const?humidityThreshold?=?document.getElementById('humidity-threshold').value;
????????????//?這里應(yīng)該替換為實(shí)際的?API?請求來保存閾值
????????????alert(`溫度閾值已保存為?${tempThreshold}?°C,濕度閾值已保存為?${humidityThreshold}?%`);
????????}
????????//?開啟風(fēng)扇
????????function?turnOnFan()?{
????????????//?這里應(yīng)該替換為實(shí)際的?API?請求來控制風(fēng)扇
????????????alert('風(fēng)扇已開啟');
????????}
????????//?關(guān)閉風(fēng)扇
????????function?turnOffFan()?{
????????????//?這里應(yīng)該替換為實(shí)際的?API?請求來控制風(fēng)扇
????????????alert('風(fēng)扇已關(guān)閉');
????????}
????????//?定時更新數(shù)據(jù)
????????setInterval(updateData,?5000);
????????updateData();
????</script>
</body>
</html>
2.5 HTMl網(wǎng)頁-靜態(tài)頁面2
<!DOCTYPE?html>
<html?lang="zh-CN">
<head>
????<meta?charset="UTF-8">
????<meta?name="viewport"?content="width=device-width,?initial-scale=1.0">
????<title>大棚自動通風(fēng)系統(tǒng)</title>
????<style>
????????/*?頁面背景和字體?*/
????????body?{
????????????font-family:?'Segoe?UI',?Tahoma,?Geneva,?Verdana,?sans-serif;
????????????background:?linear-gradient(135deg,?#3a3a3a,?#1a1a1a);
????????????color:?#f1f1f1;
????????????padding:?40px;
????????????margin:?0;
????????}
????????
????????h1?{
????????????text-align:?center;
????????????font-size:?36px;
????????????color:?#00bcd4;
????????????margin-bottom:?40px;
????????}
????????.container?{
????????????width:?70%;
????????????margin:?0?auto;
????????????background-color:?rgba(0,?0,?0,?0.6);
????????????padding:?30px;
????????????border-radius:?15px;
????????????box-shadow:?0?0?20px?rgba(0,?0,?0,?0.5);
????????}
????????.data-section?{
????????????display:?flex;
????????????justify-content:?space-between;
????????????margin-bottom:?30px;
????????????font-size:?18px;
????????}
????????.data-section?div?{
????????????padding:?15px;
????????????background-color:?#333;
????????????border-radius:?8px;
????????????box-shadow:?0?0?10px?rgba(0,?0,?0,?0.4);
????????????text-align:?center;
????????}
????????.input-group?{
????????????margin-bottom:?25px;
????????}
????????.input-group?label?{
????????????font-size:?18px;
????????????margin-bottom:?10px;
????????????display:?block;
????????????color:?#00bcd4;
????????}
????????.input-group?input[type="number"]?{
????????????width:?150px;
????????????padding:?12px;
????????????font-size:?18px;
????????????border-radius:?10px;
????????????border:?2px?solid?#00bcd4;
????????????background-color:?#2c2c2c;
????????????color:?#f1f1f1;
????????}
????????.button-group?{
????????????text-align:?center;
????????????margin-top:?30px;
????????}
????????.button-group?button?{
????????????padding:?15px?30px;
????????????font-size:?20px;
????????????margin:?0?20px;
????????????cursor:?pointer;
????????????border:?none;
????????????border-radius:?50px;
????????????transition:?0.3s;
????????}
????????.button-group?button:hover?{
????????????opacity:?0.8;
????????}
????????.button-group?button.on?{
????????????background-color:?#00bcd4;
????????????color:?white;
????????}
????????.button-group?button.off?{
????????????background-color:?#f44336;
????????????color:?white;
????????}
????????.status?{
????????????font-size:?20px;
????????????text-align:?center;
????????????margin-top:?20px;
????????}
????????.status?span?{
????????????font-weight:?bold;
????????????font-size:?24px;
????????????color:?#ff9800;
????????}
????????/*?動畫效果?*/
????????@keyframes?fadeIn?{
????????????0%?{?opacity:?0;?}
????????????100%?{?opacity:?1;?}
????????}
????????.container?{
????????????animation:?fadeIn?1s?ease-in-out;
????????}
????</style>
</head>
<body>
????<h1>大棚自動通風(fēng)系統(tǒng)</h1>
????<div?class="container">
????????<!--?環(huán)境數(shù)據(jù)部分?-->
????????<div?class="data-section">
????????????<div>
????????????????<strong>當(dāng)前溫度:</strong>?<span?id="current-temp">--</span>?°C
????????????</div>
????????????<div>
????????????????<strong>當(dāng)前濕度:</strong>?<span?id="current-humidity">--</span>?%
????????????</div>
????????</div>
????????<!--?溫濕度閥值調(diào)整部分?-->
????????<div?class="input-group">
????????????<label?for="temp-threshold">溫度閥值?(°C):</label>
????????????<input?type="number"?id="temp-threshold"?value="30"?min="0">
????????</div>
????????<div?class="input-group">
????????????<label?for="humidity-threshold">濕度閥值?(%):</label>
????????????<input?type="number"?id="humidity-threshold"?value="60"?min="0">
????????</div>
????????<!--?風(fēng)扇控制部分?-->
????????<div?class="button-group">
????????????<button?id="fan-on"?class="on">開啟風(fēng)扇</button>
????????????<button?id="fan-off"?class="off">關(guān)閉風(fēng)扇</button>
????????</div>
????????<!--?風(fēng)扇狀態(tài)顯示?-->
????????<div?class="status"?id="fan-status">風(fēng)扇狀態(tài):?<span>關(guān)閉</span></div>
????</div>
????<script>
????????//?假設(shè)從ESP8266接收到的數(shù)據(jù)
????????let?currentTemperature?=?25;?//?當(dāng)前溫度
????????let?currentHumidity?=?55;????//?當(dāng)前濕度
????????//?更新網(wǎng)頁中的環(huán)境溫濕度數(shù)據(jù)
????????function?updateEnvironmentData()?{
????????????document.getElementById('current-temp').textContent?=?currentTemperature;
????????????document.getElementById('current-humidity').textContent?=?currentHumidity;
????????}
????????//?模擬從服務(wù)器獲取實(shí)時環(huán)境數(shù)據(jù)
????????setInterval(function()?{
????????????//?此處需要調(diào)用ESP8266獲取的實(shí)時數(shù)據(jù)
????????????//?假設(shè)溫度和濕度變化
????????????currentTemperature?+=?Math.random()?*?2?-?1;?//?隨機(jī)變化模擬
????????????currentHumidity?+=?Math.random()?*?2?-?1;????//?隨機(jī)變化模擬
????????????currentTemperature?=?Math.round(currentTemperature?*?10)?/?10;
????????????currentHumidity?=?Math.round(currentHumidity?*?10)?/?10;
????????????updateEnvironmentData();
????????},?2000);
????????//?獲取并顯示溫濕度閥值
????????const?tempThresholdInput?=?document.getElementById('temp-threshold');
????????const?humidityThresholdInput?=?document.getElementById('humidity-threshold');
????????tempThresholdInput.addEventListener('change',?function()?{
????????????//?更新溫度閥值
????????????tempThreshold?=?tempThresholdInput.value;
????????????console.log("溫度閥值已更改為:",?tempThreshold);
????????});
????????humidityThresholdInput.addEventListener('change',?function()?{
????????????//?更新濕度閥值
????????????humidityThreshold?=?humidityThresholdInput.value;
????????????console.log("濕度閥值已更改為:",?humidityThreshold);
????????});
????????//?風(fēng)扇控制
????????const?fanOnButton?=?document.getElementById('fan-on');
????????const?fanOffButton?=?document.getElementById('fan-off');
????????const?fanStatusText?=?document.getElementById('fan-status');
????????fanOnButton.addEventListener('click',?function()?{
????????????//?發(fā)送命令給ESP8266打開風(fēng)扇
????????????fanStatusText.innerHTML?=?'風(fēng)扇狀態(tài):?<span>開啟</span>';
????????????fanOnButton.disabled?=?true;
????????????fanOffButton.disabled?=?false;
????????????console.log('風(fēng)扇已開啟');
????????});
????????fanOffButton.addEventListener('click',?function()?{
????????????//?發(fā)送命令給ESP8266關(guān)閉風(fēng)扇
????????????fanStatusText.innerHTML?=?'風(fēng)扇狀態(tài):?<span>關(guān)閉</span>';
????????????fanOnButton.disabled?=?false;
????????????fanOffButton.disabled?=?true;
????????????console.log('風(fēng)扇已關(guān)閉');
????????});
????????//?初始頁面加載時更新顯示
????????updateEnvironmentData();
????</script>
</body>
</html>
三、STM32代碼設(shè)計(jì)
項(xiàng)目的目標(biāo)是通過STM32F103RCT6微控制器監(jiān)測溫濕度數(shù)據(jù),并通過Wi-Fi模塊(ESP8266)將這些數(shù)據(jù)上傳到后端服務(wù)器。
當(dāng)前項(xiàng)目使用的相關(guān)軟件工具、模塊源碼已經(jīng)上傳到網(wǎng)盤:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
3.1?硬件設(shè)計(jì)概述
??主控芯片:STM32F103RCT6
負(fù)責(zé)處理傳感器數(shù)據(jù)、控制風(fēng)扇的開關(guān)、通信模塊的控制等。
??溫濕度傳感器:SHT30
用于測量大棚內(nèi)的溫度和濕度。
??Wi-Fi模塊:ESP8266
用于將溫濕度數(shù)據(jù)通過TCP協(xié)議傳輸?shù)竭h(yuǎn)程服務(wù)器。
??顯示模塊:0.96寸OLED
用于顯示實(shí)時溫濕度數(shù)據(jù)。
??蜂鳴器和繼電器
用于報警和控制風(fēng)扇。
3.2?軟件設(shè)計(jì)概述
STM32的程序由以下幾個模塊組成:
1.?溫濕度數(shù)據(jù)采集模塊:通過I2C接口讀取SHT30溫濕度傳感器的數(shù)據(jù)。
2.?Wi-Fi數(shù)據(jù)上傳模塊:通過USART與ESP8266進(jìn)行通信,利用AT指令將數(shù)據(jù)上傳到服務(wù)器。
3.?OLED顯示模塊:通過I2C接口將當(dāng)前的溫濕度數(shù)據(jù)實(shí)時顯示。
4.?風(fēng)扇控制模塊:根據(jù)溫濕度閾值控制繼電器,開啟或關(guān)閉風(fēng)扇。
5.?蜂鳴器報警模塊:當(dāng)溫濕度超出設(shè)定范圍時,觸發(fā)蜂鳴器報警。
3.3?STM32代碼設(shè)計(jì)
(1)主代碼
以下代碼將包括溫濕度的監(jiān)測,風(fēng)扇的自動控制,數(shù)據(jù)的上傳,報警功能,以及其他所需功能的實(shí)現(xiàn)。
#include?"stm32f1xx_hal.h"
#include?"sht30.h"????????//?SHT30溫濕度傳感器庫
#include?"esp8266.h"??????//?ESP8266?Wi-Fi模塊庫
#include?"oled.h"?????????//?OLED顯示庫
#include?"buzzer.h"???????//?蜂鳴器控制庫
#include?"relay.h"????????//?風(fēng)扇繼電器控制庫
#include?"tim.h"??????????//?定時器庫
#include?"usart.h"????????//?UART庫
#define?TEMP_THRESHOLD?30??//?溫度閾值,超過此溫度自動開啟風(fēng)扇
#define?HUM_THRESHOLD?70???//?濕度閾值,超過此濕度觸發(fā)報警
//?定義用于存儲溫濕度數(shù)據(jù)的結(jié)構(gòu)體
typedef?struct?{
????float?temperature;
????float?humidity;
}?EnvironmentData;
//?聲明全局變量
EnvironmentData?current_data;
//?函數(shù)聲明
void?SystemClock_Config(void);
void?MX_GPIO_Init(void);
void?MX_USART1_UART_Init(void);
void?MX_I2C1_Init(void);
void?MX_TIM2_Init(void);
void?read_sensor_data(void);
void?control_fan(void);
void?display_data(void);
void?send_data_to_server(void);
void?buzzer_alert(void);
void?update_data(void);
void?start_timer(void);
int?main(void)?{
????//?初始化硬件資源
????HAL_Init();
????SystemClock_Config();
????MX_GPIO_Init();
????MX_USART1_UART_Init();
????MX_I2C1_Init();
????MX_TIM2_Init();??//?定時器初始化
????//?初始化子模塊
????SHT30_Init();?????//?初始化溫濕度傳感器
????OLED_Init();??????//?初始化OLED顯示
????Buzzer_Init();????//?初始化蜂鳴器
????Relay_Init();?????//?初始化繼電器(風(fēng)扇控制)
????ESP8266_Init();???//?初始化ESP8266?Wi-Fi模塊
????//?開始定時器,用于周期性地讀取數(shù)據(jù)
????start_timer();
????while?(1)?{
????????//?讀取傳感器數(shù)據(jù)
????????read_sensor_data();
????????//?自動控制風(fēng)扇(基于溫濕度)
????????control_fan();
????????//?更新顯示內(nèi)容
????????display_data();
????????//?上傳數(shù)據(jù)到服務(wù)器
????????send_data_to_server();
????????//?檢查報警條件
????????if?(current_data.temperature?>?TEMP_THRESHOLD?||?current_data.humidity?>?HUM_THRESHOLD)?{
????????????buzzer_alert();
????????}
????}
}
//?讀取溫濕度數(shù)據(jù)
void?read_sensor_data(void)?{
????uint8_t?data[6]?=?{0};
????int?ret?=?SHT30_ReadData(¤t_data.temperature,?¤t_data.humidity);
????if?(ret?!=?0)?{
????????//?讀取失敗處理
????}
}
//?控制風(fēng)扇的開啟與關(guān)閉
void?control_fan(void)?{
????if?(current_data.temperature?>?TEMP_THRESHOLD?||?current_data.humidity?>?HUM_THRESHOLD)?{
????????Relay_ON();??//?超過閾值時開啟風(fēng)扇
????}?else?{
????????Relay_OFF();?//?否則關(guān)閉風(fēng)扇
????}
}
//?顯示實(shí)時數(shù)據(jù)在OLED屏上
void?display_data(void)?{
????OLED_Clear();
????OLED_ShowString(0,?0,?"Temp:?%.2f?C",?current_data.temperature);
????OLED_ShowString(0,?16,?"Humidity:?%.2f%%",?current_data.humidity);
}
//?發(fā)送數(shù)據(jù)到服務(wù)器(通過ESP8266)
void?send_data_to_server(void)?{
????char?data[128];
????sprintf(data,?"temperature=%.2f&humidity=%.2f",?current_data.temperature,?current_data.humidity);
????ESP8266_SendData(data);?//?通過ESP8266發(fā)送數(shù)據(jù)到服務(wù)器
}
//?蜂鳴器報警
void?buzzer_alert(void)?{
????Buzzer_ON();
????HAL_Delay(500);
????Buzzer_OFF();
}
//?定時器回調(diào)函數(shù)
void?HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef?*htim)?{
????if?(htim->Instance?==?TIM2)?{
????????//?每次定時器觸發(fā)時讀取一次數(shù)據(jù)
????????read_sensor_data();
????}
}
//?定時器啟動
void?start_timer(void)?{
????HAL_TIM_Base_Start_IT(&htim2);??//?啟動定時器中斷
}
(2)SHT30傳感器驅(qū)動代碼
SHT30.h
?和?SHT30.c
?提供了與SHT30溫濕度傳感器的I2C通信,讀取溫濕度數(shù)據(jù)的功能。
#include?"stm32f1xx_hal.h"
#include?"i2c.h"
#define?SHT30_ADDR?0x44??//?SHT30的I2C地址
void?SHT30_Init(void)
{
????//?初始化SHT30傳感器
????uint8_t?cmd[2]?=?{0x2C,?0x06};??//?獲取溫濕度數(shù)據(jù)的命令
????HAL_I2C_Master_Transmit(&hi2c1,?SHT30_ADDR?<<?1,?cmd,?2,?HAL_MAX_DELAY);
}
void?SHT30_ReadData(float?*temperature,?float?*humidity)
{
????uint8_t?buffer[6];
????HAL_I2C_Master_Receive(&hi2c1,?SHT30_ADDR?<<?1,?buffer,?6,?HAL_MAX_DELAY);
????//?將讀取到的數(shù)據(jù)轉(zhuǎn)換為溫濕度值
????uint16_t?raw_temperature?=?(buffer[0]?<<?8)?|?buffer[1];
????uint16_t?raw_humidity?=?(buffer[3]?<<?8)?|?buffer[4];
????*temperature?=?-45?+?(175?*?(float)raw_temperature)?/?65535.0f;
????*humidity?=?100?*?(float)raw_humidity?/?65535.0f;
}
(3)Wi-Fi模塊(ESP8266)通信代碼
通過USART與ESP8266進(jìn)行通信,實(shí)現(xiàn)溫濕度數(shù)據(jù)的上傳。
#include?"usart.h"
#include?"string.h"
void?send_to_esp8266(const?char?*data)
{
????HAL_UART_Transmit(&huart1,?(uint8_t*)data,?strlen(data),?HAL_MAX_DELAY);??//?發(fā)送數(shù)據(jù)到ESP8266
}
void?setup_esp8266(void)
{
????send_to_esp8266("AT+RSTrn");??//?重啟ESP8266
????HAL_Delay(1000);
????send_to_esp8266("AT+CWMODE=1rn");??//?設(shè)置為Station模式
????HAL_Delay(1000);
????send_to_esp8266("AT+CWJAP="SSID","PASSWORD"rn");??//?連接Wi-Fi
????HAL_Delay(5000);
????send_to_esp8266("AT+CIPSTART="TCP","192.168.1.100",5005rn");??//?啟動TCP連接
????HAL_Delay(2000);
}
3.4?設(shè)計(jì)說明
1.?溫濕度監(jiān)測:通過SHT30傳感器獲取實(shí)時的溫濕度數(shù)據(jù),使用I2C協(xié)議與STM32進(jìn)行通信。
2.?數(shù)據(jù)上傳:數(shù)據(jù)通過ESP8266 Wi-Fi模塊與后端服務(wù)器進(jìn)行通信。ESP8266通過USART與STM32進(jìn)行數(shù)據(jù)交互,發(fā)送溫濕度數(shù)據(jù)到服務(wù)器。
3.?OLED顯示:STM32通過I2C將溫濕度數(shù)據(jù)實(shí)時顯示在OLED屏幕上,便于用戶查看。
4.?風(fēng)扇控制:當(dāng)溫度超過30°C時,STM32通過繼電器控制風(fēng)扇打開,保證大棚的溫度在合理范圍內(nèi)。
5.?報警功能:當(dāng)溫濕度超過預(yù)設(shè)閾值時,STM32觸發(fā)蜂鳴器報警,提醒用戶采取措施。
3.5?總結(jié)
本項(xiàng)目基于STM32微控制器,通過SHT30傳感器監(jiān)測大棚內(nèi)的環(huán)境溫濕度,并通過ESP8266模塊將數(shù)據(jù)上傳到服務(wù)器。同時,系統(tǒng)還提供實(shí)時顯示、風(fēng)扇控制以及報警功能,確保大棚內(nèi)的環(huán)境得到及時調(diào)節(jié)和監(jiān)控。
四、總結(jié)
本項(xiàng)目設(shè)計(jì)并實(shí)現(xiàn)了一個基于STM32的自動化大棚通風(fēng)系統(tǒng),成功集成了環(huán)境監(jiān)測、自動風(fēng)扇控制、報警功能、數(shù)據(jù)可視化和遠(yuǎn)程控制等多項(xiàng)功能。通過溫濕度傳感器(SHT30)的實(shí)時數(shù)據(jù)采集與處理,結(jié)合STM32的高效控制能力,實(shí)現(xiàn)了對大棚環(huán)境的精確調(diào)節(jié),確保溫濕度保持在預(yù)設(shè)范圍內(nèi),以促進(jìn)植物的生長。
系統(tǒng)的自動控制功能能夠根據(jù)實(shí)時溫濕度數(shù)據(jù)自動啟閉風(fēng)扇,并通過蜂鳴器發(fā)出報警信號,提醒用戶干預(yù)。OLED顯示屏實(shí)時展示環(huán)境數(shù)據(jù),方便用戶監(jiān)控大棚內(nèi)的狀態(tài)。同時,系統(tǒng)還具有歷史數(shù)據(jù)記錄和定時控制功能,為用戶提供更加智能化的操作體驗(yàn)。
遠(yuǎn)程控制功能的實(shí)現(xiàn)通過ESP8266模塊將溫濕度數(shù)據(jù)上傳至服務(wù)器,用戶可以通過手機(jī)或PC端遠(yuǎn)程查看大棚環(huán)境數(shù)據(jù)并控制風(fēng)扇,提升了操作的便捷性和靈活性。
通過本項(xiàng)目的實(shí)現(xiàn),不僅能優(yōu)化大棚內(nèi)環(huán)境管理,提高作物生長效率,同時也為智能農(nóng)業(yè)的進(jìn)一步發(fā)展提供了一個實(shí)踐平臺。未來可以在此基礎(chǔ)上引入更多智能化控制,比如光照調(diào)節(jié)、濕度補(bǔ)償?shù)?,進(jìn)一步提升系統(tǒng)的綜合性能與應(yīng)用場景。
本項(xiàng)目實(shí)現(xiàn)了軟硬件的良好結(jié)合,充分展示了基于STM32的物聯(lián)網(wǎng)技術(shù)在農(nóng)業(yè)自動化中的廣泛應(yīng)用前景。