基於 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 需求分析
系統需實現以下功能:
- 即時採集棚內溫度、濕度、光照強度與時鐘;
- 自動模式下按閾值聯動五路執行器,且執行器不頻繁啟停;
- 支援補光、通風兩個定時視窗,可跨午夜配置;
- 自動/手動雙模式,手動模式可逐路控制設備;
- 閾值與視窗參數掉電儲存;
- 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 元器件選型
| 類別 | 型號 | 關鍵參數 | 作用 |
|---|---|---|---|
| 主控 | STM32F103C8T6 | 72 MHz,64KB Flash,20KB RAM | 感測採集、控制決策、選單互動 |
| 溫濕度 | DHT11 | ±2 ℃ / ±5%RH,單匯流排 | 棚內溫濕度採集 |
| 光照 | BH1750 | 1~65535 lx,I2C 位址 0x23 | 光照強度採集 |
| 時鐘 | DS3231 | I2C RTC,±2ppm,紐扣電池備份 | 定時視窗與顯示走時 |
| 顯示 | OLED 0.96" | 128×64,SSD1306,I2C 0x3C | 中文選單顯示 |
| 執行 | 繼電器 K1/K2 | 5 V,高電平吸合 | 風扇 / 加熱片開關 |
| 執行 | N-MOS 低邊模組 | 電平導通 | 加濕器電源開關 |
| 補光 | LED 燈帶 | 高電平點亮 | 光照不足補光 |
| 報警 | 有源蜂鳴器 | NPN 三極體驅動 | 越限提示 |
| 聯網 | ESP12F | 802.11 b/g/n,HTTP 服務 | 協定轉換與 OTA |
| 按鍵 | 輕觸開關 ×4 | EXTI 下降沿 + 消抖 | 選單操作 |
3 硬體系統設計
3.1 引腳資源分配
| 外設 | 引腳 | 說明 |
|---|---|---|
| DHT11 資料線 | PA8 | 單匯流排,開漏 + 上拉 |
| BH1750 | PA0(SCL) / PA1(SDA) | 軟體 I2C |
| OLED SSD1306 | PB8(SCL) / PB9(SDA) | 軟體 I2C,位址 0x3C |
| DS3231 | PB12(SCL) / PB13(SDA) | 軟體 I2C,驅動自管 GPIO |
| 按鍵 KEY1~KEY4 | PA3 / PB5 / PB6 / PB7 | 上拉輸入,EXTI 下降沿 |
| 繼電器 K1(風扇) | PB3 | 高電平吸合 |
| 繼電器 K2(加熱片) | PB4 | 高電平吸合 |
| 加濕器(N-MOS) | PB14 | 高電平導通 |
| LED 補光 | PB15 | 高電平點亮 |
| 蜂鳴器 | PB1 | NPN 驅動,高電平響 |
| USART1 | PA9(TX) / PA10(RX) | 業務幀,接 ESP12F |
| USART3 | PB10(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 主程序流程

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

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

自動控制每 1 s 執行一次,是系統的核心決策層,設計遵循三條原則:
帶回差啟停。 若僅用單一閾值判斷,測量值在閾值附近抖動會導致執行器頻繁通斷。系統為每條規則引入回差:溫度回差 1 ℃、濕度回差 5%RH、光照回差 100 lx。以降溫為例,溫度高於上限(預設 33 ℃)進入降溫,須回落到「上限 − 1 ℃」以下才退出。
互斥與優先順序。 加熱與風扇(降溫/除濕共用)互斥,加濕與除濕互斥,避免同一時刻既加熱又降溫;溫度規則與濕度規則爭用風扇時溫度優先。彙總輸出階段統一裁決:風扇 = 定時通風 ∨ ((降溫 ∨ 除濕) ∧ ¬加熱)。
定時視窗疊加。 補光規則只在補光視窗(預設 06:00–18:00)內生效,視窗外補光燈強制關閉;通風視窗(預設 10:00–14:00)內風扇強制開啟用於換氣,且通風不觸發蜂鳴報警。視窗支援跨午夜配置(起始大於結束)與禁用(起止相等)。
感測器故障保護:DHT11 連續 3 次讀取失敗即判定故障,凍結全部功率輸出並蜂鳴器長鳴,安全優先。
4.4 按鍵選單狀態機

UI 為 7 頁狀態機:主頁兩頁(KEY3/KEY4 翻頁)、選單頁、模式選擇、設備控制、閾值設置、定時設置。按鍵語義在任何頁面保持一致:確認/進入、返回/儲存、上移/加、下移/減。模式切換時清零全部設備輸出,讓自動規則重新判定;手動模式下設備控制頁逐路翻轉設備,自動態下按鍵僅給出 1.5 s 提示而不執行,避免誤操作。
OLED 重新整理採用行快取去重:每行繪製內容先與上次快取比較,變化才寫屏,從機制上消除重新整理閃爍。考慮到軟體 I2C 無 ACK、繼電器與霧化片的 EMI 偶發寫壞 GDDRAM(表現為個別漢字變實心方塊),主迴圈每 30 s 將行快取整體失效一次強制重繪,實現顯示自癒。
4.5 參數編輯與掉電儲存

閾值正被自動規則即時使用,因此編輯採用草稿機制:進入編輯時拷貝當前值到草稿,KEY3/KEY4 調整草稿,編輯項閃爍顯示,僅 KEY2 儲存時才寫入生效值並持久化。調整過程即時鉗位,保證下限嚴格小於上限。
掉電儲存將 5 項閾值與兩個定時視窗打包為 20 位元組結構體,附 CRC16-CCITT 校驗後寫入片內 Flash。這裡有一個實測教訓:儲存區最初設在 0x08007C00,韌體增長到 35 KB 後,OLED 中文字模表恰好落進同一頁,每次儲存擦頁都把前 13 個漢字字形擦成 0xFF,屏上出現實心方塊。修復方案是將儲存區移至晶片最後一頁 0x0800FC00,並透過連結腳本把 Flash 長度壓到 63 KB——韌體一旦超過即連結報錯,杜絕靜默覆蓋。載入時校驗 magic 字與 CRC16,任一不符即用預設值。
4.6 串列埠接收成幀

USART1 中斷只做一件事:拼行。收到 @ 開始新幀,收到 \r/\n 結束成幀,ESP 上電日誌、亂碼等非 @ 開頭位元組一律丟棄。上幀未被主迴圈取走時新幀直接丟棄而不覆蓋,超長幀整幀丟棄防溢出。
中斷處理沒有使用 HAL 的接收 API,而是直接讀 SR 後讀 DR:HAL 在溢出錯誤(ORE)時會關閉接收中斷且不重新武裝,導致接收永久死鎖;自寫 ISR 的「讀 SR 再讀 DR」序列可同時清除 RXNE 與 ORE/FE/NE/PE 標誌,無死鎖狀態。主迴圈還每輪檢查接收中斷使能位,被任何路徑誤關時立即補回,實現鏈路自癒。
4.7 命令解析執行

主迴圈以關中斷方式原子取走整幀後解析,協定為 @ 開頭、逗號分隔、換行結尾的 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) | 方法 | 功能 |
|---|---|---|
/health | GET | 存活、版本、uptime、串列埠統計 |
/sensor | GET | 溫濕度/光照/RTC(讀 2 s 快取) |
/state | GET | 模式 + 五路設備狀態 |
/device | GET/POST | 設備控制(樂觀更新,立即回顯) |
/mode | GET/POST | 模式切換 |
/threshold / /timer | GET/POST | 閾值與定時視窗讀寫 |
/frames / /raw | GET | 串列埠原始幀環與白名單直發(聯調) |
由於 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.