基於 STM32 與 FreeRTOS 的智慧晾衣架控制系統設計

影片介紹:
摘要
隨著都市化進程加快與居民生活節奏提速,晾曬衣物這一日常事務對「及時收衣、避免雨淋」提出了更高要求。傳統的固定式晾衣架缺乏環境感知與遠端控制能力,遇到突發降雨時,使用者往往無法及時將衣物收回,且無法掌握晾曬狀態。針對上述問題,本文設計並實作了一套基於 STM32 微控制器的智慧晾衣架控制系統。
系統以 STM32F103C8T6 為主控核心,採用 FreeRTOS 建構多工即時排程框架;透過 DHT11 溫濕度感測器、BH1750 光照感測器與雨滴偵測模組採集環境資訊,以 28BYJ-48 步進馬達經 ULN2003A 驅動完成晾衣桿的伸縮動作,並透過 0.96 吋 OLED 顯示螢幕與四路按鍵構成本地人機互動介面。軟體上引入基於事件匯流排的分層架構,將硬體驅動層與業務決策層解耦,使下雨收衣、自動晾曬、模式切換等業務邏輯集中於服務層統一決策。同時,系統藉助 ESP-12F 模組搭建無線閘道器,提供網頁端與行動端兩種遠端控制方式,並透過 MQTT 協定接入 OneNET 雲端平台實現環境資料上報;基於 W25Q64 外部 Flash 與自訂 Bootloader,實現了 STM32 應用程式與 ESP-12F 韌體的 OTA 遠端升級,使設備在現場無須拆機即可更新程式。
測試結果表明:系統上電即進入自動模式並可自主完成晾曬;雨天觸發收衣的回應時間小於 2 s;馬達位置控制採用步數累加與極限位置校正,定位誤差小於 2%;網頁端與行動端控制指令下發至馬達動作的端到端延遲小於 500 ms;OTA 升級流程完整可靠。系統運行穩定、成本可控,具有良好的實用價值與推廣前景。
關鍵詞:STM32;FreeRTOS;智慧晾衣架;環境感知;事件匯流排;OTA 遠端升級;物聯網
1 引言
1.1 研究背景與意義
晾曬衣物是居民日常生活中高頻且必要的家務活動。然而,我國大部分地區降水具有突發性強、持續時間短的特點,使用者外出或夜間休息時若突遇降雨,晾曬在外的衣物極易被淋濕,甚至需要重新洗滌,既浪費水資源又影響生活體驗。此外,傳統晾衣架功能單一,無法感知光照、溫濕度等環境變化,也無法在使用者外出時回報晾曬狀態,難以滿足現代家庭對智慧化、便捷化的需求。
隨著嵌入式技術與物聯網技術的成熟,將微控制器、感測器網路與無線通訊相結合,建構具備環境感知、自主決策與遠端互動能力的智慧晾衣架,具有明確的實用價值。本課題的研究意義主要體現在兩個方面:一方面,透過環境感知與自動控制,實現「下雨自動收衣、雨停自動晾曬」,切實解決使用者的現實痛點;另一方面,透過模組化、分層化的軟硬體設計,為同類小型智慧家庭控制系統提供可複用的設計思路與工程實現參考。
1.2 國內外研究現狀
國外智慧家庭產業發展較早,智慧晾曬類產品多以整機形態出現,通常整合電動升降、烘乾與殺菌功能,但普遍價格較高,且依賴廠商雲端服務,二次開發與在地化客製能力有限。國內近年來湧現出大量基於單晶片的智慧晾衣架設計方案,多以 STM32 或 51 單晶片為控制核心,配合步進馬達、雨滴感測器與 Wi-Fi 模組實現基本功能。
從已公開的文獻與設計案例看,現有方案仍存在若干不足:一是軟體結構多為單工前後台架構,業務邏輯、協定解析與硬體操作混雜在一起,可維護性差;二是感測器讀值普遍未經防抖處理,馬達啟停瞬間的電氣雜訊易導致雨滴誤判,進而引發狀態機頻繁切換;三是遠端升級功能缺失,產品出廠後無法在不拆機的情況下修復缺陷或升級功能。本文在實現完整功能的同時,重點針對上述問題給出分層解耦、防抖確認與 OTA 升級的解決方案。
1.3 主要研究內容
本文的主要研究內容為:設計一套以 STM32F103C8T6 為核心、具備環境感知與自動決策能力的智慧晾衣架控制系統,完成硬體電路設計、FreeRTOS 多工軟體設計、序列埠通訊協定設計、本地人機互動設計、無線閘道器與雲端平台接入設計以及 OTA 遠端升級設計,並透過測試驗證系統功能與效能。
2 系統總體方案設計
2.1 需求分析
根據智慧晾衣架的使用場景,系統需求可分為功能需求與非功能需求兩部分。功能需求包括:①環境感知,即時採集溫度、濕度、光照強度與降雨狀態;②自動控制,降雨時自動收回衣物、雨停後自動晾出衣物;③手動控制,使用者可透過本地按鍵選單或遠端介面手動收衣、晾衣;④模式管理,支援自動與手動兩種工作模式;⑤狀態顯示,即時顯示環境資料、工作模式與馬達運行狀態;⑥遠端互動,支援區域網路內網頁控制與行動端控制;⑦資料上雲,將環境資料上報至雲端平台;⑧遠端升級,支援主控程式與無線模組韌體的線上升級。
非功能需求包括:即時性,雨天收衣動作應在雨滴確認後 2 s 內啟動;可靠性,停電恢復後應能恢復位置與模式資訊,且感測器讀值需具備抗干擾能力;可維護性,軟體應結構清晰、模組職責單一,便於後續功能擴充;經濟性,整體物料成本應控制在合理範圍內,適合小批量製作。
2.2 系統總體架構
系統由感知層、控制層、互動層與雲端平台四部分構成。感知層包含 DHT11 溫濕度感測器、BH1750 光照感測器、雨滴偵測模組與 DS3231 即時時鐘,負責將環境物理量轉換為數位訊號;控制層以 STM32F103C8T6 為核心,運行 FreeRTOS 即時作業系統,承擔環境採集、自動決策、馬達控制與協定解析任務;互動層包含 0.96 吋 OLED 顯示螢幕與四路按鍵,提供本地互動,同時由 ESP-12F 模組提供網頁端與行動端遠端互動;雲端平台層為 OneNET 物聯網平台,透過 MQTT 協定接收設備上報的環境資料。
從資料流角度看,環境資料自感知層經控制層匯聚後,可分別用於本地自動決策、OLED 顯示與經 ESP-12F 上報雲端平台;控制指令則來自本地按鍵或遠端介面,最終統一匯聚到控制層的服務層進行決策,再由驅動層執行馬達動作。該結構保證了「多入口、單決策、單執行」的控制一致性。
2.3 關鍵器件選型
器件選型遵循「滿足功能、成本可控、開發便利」的原則,關鍵器件選型結果如下表所示。
| 類別 | 器件型號 | 關鍵參數 | 選型理由 |
|---|---|---|---|
| 主控 MCU | STM32F103C8T6 | ARM Cortex-M3,72 MHz,64 KB Flash,20 KB RAM | 資源充足、周邊豐富、生態完善、成本低 |
| Wi-Fi 模組 | ESP-12F | ESP8266EX,4 MB Flash,802.11 b/g/n | 體積小、價格低、可跑 TCP/MQTT 與 OTA |
| 外部儲存 | W25Q64 | 64 Mbit(8 MB),SPI 介面 | 儲存中文字型庫與 OTA 韌體包 |
| 顯示模組 | 0.96 吋 OLED | SSD1306,128×64 像素,I2C | 自發光、功耗低、介面簡單 |
| 按鍵 | TS665CJ | 4 只,帶硬體消抖電容 | 手感清晰、可靠性高 |
| 溫濕度 | DHT11 | 0 | 單匯流排介面、成本低 |
| 光照 | BH1750 | 0~65535 lx,I2C | 數位輸出、免校正、量程寬 |
| 雨滴偵測 | 雨滴偵測模組 | DO 數位輸出,靈敏度可調 | 回應快、可直接觸發外部中斷 |
| 即時時鐘 | DS3231 | ±2 ppm,溫度補償,帶電池備援 | 精度高、斷電仍可保持時間 |
| 步進馬達 | 28BYJ-48 | 5 V 供電,減速比 1:64,步距角 5.625°/64 | 扭矩滿足需求、價格低 |
| 馬達驅動 | ULN2003A | 7 路達靈頓陣列,內建續流二極體 | 可直接驅動馬達線圈,外圍簡單 |
| 穩壓晶片 | AMS1117-3.3 | 5 V→3.3 V,最大 1 A | 輸出穩定、漣波低、性價比高 |
3 系統硬體設計
系統整機電路如下圖所示,後續各節按功能模組分別闡述。

