• 正文
    • 一、前言
    • 二、服務器設計
    • 三、STM32代碼設計
    • 四、總結
  • 相關推薦
申請入駐 產業(yè)圖譜

基于STM32設計的大棚自動通風系統(tǒng)

02/17 11:00
1203
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

一、前言

1.1 項目開發(fā)背景

隨著現(xiàn)代農業(yè)的快速發(fā)展,溫室大棚已成為提高作物產量和質量的重要設施。然而,大棚環(huán)境的控制和管理仍面臨諸多挑戰(zhàn),尤其是溫濕度的調節(jié)。大棚內的溫濕度直接影響作物的生長和產量,而傳統(tǒng)的人工管理方式存在不小的局限性,如勞動強度大、反應速度慢和操作不精確等。因此,采用自動化控制系統(tǒng)對大棚環(huán)境進行監(jiān)測和調節(jié),成為提高生產效率和降低人工成本的關鍵。

近年來,物聯(lián)網技術嵌入式系統(tǒng)的迅速發(fā)展為智能農業(yè)提供了新的解決方案。通過集成傳感器執(zhí)行器、無線通信模塊硬件設備,結合先進的控制算法,可以實時監(jiān)控大棚內的環(huán)境變化,并自動進行調節(jié)。這不僅能夠確保大棚內的溫濕度始終維持在作物生長的最佳范圍,還能實現(xiàn)遠程監(jiān)控與管理,使農業(yè)生產更加智能化、精準化。

為了應對這一需求,本項目基于STM32開發(fā)了一套大棚自動通風系統(tǒng),旨在通過溫濕度監(jiān)測、自動風扇控制、報警功能等一系列自動化操作,優(yōu)化大棚內的環(huán)境條件。該系統(tǒng)能夠實時采集溫濕度數(shù)據(jù),并根據(jù)預設的閾值自動開啟或關閉風扇,確保大棚內的溫濕度始終處于適宜范圍。此外,通過手動控制、數(shù)據(jù)可視化、歷史數(shù)據(jù)記錄等功能,用戶可以靈活地調整和查看大棚環(huán)境數(shù)據(jù),從而實現(xiàn)更高效的管理。

在硬件方面,選用了STM32F103RCT6主控芯片,其具備較強的處理能力和豐富的外設接口,能夠滿足本項目對實時監(jiān)控和控制的需求。溫濕度傳感器SHT30提供高精度的溫濕度測量,Wi-Fi模塊ESP8266則支持數(shù)據(jù)遠程傳輸,便于實現(xiàn)大棚遠程監(jiān)控和控制。通過集成這些硬件,系統(tǒng)能夠提供一個高效、穩(wěn)定、智能的環(huán)境控制方案,進一步推動智能農業(yè)的發(fā)展。

1.2 設計實現(xiàn)的功能

(1)環(huán)境監(jiān)測功能
系統(tǒng)通過溫濕度傳感器SHT30實時監(jiān)測大棚內的溫度和濕度,并提供實時的數(shù)據(jù)反饋。傳感器能夠精確地獲取環(huán)境數(shù)據(jù),為后續(xù)的控制和決策提供可靠的依據(jù)。

(2)自動開關風扇控制
根據(jù)監(jiān)測到的溫濕度數(shù)據(jù),系統(tǒng)能夠自動控制風扇的開啟或關閉。當溫度超過設定的上限值時,系統(tǒng)自動開啟風扇進行通風,幫助降低溫度;當溫濕度恢復到設定的范圍內時,系統(tǒng)自動關閉風扇,從而保證大棚內的環(huán)境始終處于適宜范圍。

(3)手動控制功能
在自動控制模式下,用戶可以通過按鍵或手機APP手動控制風扇的開關,便于應對特殊情況或緊急需求。該功能提供靈活性,確保用戶能夠隨時對系統(tǒng)進行干預。

(4)數(shù)據(jù)可視化
系統(tǒng)通過OLED顯示屏實時顯示大棚內的溫濕度數(shù)據(jù),用戶可以直觀地查看當前環(huán)境狀況。該功能簡化了信息呈現(xiàn),幫助用戶快速獲取重要數(shù)據(jù),做出相應決策。

(5)報警功能
當溫度或濕度超過設定的閾值時,系統(tǒng)會發(fā)出警報,提醒用戶進行干預。警報通過蜂鳴器發(fā)出聲音信號,確保用戶能夠及時發(fā)現(xiàn)問題并采取措施。

(6)歷史數(shù)據(jù)記錄
系統(tǒng)能夠存儲一定時間范圍內的溫濕度數(shù)據(jù),并允許用戶查看歷史數(shù)據(jù)。通過記錄歷史數(shù)據(jù),用戶可以進行數(shù)據(jù)分析和趨勢預測,幫助調整大棚管理策略。

