基於 STM32 的智慧農業大棚環境控制系統設計

#智能硬體#STM32#物聯網

摘要

針對溫室大棚人工管理勞動強度大、環境調控不及時的問題,本文設計並實現了一種基於 STM32 的智慧農業大棚環境控制系統。系統以 STM32F103C8T6 為控制核心,DHT11 採集棚內溫濕度,BH1750 採集光照強度,DS3231 提供即時時鐘;按帶回差的自動控制規則驅動繼電器與 MOS 管聯動風扇、加熱片、加濕器、補光燈與蜂鳴器五路執行器,並疊加補光、通風兩個可配置的定時視窗。使用者參數經 CRC16 校驗後儲存於片內 Flash 掉電區,透過 OLED 中文選單與四按鍵完成本地互動;ESP12F 將串列埠業務幀轉換為 HTTP+JSON 介面,配套 React Native 手機 App 在區域網路內完成監控與配置。測試表明,系統控制規則正確、互斥與優先順序設計合理、參數掉電儲存可靠,滿足小型溫室的自動化管理需求。

關鍵詞:STM32;溫室大棚;回差控制;定時視窗;掉電儲存;ESP12F

1 引言

溫室栽培對溫度、濕度與光照有嚴格的視窗要求:溫度過高需要通風降溫,過低需要加熱;濕度過高易誘發病害,過低影響蒸騰作用;冬季日照不足時還需人工補光。傳統大棚依賴人工巡檢與手動開關,調控滯後且勞動強度大。

市面上農業控制器多以裸機延時輪詢實現,存在回應節拍不穩、參數無法掉電儲存、缺少聯網能力等問題。本文設計一種以 STM32F103C8T6 為核心的大棚環境控制系統:在軟體上採用軟定時器分頻的超迴圈架構保證控制節拍精確,在控制策略上引入回差(滯回)與互斥機制避免執行器頻繁啟停,在資料管理上實現 CRC16 校驗的掉電儲存,並透過 ESP12F 聯網接入手機 App,形成「感測—決策—執行—互動」的完整閉環。

2 系統總體設計

2.1 需求分析

系統需實現以下功能:

  1. 即時採集棚內溫度、濕度、光照強度與時鐘;
  2. 自動模式下按閾值聯動五路執行器,且執行器不頻繁啟停;
  3. 支援補光、通風兩個定時視窗,可跨午夜配置;
  4. 自動/手動雙模式,手動模式可逐路控制設備;
  5. 閾值與視窗參數掉電儲存;
  6. OLED 中文選單本地互動,手機 App 遠端監控。

2.2 總體架構

系統採用「STM32 感知控制 + ESP12F 聯網」的雙層架構。STM32F103C8T6 運行裸機超迴圈程式,用 HAL_GetTick() 構造多個軟定時器分頻輪詢:每 2 s 採集感測器、每 1 s 讀取 RTC 並執行自動控制、每 500 ms 重新整理 OLED、每 2 s 向串列埠上報資料幀。ESP12F 透過 USART1 與 STM32 交换自訂 @ 協定幀,對上提供 HTTP+JSON 介面,手機 App 與網頁用戶端均透過該介面存取設備。

相比引入 RTOS,裸機超迴圈在本場景下更簡單可靠:系統任務均為週期性短任務(單輪迴圈最長阻塞不超過 DHT11 一次讀取的約 25 ms),軟定時器分頻即可滿足 1 s 級控制節拍,且規避了 RTOS 的優先順序與堆疊管理複雜度。

2.3 元器件選型

類別型號關鍵參數作用
主控STM32F103C8T672 MHz,64KB Flash,20KB RAM感測採集、控制決策、選單互動
溫濕度DHT11±2 ℃ / ±5%RH,單匯流排棚內溫濕度採集
光照BH17501~65535 lx,I2C 位址 0x23光照強度採集
時鐘DS3231I2C RTC,±2ppm,紐扣電池備份定時視窗與顯示走時
顯示OLED 0.96"128×64,SSD1306,I2C 0x3C中文選單顯示
執行繼電器 K1/K25 V,高電平吸合風扇 / 加熱片開關
執行N-MOS 低邊模組電平導通加濕器電源開關
補光LED 燈帶高電平點亮光照不足補光
報警有源蜂鳴器NPN 三極體驅動越限提示
聯網ESP12F802.11 b/g/n,HTTP 服務協定轉換與 OTA
按鍵輕觸開關 ×4EXTI 下降沿 + 消抖選單操作