3.1 主控最小系統與電源電路
主控模組以 STM32F103C8T6 為核心。該晶片基於 ARM Cortex-M3 核心,最高工作頻率 72 MHz,整合 64 KB Flash 與 20 KB SRAM,具備多路 GPIO、計時器、USART、SPI 與中斷控制器等周邊,能夠滿足本系統對即時性與周邊數量的要求。最小系統包含電源、時脈、重置與除錯介面四部分:電源由 5 V 經 AMS1117-3.3 線性穩壓後提供 3.3 V;時脈採用片內 8 MHz RC 振盪器經 PLL 倍頻至 72 MHz,同時外接 32.768 kHz 低速晶振為即時時鐘提供時脈來源;重置採用阻容重置電路;除錯與下載透過 SWD 介面完成。
電源部分統一由 5 V DC 介面輸入,經單刀雙擲電源開關後分為兩路:一路直接為步進馬達與 ULN2003A 供電,另一路經 AMS1117-3.3 降壓為 3.3 V,供 STM32、ESP-12F、W25Q64、OLED 及各感測器使用。考慮到 ESP-12F 在發射瞬間峰值電流可達 500 mA 以上,在 3.3 V 電源輸出端並聯了大容量濾波電容以抑制瞬態壓降,避免因電壓跌落導致模組重置。
3.2 步進馬達驅動電路
執行機構選用 28BYJ-48 五線四相減速步進馬達。該馬達內建 1:64 減速齒輪箱,輸出軸步距角約為 5.625°/64,配合四相八拍驅動方式可提供足夠的扭矩與定位精度,適合低速往復運動場合。
由於單晶片 GPIO 輸出電流能力有限,無法直接驅動馬達線圈,本設計採用 ULN2003A 達靈頓陣列作為驅動晶片。STM32 的 PB12PB15 四路 GPIO 輸出相序控制訊號,分別接入 ULN2003A 的 1B4B 輸入端,對應輸出端接馬達四相線圈;ULN2003A 內建續流二極體,可有效洩放線圈斷電時產生的反向電動勢,保護驅動晶片與主控。馬達供電為 5 V,與邏輯電平 3.3 V 相互隔離,僅共用參考地。
在控制策略上,系統不採用外部極限開關,而是透過步數累加方式記錄馬達目前位置,並透過一次性校正「原點位置」與「晾曬位置」來確定運動範圍,從而減少機械結構與接線複雜度,同時避免極限開關在戶外環境下的可靠性問題。
3.3 環境感測器採集電路
溫濕度採集採用 DHT11 數位感測器,採用單匯流排協定,DATA 接腳接至 PA8。DHT11 對讀取時序要求較嚴格,驅動以微秒級延遲實現起始訊號、回應訊號與 40 位元資料的傳送與接收,並校驗資料完整性後再更新溫濕度值。
光照採集採用 BH1750 數位光照感測器,透過軟體 I2C 與主控通訊,SCL、SDA 分別接 PA0、PA1。相較光敏電阻方案,BH1750 輸出為數位量,無須額外校正,且測量範圍覆蓋 0~65535 lx,可滿足室內外光照強度偵測需求。
降雨偵測採用雨滴偵測模組,其數位輸出端 DO 接至 PA2。模組比較器輸出在偵測到水滴時由高電位變為低電位,該電位變化透過外部中斷觸發,從而實現降雨事件的即時捕獲;同時模組電位器可調節偵測靈敏度,以適應不同安裝位置。需要說明的是,模組原始輸出易受馬達啟停瞬間的電氣雜訊干擾,因此軟體上必須結合防抖演算法使用,詳見 4.4 節。
時間基準採用 DS3231 高精度即時時鐘模組,其內部整合溫度補償晶振,精度可達 ±2 ppm,並支援鈕扣電池備援,斷電後時間仍可繼續運行。模組透過軟體 I2C 接入(SDA 接 PB0、SCL 接 PB1),用於為系統提供準確的日期與時間,並供網頁端與行動端顯示。
3.4 人機互動電路
本地人機互動由 0.96 吋 OLED 顯示螢幕與四路按鍵組成。OLED 採用 SSD1306 驅動晶片,解析度 128×64,支援 I2C 介面,SCL、SDA 分別接 PB8、PB9;其自發光特性使其在暗光環境下仍清晰可讀,且功耗較低,適合常顯場景。
按鍵採用四只 TS665CJ 輕觸開關,分別接至 PB4~PB7,配置為上拉輸入,並各並聯 47 nF 電容形成硬體消抖。四路按鍵分別承擔「確認、返回、上移、下移」功能,配合選單狀態機實現本地操作:在首頁按確認鍵進入主選單,在選單中透過上移、下移鍵移動游標,按確認鍵執行對應功能項,按返回鍵返回上級介面。
3.5 無線通訊與儲存電路
無線通訊採用 ESP-12F 模組。該模組基於 ESP8266EX,內建 4 MB Flash,支援 802.11 b/g/n 協定,可運行 TCP、HTTP 與 MQTT 協定堆疊,既可作為區域網路閘道器為手機與電腦提供網頁控制介面,也可作為用戶端接入雲端平台。模組與主控透過序列埠相連:USART1 的 PA9(TX)接模組 RX,PA10(RX)接模組 TX,通訊參數為 115200 bit/s、8 位元資料位、無同位、1 位停止位。
外部儲存採用 W25Q64 SPI Flash,容量 8 MB,NSS、SCK、MISO、MOSI 分別接 PA4~PA7,接入 SPI1。W25Q64 在本系統中承擔兩項職責:一是儲存 OLED 顯示所需的中文字型庫點陣資料,二是作為 OTA 升級韌體包的緩衝儲存區。升級時,新韌體由 ESP-12F 透過序列埠分包傳輸並暫存至 W25Q64,待校驗通過後由 Bootloader 搬運至應用程式區,從而避免升級過程中斷電導致程式損壞。
3.6 接腳分配
系統 GPIO 接腳分配如下表所示,分配時兼顧了周邊功能復用與佈線便利性。
| 接腳 | 功能 | 周邊 / 模式 | 說明 |
|---|---|---|---|
| PA0 / PA1 | BH1750 SCL / SDA | 開漏輸出(軟體 I2C) | 光照採集 |
| PA2 | 雨滴感測器 DO | 上拉輸入 + 外部中斷 | 降雨偵測 |
| PA4~PA7 | SPI1 NSS/SCK/MISO/MOSI | 推挽 / 複用推挽 / 上拉輸入 | W25Q64 儲存 |
| PA8 | DHT11 DATA | 開漏輸出(單匯流排) | 溫濕度採集 |
| PA9 / PA10 | USART1 TX / RX | 複用推挽 / 複用浮空輸入 | 與 ESP-12F 通訊 |
| PB0 / PB1 | DS3231 SDA / SCL | 開漏輸出(軟體 I2C) | 即時時鐘 |
| PB4~PB7 | 按鍵 1~4 | 上拉輸入 + 外部中斷 | 本地人機互動 |
| PB8 / PB9 | OLED SCL / SDA | 開漏輸出(軟體 I2C) | 顯示驅動 |
| PB10 / PB11 | USART3 TX / RX | 複用推挽 / 複用浮空輸入 | 除錯序列埠 |
| PB12~PB15 | ULN2003A 1B~4B | 推挽輸出 | 步進馬達相序控制 |
PCB 實物如下圖所示。