(7)定時功能
系統(tǒng)支持定時開關風扇的功能,用戶可以設置特定時間段內自動進行通風。這一功能能夠減少人工干預,優(yōu)化工作流程,提升系統(tǒng)的自動化水平。

(8)遠程控制與監(jiān)控功能
通過Wi-Fi模塊ESP8266,系統(tǒng)可以將溫濕度數(shù)據(jù)實時傳輸至可視化網頁,用戶可以通過瀏覽器遠程查看大棚的環(huán)境數(shù)據(jù)并控制風扇的開關。這一功能使得用戶能夠隨時隨地監(jiān)控和管理大棚的環(huán)境,提高系統(tǒng)的智能化水平。

(9)服務器后端與數(shù)據(jù)處理
本系統(tǒng)的后端服務器采用Python語言進行開發(fā),負責接收從設備端上傳的數(shù)據(jù),并將其展示在可視化網頁上。用戶可以通過網頁查看大棚的實時數(shù)據(jù)與歷史記錄。此外,服務器支持本地部署和云端部署兩種方式,滿足不同用戶需求。

1.3 項目硬件模塊組成

(1)主控芯片:STM32F103RCT6
STM32F103RCT6是一款基于ARM Cortex-M3架構的微控制器,具備強大的處理能力和豐富的外設接口,適用于本項目對實時控制和數(shù)據(jù)處理的需求。它負責處理傳感器采集的數(shù)據(jù)、控制風扇開關、管理報警功能以及與Wi-Fi模塊通信。

(2)溫濕度傳感器:SHT30
SHT30是一款高精度的溫濕度傳感器,能夠實時監(jiān)測大棚內的溫度和濕度。其測量范圍廣、響應速度快、精度高,適合用于大棚環(huán)境的實時監(jiān)測,提供準確的數(shù)據(jù)輸入給主控芯片進行后續(xù)處理和控制。

(3)通風風扇:繼電器控制
風扇通過繼電器進行控制。繼電器的作用是根據(jù)主控芯片發(fā)出的控制信號,開關風扇電源,從而實現(xiàn)風扇的啟停。繼電器的選擇要考慮其負載能力,以確保穩(wěn)定可靠地控制風扇。

(4)Wi-Fi模塊:ESP8266
ESP8266是一個低功耗的Wi-Fi模塊,支持與主控芯片進行無線通信,將溫濕度數(shù)據(jù)上傳到服務器,并支持遠程控制風扇的開關。ESP8266能夠實現(xiàn)大棚環(huán)境數(shù)據(jù)的無線傳輸和遠程監(jiān)控功能,使用戶可以通過智能設備或網頁實時查看數(shù)據(jù)并進行操作。

(5)顯示屏:0.96寸OLED
0.96寸OLED顯示屏用于顯示大棚內的實時溫濕度數(shù)據(jù)。OLED顯示屏具有高對比度、低功耗、清晰可讀等優(yōu)點,適合用于小型嵌入式顯示應用。用戶可以通過此顯示屏直觀地查看環(huán)境數(shù)據(jù)。

(6)水汽檢測:雨滴傳感器
雨滴傳感器用于檢測大棚內的水汽狀況,能夠在出現(xiàn)水滴或潮濕情況時發(fā)出信號。該模塊有助于檢測是否有過多水分積聚,從而對大棚的濕度進行更精確的控制和預警。

(7)蜂鳴器:有源蜂鳴器
蜂鳴器用于系統(tǒng)的報警功能。當溫濕度超出設定閾值時,蜂鳴器會發(fā)出警報聲,提醒用戶進行干預。此蜂鳴器采用高電平觸發(fā)方式,能夠在短時間內提供明顯的聲音提示。

(8)電源模塊
電源模塊為系統(tǒng)提供穩(wěn)定的電力支持。系統(tǒng)中的各個硬件組件(如主控芯片、Wi-Fi模塊、風扇等)都需要穩(wěn)定的電源來保障其正常工作。電源模塊會根據(jù)需要為不同模塊提供相應的電壓和電流

1.4 設計思路

本項目的設計思路是以溫濕度控制為核心,結合現(xiàn)代物聯(lián)網技術,通過集成多種傳感器和執(zhí)行器,打造一個自動化、大數(shù)據(jù)化、遠程可控的大棚環(huán)境監(jiān)測與控制系統(tǒng)。系統(tǒng)的設計遵循智能化、自動化、穩(wěn)定性和用戶友好的原則,目的是通過自動化手段降低人工干預,提高大棚環(huán)境的管理效率和作物生長條件的優(yōu)化。