3 硬體系統設計

3.1 引腳資源分配

外設引腳說明
DHT11 資料線PA8單匯流排,開漏 + 上拉
BH1750PA0(SCL) / PA1(SDA)軟體 I2C
OLED SSD1306PB8(SCL) / PB9(SDA)軟體 I2C,位址 0x3C
DS3231PB12(SCL) / PB13(SDA)軟體 I2C,驅動自管 GPIO
按鍵 KEY1~KEY4PA3 / PB5 / PB6 / PB7上拉輸入,EXTI 下降沿
繼電器 K1(風扇)PB3高電平吸合
繼電器 K2(加熱片)PB4高電平吸合
加濕器(N-MOS)PB14高電平導通
LED 補光PB15高電平點亮
蜂鳴器PB1NPN 驅動,高電平響
USART1PA9(TX) / PA10(RX)業務幀,接 ESP12F
USART3PB10(TX) / PB11(RX)除錯列印

3.2 執行器驅動電路

風扇與加熱片屬於感性/大功率負載,經 5 V 繼電器隔離驅動,單片機 GPIO 只提供高電平控制訊號,弱電與強電完全分離。加濕器模組為電平使能型,其按鈕已短接為常通狀態,因此採用 N-MOS 低邊開關控制模組供電,實現「給電即噴霧、斷電即停止」。PB3、PB4 復位預設為 JTAG 除錯引腳,初始化時透過 AFIO 重映射 SWJ_NOJTAG 關閉 JTAG(保留 SWD 燒錄口),將其釋放為普通 GPIO。

3.3 人機互動電路

四按鍵按「最左確認、左二返回、右側上下」的直覺佈局,EXTI 下降沿觸發並在中斷內完成消抖與電平校驗,主迴圈統一消費按鍵事件。OLED 顯示中文 16×16 / ASCII 8×16 混排文字,四行佈局分主頁兩頁與四個功能頁。

4 軟體系統設計

4.1 主程序流程

主程序流程圖(主幹)
圖 4-1 主程序流程圖(主幹)

主程序為超迴圈結構,每輪依次處理:行快取週期性失效、按鍵事件、串列埠幀解析、以及四路軟定時器(感測器 2 s、控制 1 s、顯示 500 ms、上報 2 s)。由於各任務均為短任務,單輪迴圈耗時可忽略,控制節拍由 HAL_GetTick() 差值保證,不受迴圈體執行時間波動影響。

4.2 系統初始化

系統初始化流程
圖 4-2 系統初始化流程

上電後依次完成:向量表重定位(本韌體為獨立韌體,必須將 VTOR 顯式設為 Flash 基址,否則第一個中斷即 HardFault)、時脈配置(HSE 8 MHz 倍頻至 72 MHz)、GPIO 與雙串列埠初始化、按鍵 EXTI 註冊、使能 DWT 週期計數器(供 DHT11 微秒時序)、從 Flash 載入使用者參數、外設初始化。DS3231 出廠值為 2000 年,程序檢測到年份小於 2026 時用編譯時間自動校準一次,此後依靠紐扣電池走時。

4.3 自動控制規則

自動控制規則流程
圖 4-3 自動控制規則流程圖(圖 4-1 子流程)

自動控制每 1 s 執行一次,是系統的核心決策層,設計遵循三條原則:

帶回差啟停。 若僅用單一閾值判斷,測量值在閾值附近抖動會導致執行器頻繁通斷。系統為每條規則引入回差:溫度回差 1 ℃、濕度回差 5%RH、光照回差 100 lx。以降溫為例,溫度高於上限(預設 33 ℃)進入降溫,須回落到「上限 − 1 ℃」以下才退出。

互斥與優先順序。 加熱與風扇(降溫/除濕共用)互斥,加濕與除濕互斥,避免同一時刻既加熱又降溫;溫度規則與濕度規則爭用風扇時溫度優先。彙總輸出階段統一裁決:風扇 = 定時通風 ∨ ((降溫 ∨ 除濕) ∧ ¬加熱)。

定時視窗疊加。 補光規則只在補光視窗(預設 06:00–18:00)內生效,視窗外補光燈強制關閉;通風視窗(預設 10:00–14:00)內風扇強制開啟用於換氣,且通風不觸發蜂鳴報警。視窗支援跨午夜配置(起始大於結束)與禁用(起止相等)。

感測器故障保護:DHT11 連續 3 次讀取失敗即判定故障,凍結全部功率輸出並蜂鳴器長鳴,安全優先。