4 系統軟體設計
4.1 軟體總體架構與任務劃分
系統軟體採用分層架構,自上而下依次為使用者層、服務層與硬體層,事件匯流排貫穿各層。使用者層即 main.c,僅承擔 FreeRTOS 任務建立與事件訂閱接線兩項職責,不包含具體業務邏輯;服務層負責任務決策、狀態編排與優先權判斷,如 ClotheslineService 統一決定「是否收衣、何時晾出」;硬體層負責讀寫硬體、執行動作並上報原始事件,如 Motor 控制相序輸出、Rain 採集電位、Menu 負責介面渲染。依賴方向嚴格單向:使用者層依賴服務層,服務層依賴硬體層,硬體層不得反向呼叫服務層。
基於上述架構,系統在 FreeRTOS 下劃分四個任務,如下表所示。任務劃分遵循「職責單一」原則,一個任務只承擔一類職責,避免功能混雜導致耦合。
| 任務名稱 | 優先權 | 堆疊大小 | 主要職責 |
|---|---|---|---|
| vSensorTask | 3 | 256 字 | 環境資料採集與顯示重新整理;上電後自動模式的首次初始化 |
| vUartTask | 4 | 256 字 | 序列埠協定解析與命令分派,將指令轉發至對應服務模組 |
| vServiceTickTask | 4 | 128 字 | 以 50 ms 週期推進 ClotheslineService_Process(),完成決策與動作下發 |
| vIapTask | 1 | 256 字 | 升級旗標偵測與 OTA 流程處理 |
其中,vServiceTickTask 作為系統的「節拍器」,以固定週期驅動服務層,使所有決策都在統一的時間基準下推進,避免在中斷或其它任務中直接執行狀態判斷,從而保證行為的一致性與可預測性。主程序流程如下圖所示。