系統(tǒng)通過高精度的溫濕度傳感器SHT30實時監(jiān)測大棚內的溫度和濕度數(shù)據(jù)。溫濕度是影響作物生長的關鍵因素,因此實時監(jiān)測這些數(shù)據(jù)是系統(tǒng)的基礎。通過STM32F103RCT6微控制器采集并處理傳感器數(shù)據(jù),控制風扇及報警系統(tǒng),根據(jù)預設的閾值進行自動調節(jié)。當溫濕度超出設定范圍時,控制風扇自動啟動或停止,維持大棚內的環(huán)境在最適宜的范圍內。

為了提升系統(tǒng)的智能化水平,本設計加入了Wi-Fi模塊ESP8266,將大棚內的溫濕度數(shù)據(jù)通過無線網絡上傳至遠程服務器。服務器將數(shù)據(jù)進行處理并展示在網頁端,用戶可以隨時隨地通過瀏覽器查看大棚內的環(huán)境狀態(tài)。此外,系統(tǒng)還提供遠程控制風扇開關的功能,用戶可在不同地點通過智能設備實現(xiàn)對大棚的實時管理和調控,進一步提高了系統(tǒng)的靈活性與可控性。

在設計過程中,還特別考慮到用戶的易用性和操作便捷性。系統(tǒng)提供了OLED顯示屏,用于實時顯示當前溫濕度數(shù)據(jù),用戶無需額外工具就能快速查看大棚的環(huán)境狀態(tài)。同時,系統(tǒng)還具有手動控制功能,用戶可以通過按鍵或APP隨時干預系統(tǒng)工作,解決特殊情況下的緊急需求。為了確保安全與及時干預,系統(tǒng)設定了溫濕度報警功能,當環(huán)境參數(shù)異常時,蜂鳴器將發(fā)出警報,提醒用戶采取行動。

為了確保數(shù)據(jù)的長期穩(wěn)定性和參考價值,系統(tǒng)具有歷史數(shù)據(jù)記錄和分析功能。系統(tǒng)會定期保存溫濕度數(shù)據(jù),用戶可以查看歷史記錄,分析環(huán)境變化趨勢,進而做出更精確的管理決策。此外,定時功能的加入讓風扇的控制更具靈活性,用戶可以設置在特定時間段自動開啟風扇,進一步減少了人工操作的頻次。

整體設計將硬件和軟件緊密結合,注重每個環(huán)節(jié)的性能與穩(wěn)定性。通過高效的數(shù)據(jù)采集、智能的控制策略和簡便的操作界面,系統(tǒng)能夠為大棚管理提供強有力的支持,幫助用戶輕松實現(xiàn)環(huán)境的自動調節(jié)與監(jiān)控,優(yōu)化大棚的生產效率和作物的生長環(huán)境。

1.5 系統(tǒng)功能總結

功能模塊 功能描述
環(huán)境監(jiān)測功能 通過溫濕度傳感器實時監(jiān)測大棚內的溫度和濕度,提供實時數(shù)據(jù)反饋。
自動開關風扇控制 根據(jù)溫濕度數(shù)據(jù)自動控制風扇的開關,保持大棚內的溫濕度在預設范圍內。
手動控制功能 提供手動模式,用戶可通過按鍵或APP控制風扇開關,適應特殊情況或緊急需求。
數(shù)據(jù)可視化 通過OLED顯示屏顯示實時的溫濕度數(shù)據(jù),方便用戶查看大棚環(huán)境狀況。
報警功能 當溫濕度超過設定閾值時,通過蜂鳴器發(fā)出報警信號,提醒用戶采取措施。
歷史數(shù)據(jù)記錄 存儲一段時間內的溫濕度數(shù)據(jù),支持用戶查看歷史記錄,進行數(shù)據(jù)分析和趨勢預測。
定時功能 支持設置定時開關風扇的功能,用戶可以設定特定時間段內自動開啟風扇。
遠程控制與監(jiān)控功能 通過Wi-Fi模塊,遠程上傳溫濕度數(shù)據(jù)并在網頁端展示,用戶可以通過智能設備遠程查看并控制風扇。
服務器數(shù)據(jù)處理 后端服務器使用Python接收數(shù)據(jù)并展示在可視化網頁上,支持本地和云端部署,滿足不同的訪問需求。

1.6 參考文獻

