案例研究:智慧花園灌溉控制器的狀態機設計

1. 簡介

現代園藝與農業越來越依賴自動化來最佳化資源使用,特別是水——在許多地區都是稀缺資源。一個智慧灌溉控制器會根據即時土壤狀況自動灌溉,而非依賴固定計時器,從而減少浪費,防止過度或不足灌溉,並促進植物更健康生長。

本案例研究專注於使用UML狀態機圖 (也稱為狀態圖)。該圖捕捉系統的生命周期、決策點,以及對濕度讀數、逾時和使用者干預等事件的回應。

該設計使用PlantUML語法,類似於所提供的咖啡店範例,能優雅地模擬複合狀態、守衛條件、動作,以及錯誤/恢復路徑。

2. 問題陳述與需求

家用花園或小型溫室的自動灌溉控制器必須:

  • 大多數時間以低功耗待機模式運行。
  • 根據時間表(計時器觸發)定期喚醒以檢查條件。
  • 進入感測狀態,以讀取土壤濕度(透過電容式或電阻式感測器)。
  • 若濕度 < 30%(可設定的乾燥閾值),則開始灌溉透過打開電磁閥或啟動水泵來進行。
  • 若濕度 ≥ 30%,則返回到待機(無需澆水)。
  • 灌溉中,持續(或定時)監測濕度。
  • 當出現以下情況時,停止灌溉並關閉閥門:
    • 濕度達到80%(可設定的濕度閾值)→ 目標達成。
    • 一個安全超時逾時(例如30分鐘)→ 若感應器故障,可防止淹水、管線破裂或電氣問題。
  • 停止灌溉後,轉至關機狀態。
  • 關機狀態下,等待手動確認(按鈕按下或應用程式指令)後,再返回到待機—— 這讓使用者可檢查系統或必要時進行手動覆蓋。
  • 透過轉至錯誤狀態並提供恢復選項,以妥善處理故障(例如感應器故障、閥門卡住)。

額外理想的行為(此處保持簡化):

  • 特定時段內不進行灌溉(由排程/定時器處理)。
  • 記錄或通知不在此核心狀態機的範圍內。

3. 使用的核心狀態機概念

  • 狀態: 空閒/待機、偵測、灌溉、關機、錯誤。
  • 複合狀態: 灌溉包含內部監控邏輯(儘管為簡化起見在此保持平坦)。
  • 轉移:
    • 由事件觸發(計時器、濕度讀取、逾時)。
    • 由條件保護 [濕度 < 30%],[濕度 >= 80%]。
  • 動作: /open_valve(),/close_valve(),/notify_user(),等。
  • 初始/最終偽狀態: [*] 用於開始/結束。
  • 自轉移以及恢復迴圈。

4. PlantUML 中的狀態圖

以下是實現所述行為的完整 PlantUML 程式碼。它遵循咖啡店範例的慣例(skinparam 樣式、適當使用複合狀態、條件用 [] 表示、動作以 / 開頭)。

plantuml
@startuml

skinparam {
' 整體樣式
' 顏色
ArrowColor #333333
ArrowFontColor #333333
BackgroundColor #FFFFFF
BorderColor #333333

' 狀態樣式
State {
BorderColor #005073
BackgroundColor #E6F5FF
FontColor #005073
}
}

[*] --> Standby

Standby --> Sensing : timer_triggers()

Sensing --> Irrigating : soil_moisture < 30%
Sensing --> Standby : soil_moisture >= 30%

Irigating --> Shutdown : soil_moisture >= 80% OR safety_timeout()
Irigating --> Shutdown : safety_timeout() // 備用逾時保護

Shutdown --> Standby : user_confirms_reset()

Standby --> [*]

@enduml

圖示說明

  • 待機 — 預設低功耗/空閒狀態。
  • 偵測 — 由計時器觸發的快速檢查;避免不必要的灌溉。
  • 灌溉(複合)— 內部具有子活動的主動灌溉階段,灌溉子活動。
    • 在達到目標濕度或安全逾時時退出。
  • 關機 — 灌溉後暫停狀態,需確認後才能恢復自動化(安全功能)。
  • 錯誤 — 故障封鎖狀態,需手動恢復轉換。

5. 設計原理與優勢

  • 節水 — 僅在真正需要時才進行灌溉(基於土壤濕度,而非時間)。
  • 防止淹水 — 灌溉狀態有兩個退出條件(濕度目標 + 超時)。
  • 使用者安全與控制 — 異常停止後需手動確認,可防止潛在問題後自動重新啟動。
  • 可擴展性 — 易於新增狀態(例如:偵測到降雨, 電量不足, 冬季模式)或調整閾值。
  • 低複雜度 — 在可能的情況下保持扁平結構,僅在邏輯分組能提升清晰度時才使用複合結構(如「灌溉中」)。

此設計在穩健性、安全性與簡潔性之間取得平衡——適合嵌入式微控制器實現(如 Arduino、ESP32 等)。

6. 結論

狀態機狀態機為建模反應式控制系統(如智慧灌溉控制器)提供了優異的形式化方法。透過明確定義狀態、事件、守衛與動作,工程師可在撰寫程式碼前,分析系統行為、邊界情況與錯誤恢復。

上述的 PlantUML 表示同時可作為文件與實作藍圖。透過 PlantUML 工具或線上伺服器渲染後,可產生清晰專業的圖示,適用於需求審查、程式碼生成或教學 UML 概念。

未來的擴展可能包括:

  • 天氣 API 整合(若預報有雨,則跳過感測)。
  • 多區域設計,各區域可設定獨立的濕度閾值。
  • 在超時或錯誤時,透過行動應用程式發送通知。

此案例研究展示了看似簡單的自動化問題如何從結構化的狀態基礎建模中獲益良多。