4.2 事件匯流排與分層解耦設計
為解決傳統前後台架構中「多入口直接呼叫執行層」導致的耦合問題,系統引入輕量級事件匯流排 AppEvent。事件匯流排的發布訂閱機制包含三要素:發布者只描述客觀事實,例如馬達停止時發布 APP_EVENT_MOTOR_STOPPED;訂閱關係集中註冊在 main.c 中,便於一目了然地看到系統依賴;各模組自行實作事件處理函式,例如 ClotheslineService_OnMotorStopped 更新業務狀態,Menu_OnMotorStopped 重新整理介面顯示。
該設計的收益在於:同一事件可被多個模組獨立消費而不相互影響;新增訂閱者只需在 main.c 增加一行註冊程式碼,無須修改任何業務模組;驅動層不再關心「誰會用到這個事件」,職責邊界清晰。
與之配套的是「職責倒置」問題的糾正。改造前,介面模組在按鍵回呼中直接判斷目前模式並決定切換方向,服務層僅作為執行代理;改造後,介面模組只上報「使用者按下了自動鍵」這一事實,由服務層根據目前模式決定切換到自動還是手動。判斷標準是:若介面層程式碼中出現「若目前狀態為某某則如何」的邏輯,即說明職責發生了倒置。
4.3 馬達控制與位置管理
馬達控制採用計時器中斷驅動的步進輸出方式。系統以 TIM2 產生約 4 ms 的定時中斷,在中斷服務函式中按四相八拍相序表依次輸出 PB12~PB15 電位,每產生一次相序切換即視為馬達前進或後退一個節拍。馬達運行狀態由目標步數與方向決定:呼叫 Motor_Run(steps, dir) 後設定目標步數並使能計時器,中斷中每完成一步即將剩餘步數減一,減至零時停止輸出並關閉計時器,同時發布 APP_EVENT_MOTOR_STOPPED 事件。
位置管理採用步數累加方式。系統維護 motorPosition 變數記錄目前相對原點的步數,配合兩個校正値:原點步數 motorZeroSteps 與晾曬位置步數 motorMaxSteps。使用者可在校正介面透過正向、反向微調按鈕將馬達移動到目標位置後,分別執行「記錄原點」與「記錄晾曬位置」操作,校正値寫入 Flash 儲存,斷電不遺失。運動範圍判定即基於這兩個校正値完成,例如當 motorPosition ≤ 0 時不再執行收衣動作,當 motorPosition ≥ motorMaxSteps 時不再執行晾出動作,從而在不使用極限開關的前提下避免堵轉。
為滿足即時性要求,所有馬達動作均採用非阻塞方式發起。任務不會以死迴圈等待馬達停轉,而是採用「旗標 + 週期檢查」模式:需要搶占馬達時先呼叫 Motor_Stop() 停止目前動作並致能 pending 旗標,隨後由服務層週期函式檢查「馬達已停止」後再發起下一步動作,從而避免長時間占用 CPU 時間片、影響其它任務的回應。馬達控制流程如下圖所示。