1.?應耿寧,陳啟東,樓澤華等.基于STM32的大棚智能通風系統(tǒng)的設計與研究[J].機電工程技術,2019.
2.?潘金珠,王興元,肖云龍等.基于物聯(lián)網的溫室大棚系統(tǒng)設計[J].傳感器與微系統(tǒng),2014.
3.?哈爾濱石油學院.基于ZigBee的智能農業(yè)溫室大棚控制系統(tǒng)的設計[J].長江信息通信,2024.
4.?沈筱予,黃葆華,徐超等.基于STM32和物聯(lián)網云平臺的農業(yè)環(huán)境監(jiān)控系統(tǒng)的設計[J].現(xiàn)代信息科技,2022.
5.?劉文生.基于物聯(lián)網智慧溫室大棚監(jiān)測控制系統(tǒng)[J].電子元器件與信息技術,2021.
6.?陳卓.基于樹莓派的大棚聯(lián)網監(jiān)控系統(tǒng)的研究與設計[D].西安工業(yè)大學,2018.
7.?齊齊哈爾大學計算機與控制工程學院.基于無線Mesh網絡的智慧農業(yè)大棚監(jiān)控系統(tǒng)[J].現(xiàn)代電子技術,2016.
8.?彭高豐.溫室大棚環(huán)境智能自動測量與調節(jié)系統(tǒng)研究[J].計算機測量與控制,2012.
9.?陳榮榮,顧靖峰.智能農業(yè)溫室環(huán)境遠程監(jiān)控系統(tǒng)在蔬菜基地的實踐應用[J].農業(yè)裝備技術,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)網的溫室大棚智能監(jiān)測控制系統(tǒng)[J].科技資訊,2017.
12.?孔國利,蘇玉.日照溫室大棚自動卷簾機與智能通風控制系統(tǒng)設計[J].湖北農業(yè)科學,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.?朱宇娟.智能溫室大棚全方位調溫系統(tǒng)創(chuàng)新設計與應用[J].黑龍江糧食,2023.
15.?郭琳,張孝存,韓文霆等.基于多能互補的光伏木耳大棚智慧控制系統(tǒng)設計[J].西北農林科技大學學報(自然科學版),2019.
16.?上海理工大學光電信息與計算機工程學院2.?北京東方振動和噪聲技術研究所.基于嵌入式的智能農場設計與實現(xiàn).第十一屆全國信號和智能信息處理與應用學術會議專刊,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)設計[J].農技服務,2017.
19.?張逢雪,王香婷,王通生等.基于STM32單片機的無線智能家居控制系統(tǒng)[J].自動化技術與應用,2011.
20.?宋德俊,王冰峰.模糊控制在溫室噴灌自動控制中的應用[J].控制工程,2005.
21.?李凱,麻紅昭.基于STM32的溫室環(huán)境監(jiān)控系統(tǒng)的設計與實現(xiàn)[J].工業(yè)控制計算機,2015.
22.?吳佳偉,朱桂兵,王成等.基于PLC的小型智慧大棚蔬果生長環(huán)境監(jiān)控系統(tǒ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.?張道輝,曲健祿,黃華等.果蔬保護地栽培棚溫自動調控系統(tǒng)[J].農業(yè)機械,2004.
25.?韓永佳.基于Arduino的蔬菜大棚智能灌溉控制系統(tǒng)設計[J].山西水利科技,2016.
26.?劉永濤,劉佳,吳金順.基于MSP430與單總線的溫室監(jiān)控終端的設計[J].中國農機化學報,2015.
27.?陳高鋒,熊剛,龍建明等.基于STM32和ZigBee的小型溫室環(huán)境控制系統(tǒng)設計[J].江蘇農業(yè)科學,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.?華中師范大學物理科學與技術學院.基于物聯(lián)網的智能澆花系統(tǒng)[J].電子測量技術,2020.

1.7 模塊的技術詳情介紹

1.?主控芯片:STM32F103RCT6

STM32F103RCT6是意法半導體(STMicroelectronics)推出的基于ARM Cortex-M3架構的32位微控制器。它擁有高效的運算能力和豐富的外設接口,適合進行嵌入式系統(tǒng)開發(fā)。該芯片的主頻可達72MHz,具備64KB的Flash存儲和20KB的SRAM,適用于實時數(shù)據(jù)處理和控制任務。STM32F103RCT6支持多種通信協(xié)議(如SPI、I2C、USART等),能夠與傳感器、顯示器、繼電器、Wi-Fi模塊等設備進行高效通信,是本系統(tǒng)中核心的數(shù)據(jù)處理和控制單元。

2.?溫濕度傳感器:SHT30

SHT30是由瑞士Sensirion公司生產的高精度數(shù)字溫濕度傳感器。它使用I2C通信協(xié)議,能夠提供溫度和濕度的實時數(shù)字輸出,精度高,響應速度快。其測量范圍為溫度-40°C至+125°C,濕度0%RH至100%RH,適用于各種環(huán)境監(jiān)測。SHT30的低功耗特點使其非常適合長時間工作的嵌入式系統(tǒng),且其穩(wěn)定性和可靠性在環(huán)境監(jiān)測中表現(xiàn)優(yōu)異。

3.?通風風扇:繼電器控制

在本項目中,通風風扇通過繼電器進行控制。繼電器是一種電磁開關設備,可以在主控芯片通過低電平信號激活時打開或關閉風扇電源。繼電器通常用于控制較大電流的負載,如風扇等電器設備。本項目使用的繼電器具備較高的負載能力,可以可靠地驅動風扇工作,同時避免直接使用微控制器直接驅動高電流負載的風險。

4.?Wi-Fi模塊:ESP8266

ESP8266是一款低功耗的Wi-Fi模塊,由Espressif Systems公司生產,廣泛應用于物聯(lián)網(IoT)設備中。它具有內置的Wi-Fi功能,支持802.11 b/g/n協(xié)議,能夠實現(xiàn)無線通信,將數(shù)據(jù)從傳感器上傳到服務器,或者接收控制命令。ESP8266支持AT指令集,也可以通過Arduino或其他平臺進行編程控制。在本項目中,ESP8266用于將溫濕度數(shù)據(jù)上傳至遠程服務器,并支持通過網頁進行遠程控制。

5.?顯示屏:0.96寸OLED

0.96寸OLED顯示屏是一款小尺寸、高對比度的顯示模塊,常用于嵌入式項目中。它通常使用I2C通信協(xié)議,與主控芯片連接,能夠顯示溫濕度等實時數(shù)據(jù)。OLED屏幕沒有背光,顯示效果清晰且省電,尤其適合在低功耗的嵌入式系統(tǒng)中使用。該顯示屏具有128x64像素的分辨率,能夠清晰地呈現(xiàn)溫度和濕度數(shù)據(jù),幫助用戶快速查看大棚環(huán)境狀況。

6.?水汽檢測:雨滴傳感器

? 雨滴傳感器用于檢測大棚內的水滴或濕氣狀況,能夠感知環(huán)境中的水分變化。該傳感器采用電阻式或電容式工作原理,在感應到水滴或濕氣時改變其電阻值或電容值,從而向主控芯片發(fā)送信號。在本項目中,雨滴傳感器可用于檢測大棚內是否有積水或潮濕現(xiàn)象,協(xié)助監(jiān)控大棚的濕度,防止過多水分影響作物生長。

7.?蜂鳴器:有源蜂鳴器

有源蜂鳴器是一種能夠發(fā)出聲音信號的電子元件。它內部自帶振蕩電路,只需要提供適當?shù)碾娫醇纯砂l(fā)出聲音。在本項目中,蜂鳴器用于報警功能,當大棚內的溫濕度超過設定閾值時,蜂鳴器將通過高電平觸發(fā)發(fā)出警報,提醒用戶及時處理異常情況。蜂鳴器的音量和頻率足以引起用戶的注意,確保及時采取措施。