4.4 按鍵選單狀態機

按鍵選單狀態機流程
圖 4-4 按鍵選單狀態機流程圖(圖 4-1 子流程)

UI 為 7 頁狀態機:主頁兩頁(KEY3/KEY4 翻頁)、選單頁、模式選擇、設備控制、閾值設置、定時設置。按鍵語義在任何頁面保持一致:確認/進入、返回/儲存、上移/加、下移/減。模式切換時清零全部設備輸出,讓自動規則重新判定;手動模式下設備控制頁逐路翻轉設備,自動態下按鍵僅給出 1.5 s 提示而不執行,避免誤操作。

OLED 重新整理採用行快取去重:每行繪製內容先與上次快取比較,變化才寫屏,從機制上消除重新整理閃爍。考慮到軟體 I2C 無 ACK、繼電器與霧化片的 EMI 偶發寫壞 GDDRAM(表現為個別漢字變實心方塊),主迴圈每 30 s 將行快取整體失效一次強制重繪,實現顯示自癒。

4.5 參數編輯與掉電儲存

參數編輯與掉電儲存流程
圖 4-5 參數編輯與掉電儲存流程圖(圖 4-4 子流程)

閾值正被自動規則即時使用,因此編輯採用草稿機制:進入編輯時拷貝當前值到草稿,KEY3/KEY4 調整草稿,編輯項閃爍顯示,僅 KEY2 儲存時才寫入生效值並持久化。調整過程即時鉗位,保證下限嚴格小於上限。

掉電儲存將 5 項閾值與兩個定時視窗打包為 20 位元組結構體,附 CRC16-CCITT 校驗後寫入片內 Flash。這裡有一個實測教訓:儲存區最初設在 0x08007C00,韌體增長到 35 KB 後,OLED 中文字模表恰好落進同一頁,每次儲存擦頁都把前 13 個漢字字形擦成 0xFF,屏上出現實心方塊。修復方案是將儲存區移至晶片最後一頁 0x0800FC00,並透過連結腳本把 Flash 長度壓到 63 KB——韌體一旦超過即連結報錯,杜絕靜默覆蓋。載入時校驗 magic 字與 CRC16,任一不符即用預設值。

4.6 串列埠接收成幀

串列埠接收成幀流程
圖 4-6 串列埠接收成幀流程圖(圖 4-1 子流程)

USART1 中斷只做一件事:拼行。收到 @ 開始新幀,收到 \r/\n 結束成幀,ESP 上電日誌、亂碼等非 @ 開頭位元組一律丟棄。上幀未被主迴圈取走時新幀直接丟棄而不覆蓋,超長幀整幀丟棄防溢出。

中斷處理沒有使用 HAL 的接收 API,而是直接讀 SR 後讀 DR:HAL 在溢出錯誤(ORE)時會關閉接收中斷且不重新武裝,導致接收永久死鎖;自寫 ISR 的「讀 SR 再讀 DR」序列可同時清除 RXNE 與 ORE/FE/NE/PE 標誌,無死鎖狀態。主迴圈還每輪檢查接收中斷使能位,被任何路徑誤關時立即補回,實現鏈路自癒。

4.7 命令解析執行

串列埠命令解析執行流程
圖 4-7 串列埠命令解析與執行流程圖(圖 4-6 子流程)

主迴圈以關中斷方式原子取走整幀後解析,協定為 @ 開頭、逗號分隔、換行結尾的 ASCII 幀,與 App/網頁共用:

方向幀格式說明
上行@DATA,t,h,lux,MODE,FAN:x,...,HH:MM:SS每 2 s 全量上報
上行@MODE,AUTO|MANUAL / @TH,... / @TIMER,LG|FV,...模式/閾值/視窗回報
下行@GET,ALL|TH|TIMER查詢
下行@CTRL,FAN|HEAT|HUMI|LED|BZ,0|1|T設備控制,僅手動模式
下行@MODE,AUTO|MANUAL模式切換
下行@SETTH,... / @SETTIMER,....參數設置,校驗通過才儲存

命令執行結果以 @OK / @ERR,<cmd>,<FORMAT|RANGE|MODE> 回應。設備控制與 OLED 選單遵循同一模式邊界:自動模式下 CTRL 命令被拒絕(@ERR,CTRL,MODE),避免與每秒覆蓋的自動規則打架。

5 ESP12F 聯網與手機 App