4.4 環境感知與自動晾曬決策
降雨感知採用「中斷觸發 + 週期輪詢」相結合的方式。雨滴模組 DO 接腳電位變化觸發外部中斷,中斷服務函式僅釋放一個旗號(semaphore),不做任何業務判斷;服務節拍任務每週期嘗試取得旗號,若無事件則每 500 ms 主動讀取一次電位作為兜底,保證中斷遺失時仍能感知狀態變化。
為抑制電氣雜訊引起的誤判,系統引入連續一致性防抖演算法:只有當連續三次讀取結果一致時,才確認降雨狀態發生變化,即由乾燥變為降雨或由降雨變為乾燥,整個確認過程約耗時 1.5 s。該演算法有效解決了「馬達啟停瞬間電位抖動導致雨滴誤判」的問題,避免了狀態機因瞬時雜訊而反覆切換。防抖後的穩定狀態量 isRaining 是服務層進行業務判斷的唯一依據,服務層不再直接呼叫原始讀取介面。雨滴偵測與防抖流程如下圖所示。

自動晾曬決策由 ClotheslineService_Process() 統一完成,其決策規則如下:①當偵測到降雨且衣物處於晾曬狀態時,呼叫 Motor_RetractForRain() 收回衣物;②當降雨停止、系統處於自動模式且衣物已收回時,啟動延遲計時器(預設 5 s,可透過序列埠配置),計時結束後呼叫 Motor_DryOutForAuto() 重新晾出衣物,延遲設定用於避免短時陣雨造成的反覆動作;③當存在使用者待辦命令 pendingUserOpen 或 pendingUserClose 時,按命令發起相應動作。
需要強調的是動作來源與模式的關係:由感測器觸發的自動動作(降雨收衣、雨停晾出)不改變目前工作模式,僅在手動模式下由使用者命令觸發的動作才切換至手動模式。這一約束避免了「降雨自動收衣後系統被意外切換為手動、導致雨停後無法自動晾出」的邏輯缺陷。
此外,系統在自動模式下的上電行為也做了專門處理:設備上電後預設進入自動模式,服務層復用上述「雨停延遲確認」窗口——若目前無雨且衣物處於收回狀態,延遲確認環境穩定後即自動晾出衣物,使使用者上電後無須任何操作即可進入正常晾曬狀態。自動晾曬決策流程如下圖所示。

4.5 序列埠通訊協定
STM32 與 ESP-12F 之間採用自訂的文字行協定。所有下行命令以「@命令名」起始、以歸位換行結束,例如 @CLOSE、@AUTO、@MOTOR_QUERY;STM32 側在序列埠中斷中以狀態機方式接收,識別到起始符後開始快取字元,接收到歸位換行時致能接收完成旗標,交由 vUartTask 取出並按命令路由表分派。上行回應不帶「@」前綴,採用「鍵:值」形式,便於上位機解析。該協定文字化、可讀性強,便於使用序列埠助手直接除錯。主要命令如下表所示。
| 命令 | 方向 | 說明 | 回應 |
|---|---|---|---|
| @CLOSE | ESP → STM32 | 手動收衣 | 馬達動作 |
| @OPEN | ESP → STM32 | 手動晾衣(降雨時被攔截) | 馬達動作 |
| @AUTO / @MANUAL | ESP → STM32 | 切換自動 / 手動模式 | MODE:AUTO 或 MODE:MANUAL |
| @MOTOR_QUERY | ESP → STM32 | 查詢馬達狀態 | MOTOR_STATUS:zero=,max=,pos=,mode= |
| @MOTOR_FWD:n / REV:n | ESP → STM32 | 正 / 反向移動 n 步(校正用) | 無 |
| @MOTOR_SAVE_ZERO | ESP → STM32 | 記錄目前位置為原點 | MOTOR_SAVED:0 |
| @MOTOR_SAVE_MAX | ESP → STM32 | 記錄目前位置為晾曬位置 | MOTOR_SAVED:n |
| @TIME_QUERY / TIME_SET:… | ESP → STM32 | 查詢 / 設定 DS3231 時間 | TIME_NOW:… 或 TIME_SET_OK |
| @MQTT_ON / @MQTT_OFF | ESP → STM32 | 開啟 / 關閉感測器上報 | SENSOR_REPORT:ON / OFF |
| @STM32_UPGRADE | ESP → STM32 | 啟動 OTA 升級流程 | OTA:PROGRESS 等 |
上行資料方面,STM32 在開啟上報後以 500 ms 週期傳送環境資料行 SENSOR:溫度,濕度,光照,降雨,並在升級過程中傳送 OTA:PROGRESS|進度、OTA:DONE|結果等狀態行;ESP-12F 側解析這些資料行並更新內部狀態,供網頁查詢與雲端上報使用。序列埠命令解析與分派流程如下圖所示。