8.?電源模塊

電源模塊負責為系統(tǒng)中的所有硬件組件提供穩(wěn)定的電力供應。電源模塊一般包括DC-DC轉換器,能夠將輸入的電壓轉換為適合各個模塊的工作電壓(例如3.3V、5V等)。在本項目中,電源模塊必須能夠支持STM32、ESP8266、傳感器、顯示屏和風扇等模塊的電力需求,同時保證電壓穩(wěn)定,避免電源波動對系統(tǒng)的影響。電源模塊的穩(wěn)定性是保證系統(tǒng)正常運行的基礎。

二、服務器設計

設備通過TCP協(xié)議向服務器上傳溫濕度數(shù)據(jù),并在HTML前端進行展示。

2.1?服務器后端代碼 (Python + Flask)

服務器后端將使用TCP協(xié)議接收來自設備端的數(shù)據(jù),并將數(shù)據(jù)存儲在內存中。同時,F(xiàn)lask用于提供網頁界面,讓用戶能夠實時查看溫濕度數(shù)據(jù)。

#?server.py
import?socket
import?threading
from?flask?import?Flask,?render_template
import?time

#?創(chuàng)建Flask應用
app?=?Flask(__name__)

#?存儲接收到的溫濕度數(shù)據(jù)
temperature?=?None
humidity?=?None