ESP12F 運行雙槽韌體(rboot 方案):recovery 槽不可變,負責配網與網頁 OTA,app 槽可隨時無線升級,刷壞也能從恢復槽重來,杜絕變磚。其軟體職責是協定轉換——把 @ 串列埠幀快取為狀態,對上暴露 REST 介面:

端點(/api/v1)方法功能
/healthGET存活、版本、uptime、串列埠統計
/sensorGET溫濕度/光照/RTC(讀 2 s 快取)
/stateGET模式 + 五路設備狀態
/deviceGET/POST設備控制(樂觀更新,立即回顯)
/modeGET/POST模式切換
/threshold / /timerGET/POST閾值與定時視窗讀寫
/frames / /rawGET串列埠原始幀環與白名單直發(聯調)

由於 STM32 每 2 s 主動推送 @DATA,ESP 側查詢端點基本是讀快取,回應延遲在毫秒級;快取未就緒時補發一條 @GET,ALL 催取。

手機 App 基於 React Native 開發,四個頁籤:首頁(即時資料與設備狀態)、控制(模式切換與五路設備開關)、設置(閾值與定時視窗編輯)、聯調(原始幀收發,便於現場排障)。App 與網頁用戶端共用同一組 /api/v1 介面,控制採用樂觀更新策略——不等下一幀上報,按鈕立即變色,實際狀態由 2 s 後的 @DATA 校正。

6 系統測試

6.1 功能測試

測試項操作預期結果結果
溫度上限聯動加熱使棚溫超過 33 ℃風扇開、蜂鳴提示通過
溫度回差棚溫降至 32 ℃ 以下風扇停通過
加熱聯動製冷使棚溫低於 20 ℃加熱片開、風扇關通過
濕度聯動與互斥濕度超 70%RH / 低於 35%RH除濕開風扇 / 加濕啟霧,與溫度不衝突通過
定時補光視窗內遮蔽光照感測器光照低於閾值補光開,視窗外強制關通過
定時通風進入通風視窗風扇強制開,不報警通過
手動模式設備控制頁翻轉設備僅手動可翻轉,自動態提示通過
參數掉電儲存儲存閾值後斷電重啟參數保持,CRC 校驗通過通過
串列埠命令App 下發 CTRL/MODE/SETTH均回 @OK,越限回 @ERR,RANGE通過
感測器故障拔下 DHT11輸出凍結、蜂鳴長鳴通過

6.2 性能測試

指標設計值實測
控制節拍1 s ± 10 ms穩定滿足
感測器採集週期2 s穩定滿足
資料上報週期2 s穩定滿足
OLED 重新整理週期500 ms(行快取去重)無可感知閃爍
App 查詢回應< 200 ms毫秒級(讀快取)
參數儲存擦寫單頁 20~40 ms,選單動作時才觸發無感

7 結論

本文完成了基於 STM32F103C8T6 的智慧農業大棚環境控制系統的設計與實現。系統以帶回差的自動控制規則與定時視窗實現環境自動調控,以互斥與優先順序機制保證執行器動作安全合理;草稿式編輯配合 CRC16 掉電儲存解決了參數可靠配置問題;自寫串列埠中斷規避了 HAL 接收死鎖,行快取加週期重繪實現了 OLED 顯示自癒;ESP12F 雙槽 OTA 與 REST 介面讓手機 App 完成遠端監控與無線升級。

系統仍存在改進空間:DHT11 精度有限,可升級 SHT30 並引入 PID 連續調節;聯動規則可擴展土壤濕度與 CO₂ 濃度;App 可接入雲平臺實現遠端(跨網段)存取與歷史資料曲線。

參考文獻

[1] 意法半導體. STM32F103xx 參考手冊 RM0008[Z]. 2021. [2] 意法半導體. STM32Cube HAL 使用者手冊 UM1850[Z]. 2023. [3] 羅姆半導體. BH1750FVI 環境光感測器資料手冊[Z]. 2011. [4] Maxwell D. DS3231 高精度 I2C RTC 資料手冊[Z]. Analog Devices, 2015. [5] 樂鑫資訊科技. ESP8266 Non-OS SDK API 參考[Z]. 2023. [6] 譚浩強. C 程式設計(第五版)[M]. 北京:清華大學出版社, 2017. [7] 劉火良,楊森. React Native 實戰[M]. 北京:機械工業出版社, 2017. [8] GB/T 5084-2021, 農田灌溉水質標準[S]. 北京:中國標準出版社, 2021.