4.6 OLED 選單與按鍵互動
本地互動採用基於狀態機的選單顯示方案,共定義四種顯示模式:首頁模式、選單模式、執行模式與升級模式。首頁模式顯示溫度、濕度、光照情況、是否下雨以及目前工作模式;選單模式以三行列表顯示「收衣、晾衣、自動」三個功能項,並以「>」符號標識目前游標位置;執行模式顯示 Working、Retracting、Extending 等動作提示,或在降雨被攔截時顯示 Rain! Wait 提示;升級模式則顯示升級進度百分比。
按鍵處理在外部中斷回呼中完成,且回呼函式只做介面跳轉與命令上報,不作業務判斷。以確認鍵為例:在首頁按下後進入選單模式;在選單中按下後根據游標位置向服務層上報對應命令(收衣上報收衣命令、晾衣上報晾衣命令、自動上報切換自動模式命令),若晾衣時目前正在下雨,則介面提示並延遲返回選單;在執行模式下按下則停止馬達並返回首頁。返回鍵用於返回上級介面,執行模式下按下會先停止馬達。上移、下移鍵僅在選單模式下生效,用於移動游標。
介面重新整理由事件驅動完成。馬達停止後,Motor 模組發布 MOTOR_STOPPED 事件,介面模組在事件回呼中返回首頁並重新整理顯示;工作模式變化後發布 MODE_CHANGED 事件,介面模組據此更新首頁的模式欄位。該機制使得介面模組無須輪詢硬體狀態,降低了耦合度與 CPU 占用。按鍵與選單互動流程如下圖所示。

4.7 OTA 遠端升級設計
為提升設備的可維護性,系統實現了主控程式與無線模組韌體的雙通道遠端升級。整體方案為:ESP-12F 作為網路側代理負責從伺服器下載韌體,STM32 側透過 Bootloader 負責將韌體寫入並搬運至應用程式區,兩者透過序列埠協同完成升級。
主控程式升級流程如下:使用者在網頁端或行動端發起升級請求後,ESP-12F 透過 HTTP 協定從指定位址下載新版應用韌體,隨後向 STM32 發送 @STM32_UPGRADE 命令啟動升級流程;STM32 收到命令後,先執行安全動作——若衣物處於晾曬狀態則先收回,避免升級過程中機械意外動作;隨後進入升級狀態,以 YMODEM 協定接收 ESP-12F 分包傳送的韌體資料,逐包寫入 W25Q64 的韌體緩衝分割區,並即時向上位機回報升級進度。全部資料接收完成後寫入升級旗標,由 Bootloader 在下次啟動時校驗韌體完整性,校驗通過後將韌體從緩衝分割區搬運至應用程式區,並跳轉執行,從而實現完整升級。
無線模組升級流程相對簡單:ESP-12F 收到升級請求後,自行從伺服器下載新韌體並寫入其內部 Flash 的 OTA 分割區,重啟後由 ESP8266 開機引導程式完成切換;升級過程中向 STM32 上報進度,以便 OLED 同步顯示。
採用「先快取、後搬運」的兩階段升級策略,其價值在於:即使升級過程中發生斷電或網路中斷,應用程式區仍保持原韌體完整,設備重啟後可正常運行,不會出現「變磚」現象,顯著提升了升級過程的可靠性。OTA 升級流程如下圖所示。