#?TCP服務器設置
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ù)據(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服務器
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:服務器通過TCP協(xié)議接收數(shù)據(jù)。設備端通過TCP發(fā)送溫濕度數(shù)據(jù)到服務器,數(shù)據(jù)格式為"temp:<temperature>,hum:<humidity>"。服務器解析這些數(shù)據(jù)并存儲在全局變量temperaturehumidity中。

??Flask Web Server:Flask用于提供網頁界面,用戶訪問/路徑時,F(xiàn)lask會渲染index.html頁面,并將最新的溫濕度數(shù)據(jù)傳遞給前端顯示。

??多線程處理:使用threading模塊實現(xiàn)了TCP服務器的多線程處理,允許多個設備同時連接并發(fā)送數(shù)據(jù)。

2.2?HTML前端代碼 (index.html)

HTML頁面用于顯示實時的溫濕度數(shù)據(jù)。頁面會定時刷新,以便實時查看數(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>實時溫度:?<span?id="temperature">{{?temperature?if?temperature?else?'無數(shù)據(jù)'?}}</span>°C</h2>
????????<p>實時濕度:?<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ù)實時更新
????????function?refreshData()?{
????????????window.location.reload();
????????}

????????setInterval(refreshData,?5000);?//?每5秒自動刷新
????</script>

</body>
</html>

說明:

??實時數(shù)據(jù)展示{{ temperature }}{{ humidity }}是Flask傳遞給模板的數(shù)據(jù)。通過Jinja模板語法,F(xiàn)lask將Python中的數(shù)據(jù)動態(tài)插入到HTML中。

??定時刷新:每5秒通過JavaScript的setInterval方法自動刷新頁面,以保證前端能夠實時獲取最新的溫濕度數(shù)據(jù)。

??刷新按鈕:用戶也可以通過點擊“刷新數(shù)據(jù)”按鈕手動刷新數(shù)據(jù)。

2.3?運行項目

確保Python環(huán)境已安裝Flask模塊,使用以下命令安裝:

pip?install?flask

啟動Flask應用:

python?server.py

? 服務器將啟動在http://0.0.0.0:5000,并且能夠接收設備數(shù)據(jù)。

? 確保設備已正確連接至網絡,并能夠向服務器的IP和端口發(fā)送數(shù)據(jù)。

2.4 HTML網頁-靜態(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>大棚自動通風系統(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>大棚自動通風系統(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>

????<!--?溫濕度閾值調整?-->
????<div?class="threshold-container">
????????<h2>溫濕度閾值調整</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>

????<!--?風扇控制?-->
????<div?class="fan-control">
????????<h2>風扇控制</h2>
????????<button?onclick="turnOnFan()">開啟風扇</button>
????????<button?onclick="turnOffFan()">關閉風扇</button>
????</div>

????<script>
????????//?模擬獲取環(huán)境溫度和濕度數(shù)據(jù)
????????function?updateData()?{
????????????//?這里應該替換為實際的?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;
????????????//?這里應該替換為實際的?API?請求來保存閾值
????????????alert(`溫度閾值已保存為?${tempThreshold}?°C,濕度閾值已保存為?${humidityThreshold}?%`);
????????}

????????//?開啟風扇
????????function?turnOnFan()?{
????????????//?這里應該替換為實際的?API?請求來控制風扇
????????????alert('風扇已開啟');
????????}

????????//?關閉風扇
????????function?turnOffFan()?{
????????????//?這里應該替換為實際的?API?請求來控制風扇
????????????alert('風扇已關閉');
????????}

????????//?定時更新數(shù)據(jù)
????????setInterval(updateData,?5000);
????????updateData();
????</script>
</body>

</html>

2.5 HTMl網頁-靜態(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>大棚自動通風系統(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>大棚自動通風系統(tǒng)</h1>
????<div?class="container">
????????<!--?環(huán)境數(shù)據(jù)部分?-->
????????<div?class="data-section">
????????????<div>
????????????????<strong>當前溫度:</strong>?<span?id="current-temp">--</span>?°C
????????????</div>
????????????<div>
????????????????<strong>當前濕度:</strong>?<span?id="current-humidity">--</span>?%
????????????</div>
????????</div>

????????<!--?溫濕度閥值調整部分?-->
????????<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>

????????<!--?風扇控制部分?-->
????????<div?class="button-group">
????????????<button?id="fan-on"?class="on">開啟風扇</button>
????????????<button?id="fan-off"?class="off">關閉風扇</button>
????????</div>

????????<!--?風扇狀態(tài)顯示?-->
????????<div?class="status"?id="fan-status">風扇狀態(tài):?<span>關閉</span></div>
????</div>

????<script>
????????//?假設從ESP8266接收到的數(shù)據(jù)
????????let?currentTemperature?=?25;?//?當前溫度
????????let?currentHumidity?=?55;????//?當前濕度

????????//?更新網頁中的環(huán)境溫濕度數(shù)據(jù)
????????function?updateEnvironmentData()?{
????????????document.getElementById('current-temp').textContent?=?currentTemperature;
????????????document.getElementById('current-humidity').textContent?=?currentHumidity;
????????}

????????//?模擬從服務器獲取實時環(huán)境數(shù)據(jù)
????????setInterval(function()?{
????????????//?此處需要調用ESP8266獲取的實時數(shù)據(jù)
????????????//?假設溫度和濕度變化
????????????currentTemperature?+=?Math.random()?*?2?-?1;?//?隨機變化模擬
????????????currentHumidity?+=?Math.random()?*?2?-?1;????//?隨機變化模擬
????????????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);
????????});

????????//?風扇控制
????????const?fanOnButton?=?document.getElementById('fan-on');
????????const?fanOffButton?=?document.getElementById('fan-off');
????????const?fanStatusText?=?document.getElementById('fan-status');

????????fanOnButton.addEventListener('click',?function()?{
????????????//?發(fā)送命令給ESP8266打開風扇
????????????fanStatusText.innerHTML?=?'風扇狀態(tài):?<span>開啟</span>';
????????????fanOnButton.disabled?=?true;
????????????fanOffButton.disabled?=?false;
????????????console.log('風扇已開啟');
????????});

????????fanOffButton.addEventListener('click',?function()?{
????????????//?發(fā)送命令給ESP8266關閉風扇
????????????fanStatusText.innerHTML?=?'風扇狀態(tài):?<span>關閉</span>';
????????????fanOnButton.disabled?=?false;
????????????fanOffButton.disabled?=?true;
????????????console.log('風扇已關閉');
????????});

????????//?初始頁面加載時更新顯示
????????updateEnvironmentData();
????</script>
</body>
</html>

三、STM32代碼設計

項目的目標是通過STM32F103RCT6微控制器監(jiān)測溫濕度數(shù)據(jù),并通過Wi-Fi模塊(ESP8266)將這些數(shù)據(jù)上傳到后端服務器。

當前項目使用的相關軟件工具、模塊源碼已經上傳到網盤:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink

3.1?硬件設計概述

??主控芯片:STM32F103RCT6
負責處理傳感器數(shù)據(jù)、控制風扇的開關、通信模塊的控制等。

??溫濕度傳感器:SHT30
用于測量大棚內的溫度和濕度。

??Wi-Fi模塊:ESP8266
用于將溫濕度數(shù)據(jù)通過TCP協(xié)議傳輸?shù)竭h程服務器。

??顯示模塊:0.96寸OLED
用于顯示實時溫濕度數(shù)據(jù)。

??蜂鳴器和繼電器
用于報警和控制風扇。

3.2?軟件設計概述

STM32的程序由以下幾個模塊組成:

1.?溫濕度數(shù)據(jù)采集模塊:通過I2C接口讀取SHT30溫濕度傳感器的數(shù)據(jù)。

2.?Wi-Fi數(shù)據(jù)上傳模塊:通過USART與ESP8266進行通信,利用AT指令將數(shù)據(jù)上傳到服務器。

3.?OLED顯示模塊:通過I2C接口將當前的溫濕度數(shù)據(jù)實時顯示。

4.?風扇控制模塊:根據(jù)溫濕度閾值控制繼電器,開啟或關閉風扇。

5.?蜂鳴器報警模塊:當溫濕度超出設定范圍時,觸發(fā)蜂鳴器報警。

3.3?STM32代碼設計

(1)主代碼

以下代碼將包括溫濕度的監(jiān)測,風扇的自動控制,數(shù)據(jù)的上傳,報警功能,以及其他所需功能的實現(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"????????//?風扇繼電器控制庫
#include?"tim.h"??????????//?定時器庫
#include?"usart.h"????????//?UART庫

#define?TEMP_THRESHOLD?30??//?溫度閾值,超過此溫度自動開啟風扇
#define?HUM_THRESHOLD?70???//?濕度閾值,超過此濕度觸發(fā)報警

//?定義用于存儲溫濕度數(shù)據(jù)的結構體
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();?????//?初始化繼電器(風扇控制)
????ESP8266_Init();???//?初始化ESP8266?Wi-Fi模塊

????//?開始定時器,用于周期性地讀取數(shù)據(jù)
????start_timer();

????while?(1)?{
????????//?讀取傳感器數(shù)據(jù)
????????read_sensor_data();

????????//?自動控制風扇(基于溫濕度)
????????control_fan();

????????//?更新顯示內容
????????display_data();

????????//?上傳數(shù)據(jù)到服務器
????????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(&current_data.temperature,?&current_data.humidity);
????if?(ret?!=?0)?{
????????//?讀取失敗處理
????}
}

//?控制風扇的開啟與關閉
void?control_fan(void)?{
????if?(current_data.temperature?>?TEMP_THRESHOLD?||?current_data.humidity?>?HUM_THRESHOLD)?{
????????Relay_ON();??//?超過閾值時開啟風扇
????}?else?{
????????Relay_OFF();?//?否則關閉風扇
????}
}

//?顯示實時數(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ù)到服務器(通過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ù)到服務器
}

//?蜂鳴器報警
void?buzzer_alert(void)?{
????Buzzer_ON();
????HAL_Delay(500);
????Buzzer_OFF();
}

//?定時器回調函數(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傳感器驅動代碼

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ù)轉換為溫濕度值
????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進行通信,實現(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");??//?設置為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?設計說明

1.?溫濕度監(jiān)測:通過SHT30傳感器獲取實時的溫濕度數(shù)據(jù),使用I2C協(xié)議與STM32進行通信。

2.?數(shù)據(jù)上傳:數(shù)據(jù)通過ESP8266 Wi-Fi模塊與后端服務器進行通信。ESP8266通過USART與STM32進行數(shù)據(jù)交互,發(fā)送溫濕度數(shù)據(jù)到服務器。

3.?OLED顯示:STM32通過I2C將溫濕度數(shù)據(jù)實時顯示在OLED屏幕上,便于用戶查看。

4.?風扇控制:當溫度超過30°C時,STM32通過繼電器控制風扇打開,保證大棚的溫度在合理范圍內。

5.?報警功能:當溫濕度超過預設閾值時,STM32觸發(fā)蜂鳴器報警,提醒用戶采取措施。

3.5?總結

本項目基于STM32微控制器,通過SHT30傳感器監(jiān)測大棚內的環(huán)境溫濕度,并通過ESP8266模塊將數(shù)據(jù)上傳到服務器。同時,系統(tǒng)還提供實時顯示、風扇控制以及報警功能,確保大棚內的環(huán)境得到及時調節(jié)和監(jiān)控。

四、總結

本項目設計并實現(xiàn)了一個基于STM32的自動化大棚通風系統(tǒng),成功集成了環(huán)境監(jiān)測、自動風扇控制、報警功能、數(shù)據(jù)可視化和遠程控制等多項功能。通過溫濕度傳感器(SHT30)的實時數(shù)據(jù)采集與處理,結合STM32的高效控制能力,實現(xiàn)了對大棚環(huán)境的精確調節(jié),確保溫濕度保持在預設范圍內,以促進植物的生長。

系統(tǒng)的自動控制功能能夠根據(jù)實時溫濕度數(shù)據(jù)自動啟閉風扇,并通過蜂鳴器發(fā)出報警信號,提醒用戶干預。OLED顯示屏實時展示環(huán)境數(shù)據(jù),方便用戶監(jiān)控大棚內的狀態(tài)。同時,系統(tǒng)還具有歷史數(shù)據(jù)記錄和定時控制功能,為用戶提供更加智能化的操作體驗。

遠程控制功能的實現(xiàn)通過ESP8266模塊將溫濕度數(shù)據(jù)上傳至服務器,用戶可以通過手機或PC端遠程查看大棚環(huán)境數(shù)據(jù)并控制風扇,提升了操作的便捷性和靈活性。

通過本項目的實現(xiàn),不僅能優(yōu)化大棚內環(huán)境管理,提高作物生長效率,同時也為智能農業(yè)的進一步發(fā)展提供了一個實踐平臺。未來可以在此基礎上引入更多智能化控制,比如光照調節(jié)、濕度補償?shù)?,進一步提升系統(tǒng)的綜合性能與應用場景。

本項目實現(xiàn)了軟硬件的良好結合,充分展示了基于STM32的物聯(lián)網技術在農業(yè)自動化中的廣泛應用前景。

意法半導體

意法半導體

意法半導體(ST)集團于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導體有限公司。意法半導體是世界最大的半導體公司之一,公司銷售收入在半導體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(17%),計算機(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計數(shù)據(jù),意法半導體是全球第五大半導體廠商,在很多市場居世界領先水平。例如,意法半導體是世界第一大專用模擬芯片和電源轉換芯片制造商,世界第一大工業(yè)半導體和機頂盒芯片供應商,而且在分立器件、手機相機模塊和車用集成電路領域居世界前列.

意法半導體(ST)集團于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導體有限公司。意法半導體是世界最大的半導體公司之一,公司銷售收入在半導體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(17%),計算機(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計數(shù)據(jù),意法半導體是全球第五大半導體廠商,在很多市場居世界領先水平。例如,意法半導體是世界第一大專用模擬芯片和電源轉換芯片制造商,世界第一大工業(yè)半導體和機頂盒芯片供應商,而且在分立器件、手機相機模塊和車用集成電路領域居世界前列.收起

查看更多

相關推薦