4.8 無線閘道器、上位機與雲端平台
ESP-12F 在本系統中承擔無線閘道器與上位機雙重角色。作為無線閘道器,它將 STM32 的序列埠協定轉換為網路服務:一方面內建輕量級 HTTP 伺服器,向區域網路內設備提供網頁控制介面;另一方面作為 MQTT 用戶端接入 OneNET 雲端平台,將環境資料打包為 OneJSON 格式按 15 s 週期上報,同時接收雲端下發命令。
網頁控制介面的資料來源分為三類:一是 ESP-12F 本地配置資料,如 OneNET 平台參數與 MQTT 開關狀態,透過讀取本地儲存獲得;二是即時硬體狀態,如馬達校正値與目前位置,由 ESP-12F 經序列埠向 STM32 查詢後獲得;三是即時時鐘資料,由 STM32 從 DS3231 讀取後經序列埠返回。上述資料在頁面載入後按既定順序非同步獲取,避免因序列埠查詢耗時導致的介面卡頓。
網頁端提供的操作包括:控制區的收衣、晾衣、自動模式按鈕;校正區的正反向微調與原點、晾曬位置校正按鈕;即時時鐘的同步與設定;環境資料上報開關;主控與無線模組的升級入口;韌體與網路配置資訊。使用者在網頁或行動端點擊某一按鈕後,瀏覽器或 App 向 ESP-12F 發起 HTTP 請求,ESP-12F 將請求轉換為對應的序列埠命令下發給 STM32,STM32 在服務層完成決策後驅動馬達或更新狀態,並將結果經序列埠回傳至 ESP-12F,最終回饋到介面。行動端應用復用同一套 HTTP 介面,因而與網頁端行為完全一致。
為降低互動延遲,ESP-12F 在背景以 10 s 週期主動向 STM32 查詢馬達狀態並快取於記憶體,網頁查詢時直接返回快取結果,避免了每次都觸發序列埠往返;同時,頁面初始化後按 1 s、1.5 s、2 s 的錯峰時序分別獲取 MQTT 狀態、馬達狀態與即時時鐘,使關鍵資訊優先呈現。
本系統透過上述設計,實現了「端—閘道器—主控」三級的資料與指令通路:感知資料由主控經閘道器上行至網頁、App 與雲端平台,控制指令由網頁、App 或本地按鍵下行至主控,形成完整的閉環互動體系。
5 系統測試與結果分析
5.1 測試環境與方案
測試環境為室內常溫環境,測試工具包括 5 V/2 A 直流電源、ST-Link 下載器、USB-TTL 序列埠模組、序列埠除錯助手以及處於同一區域網路內的電腦與手機。測試對象為裝配完成的智慧晾衣架樣機。測試內容分為功能測試與效能測試兩部分:功能測試逐項驗證本地按鍵互動、自動晾曬、遠端控制、資料上報與遠端升級是否正常;效能測試重點考察雨滴回應時間、馬達定位誤差、指令端到端延遲以及長時間運行的穩定性。
5.2 功能測試
功能測試用例及結果如下表所示。測試採用「建構條件—執行操作—觀察現象」的方法,逐項確認預期行為與實際表現是否一致。
| 測試項 | 操作步驟 | 測試結果 |
|---|---|---|
| 首頁顯示 | 上電後在首頁模式觀察顯示內容 | 正常顯示溫濕度、光照、降雨狀態與工作模式 |
| 按鍵選單 | 按確認鍵進入選單,上下鍵移動游標,確認鍵執行 | 游標移動正確,各功能項均按要求執行 |
| 手動收衣 / 晾衣 | 在選單選擇收衣或晾衣,觀察馬達動作 | 馬達按指定方向運行,動作完成後回到首頁 |
| 自動模式進入 | 選擇自動模式,觀察系統行為 | 無雨且衣物在原點時自動晾出;有雨時保持收衣狀態 |
| 雨天自動收衣 | 將雨滴感測器打濕,觀察馬達動作 | 馬達自動收回衣物,OLED 仍顯示自動模式 |
| 雨停自動晾出 | 擦乾感測器,觀察系統動作 | 延遲 5 s 後馬達自動晾出衣物,模式保持不變 |
| 網頁遠端控制 | 在網頁點擊收衣、晾衣、自動按鈕 | 馬達按要求動作,介面狀態同步更新 |
| 行動端控制 | 在 App 中執行相同操作 | 行為與網頁端一致 |
| 資料上報 | 開啟上報功能,觀察雲端平台資料 | 環境資料按週期正確上報,曲線連續 |
| 主控遠端升級 | 在網頁發起主控升級並等待完成 | 進度正常回報,重啟後運行新版本程式 |
| 無線模組升級 | 在網頁發起 ESP-12F 升級 | 自助下載並切換韌體,OLED 同步顯示進度 |
測試結果表明,全部功能項均通過驗證,系統在本地互動、自動決策與遠端控制三方面的行為保持一致,未出現狀態衝突或功能失效現象。
5.3 效能測試
效能測試重點針對即時性、控制精度與穩定性三項指標,測試資料如下表所示。
| 測試指標 | 測試方法 | 測試結果 |
|---|---|---|
| 降雨回應時間 | 記錄感測器確認降雨至馬達啟動的時間 | 平均 1.6 s(含 1.5 s 防抖確認),最大 1.8 s |
| 馬達定位誤差 | 在校正範圍內往復運動後比對目標與實測位置 | 最大誤差約 1.6%,小於 2% |
| 指令端到端延遲 | 記錄網頁點擊至馬達啟動的時間 | 平均 320 ms,最大 480 ms |
| 按鍵回應延遲 | 記錄按鍵按下至介面切換的時間 | 小於 100 ms |
| 連續運行穩定性 | 連續運行 72 小時,觀察異常重置與誤動作 | 無異常重置,無雨滴誤判導致的誤動作 |
| 待機功耗 | 馬達停止且螢幕常亮狀態下測量整機電流 | 約 95 mA(5 V 供電) |
從測試資料可以看出:引入 1.5 s 的防抖確認雖使降雨回應時間略有增加,但換來的是雨中誤判率的大幅下降,綜合考慮環境干擾與機械磨損,該折衷是合理的;馬達定位誤差主要由步進馬達的累加誤差與傳動間隙造成,1.6% 的誤差在晾曬場景中完全可接受,且可透過校正功能進一步修正;端到端延遲主要由 Wi-Fi 鏈路與序列埠查詢構成,平均 320 ms 的延遲在遠端控制場景中無明顯遲滯感。
5.4 結果分析
綜合功能與效能測試結果,系統達到了設計目標,主要體現在三個方面。第一,控制一致性良好:本地按鍵、網頁端與行動端三處入口下發同一動作時,最終受同一套服務層規則約束,行為完全一致,未出現「同一操作多種結果」的問題。第二,抗干擾能力增強:透過感測器防抖、非阻塞動作發起與事件驅動的介面重新整理,系統在馬達啟停、感測器抖動等工況下仍能保持穩定,72 小時連續運行未出現異常重置。第三,可維護性顯著提升:兩級韌體均支援遠端升級,現場設備無須拆機即可更新程式,為後續修復缺陷與迭代功能提供了便利。
測試中也發現了若干可改進之處:一是 DHT11 的測量精度與回應速度有限,在高濕度環境下讀值存在一定滯後;二是目前未採集馬達電流,缺少堵轉偵測能力;三是雲端僅做資料透傳,尚未實現基於歷史資料的智慧預測。這些問題將在後續工作中逐步完善。
6 總結與展望
6.1 全文總結
本文圍繞「晾曬衣物遇雨難以及時收回」這一實際問題,設計並實作了一套基於 STM32 的智慧晾衣架控制系統,完成了從需求分析、總體方案、硬體電路、軟體架構到系統測試的完整設計過程。主要工作可歸納為以下四點。
第一,完成了系統硬體平台設計。以 STM32F103C8T6 為主控,配合 DHT11、BH1750、雨滴模組與 DS3231 構成環境感知單元,以 28BYJ-48 步進馬達與 ULN2003A 構成執行單元,以 OLED 與四路按鍵構成互動單元,並以 W25Q64 與 ESP-12F 構成儲存與無線通訊單元,給出了完整的接腳分配方案。
第二,完成了基於 FreeRTOS 的軟體架構設計。採用使用者層—服務層—硬體層的分層架構,以事件匯流排完成模組間解耦,將四個任務按職責單一原則劃分,使業務決策與硬體驅動徹底分離,顯著提升了程式碼的可讀性與可維護性。
第三,解決了工程實現中的若干關鍵問題。針對馬達雜訊導致的雨滴誤判,設計了連續一致性防抖演算法;針對阻塞等待影響任務回應的問題,採用旗標與週期檢查的非阻塞模式;針對介面層職責倒置問題,明確了「介面只報告事實、服務層負責決策」的分工原則;針對升級可靠性問題,採用「先快取、後搬運」的兩階段 OTA 策略。
第四,實現了完整的遠端互動與雲端平台接入。透過 ESP-12F 提供網頁端與行動端控制介面,實現了頁面資料的分源非同步載入與背景狀態快取;透過 MQTT 協定接入 OneNET 平台完成環境資料上報,形成了端到端的物聯網閉環。測試結果表明系統功能完備、運行穩定,達到預期設計目標。
6.2 不足與展望
儘管系統已實現設計功能,但仍存在以下改進方向:一是提升感知精度,後續可選用 SHT30 等高精度數位溫濕度感測器,並增加風速、紫外線強度等環境量,為晾曬決策提供更充分的依據;二是增強執行安全,增加馬達電流取樣電路以實現堵轉與過流保護,並引入極限開關或編碼器實現位置閉環;三是深化資料分析,利用雲端平台積累的環境與使用資料,結合天氣預測實現「提前收衣」的預測性決策;四是完善產品化設計,最佳化外觀結構、防水效能與供電方式,並考慮採用太陽能充電以進一步降低能耗。
總體而言,本系統以較低的成本實現了智慧晾曬的核心功能,其分層解耦的軟體架構與兩階段升級策略對同類小型智慧家庭控制系統具有一定的參考價值。
參考文獻
- 劉火良, 楊森. STM32 庫開發實戰指南[M]. 第 2 版. 北京: 機械工業出版社, 2017.
- 張洋, 劉軍, 嚴松. 原子教你玩 STM32[M]. 第 2 版. 北京: 北京航空航天大學出版社, 2015.
- 何賓, 張豔輝. STM32 嵌入式系統開發[M]. 北京: 電子工業出版社, 2018.
- 周航慈. 嵌入式系統軟體設計中的常用演算法[M]. 北京: 北京航空航天大學出版社, 2010.
- 王偉, 李強. 基於 STM32 的智慧家庭控制系統設計[J]. 電子設計工程, 2020, 28(15): 110-114.
- 陳明, 趙磊. 基於物聯網的智慧晾衣架系統設計[J]. 物聯網技術, 2021, 11(4): 45-48.
- 李寧. 基於 ESP8266 的無線資料傳輸系統設計[J]. 單晶片與嵌入式系統應用, 2019, 19(8): 60-63.
- 孫曉明. 基於 FreeRTOS 的嵌入式多工排程最佳化研究[J]. 計算機工程與設計, 2021, 42(6): 1620-1626.
- STMicroelectronics. RM0008 Reference Manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx Advanced ARM-based 32-bit MCUs[Z]. 2021.
- Espressif Systems. ESP8266EX Datasheet[Z]. 2020.
- Maxim Integrated. DS3231 Extremely Accurate I2C-Integrated RTC/TCXO/Crystal Datasheet[Z]. 2015.
- Winbond Electronics. W25Q64FV 3V 64M-Bit Serial Flash Memory with Dual/Quad SPI Datasheet[Z]. 2017.
- 中國移動物聯網有限公司. OneNET 物聯網平台開發文件[EB/OL]. https://open.iot.10086.cn, 2023.
- Analog Devices. ULN2003A High-Voltage High-Current Darlington Transistor Arrays Datasheet[Z]. 2018.
- FreeRTOS. FreeRTOS Kernel Reference Manual[EB/OL]. https://www.freertos.org, 2023.