1. 引言
现代园艺和农业越来越依赖自动化来优化资源利用,尤其是水——在许多地区这是一种稀缺资源。一个智能灌溉控制器根据实时土壤状况自动浇水,而不是依赖固定定时器,从而减少浪费,防止过度或不足浇水,并促进植物更健康地生长。
本案例研究聚焦于使用UML状态机图 (也称为状态图)。该图捕捉了系统的生命周期、决策点以及对湿度读数、超时和用户干预等事件的响应。
该设计使用PlantUML语法,类似于提供的咖啡店示例,能够优雅地建模复合状态、守卫条件、动作以及错误/恢复路径。
2. 问题陈述与需求
家用花园或小型温室的自动灌溉控制器必须:

- 大部分时间处于低功耗待机模式。
- 根据时间表(定时器触发)定期唤醒以检查条件。
- 进入检测状态,通过电容式或电阻式传感器读取土壤湿度。
- 如果湿度 < 30%(可配置的干燥阈值),开始灌溉通过打开电磁阀或启动水泵。
- 如果湿度 ≥ 30%,返回到待机(无需浇水)。
- 当灌溉,持续(或定期)监测湿度。
- 当满足以下条件时,停止灌溉并关闭阀门:
- 湿度达到80%(可配置的湿润阈值)→ 目标达成。
- 一个安全超时超时(例如30分钟)→ 若传感器故障,可防止溢水、管道破裂或电气问题。
- 停止灌溉后,进入关机状态。
- 在关机状态下,等待手动确认(按钮按下或应用程序指令)后,再返回到待机——这允许用户检查系统或在需要时进行手动干预。
- 通过转入错误状态并提供恢复选项,以优雅地处理故障(例如传感器故障、阀门卡住)。
其他理想行为(此处保持简单):
- 在特定时段内不进行灌溉(由定时器或日程安排处理)。
- 日志记录或通知不在本核心状态机的范围内。
3. 使用的关键状态机概念
- 状态: 空闲/待机,感应,灌溉,关机,错误。
- 复合状态: 灌溉包含内部监控逻辑(尽管为简化起见此处保持扁平化)。
- 转换:
- 由事件触发(定时器、湿度读数、超时)。
- 由条件保护 [湿度 < 30%],[湿度 >= 80%]。
- 动作: /打开阀门(),/关闭阀门(),/通知用户(),等等。
- 初始/最终伪状态: [*] 表示开始/结束。
- 自转换以及恢复循环。
4. PlantUML 中的状态图
以下是实现所述行为的完整 PlantUML 代码。它遵循咖啡店示例的规范(skinparam 样式,适当使用复合状态,条件用 [] 表示,动作用 / 表示)。
plantuml
@startuml
skinparam {
‘ 整体样式
‘ 颜色
箭头颜色 #333333
箭头字体颜色 #333333
背景颜色 #FFFFFF
边框颜色 #333333
‘ 状态样式
状态 {
边框颜色 #005073
背景颜色 #E6F5FF
字体颜色 #005073
}
}
[*] –> 待机
待机 –> 检测 : 定时器触发()
检测 –> 灌溉 : 土壤湿度 < 30%
检测 –> 待机 : 土壤湿度 >= 30%
灌溉 –> 关闭 : 土壤湿度 >= 80% 或 安全超时()
灌溉 –> 关闭 : 安全超时() // 备用超时保护
关闭 –> 待机 : 用户确认重置()
待机 –> [*]
@enduml
图示说明
- 待机 — 默认低功耗/空闲状态。
- 检测 — 由定时器触发的快速检查;避免不必要的灌溉。
- 灌溉 (复合) — 活跃灌溉阶段,包含内部灌溉 子活动。
- 关闭 — 灌溉后保持状态,需确认后方可恢复自动化(安全功能)。
- 错误 — 故障隔离状态,需手动恢复转换。
5. 设计原理与优势
- 节水 — 仅在真正需要时才灌溉(基于土壤湿度而非时间)。
- 防涝 — 灌溉阶段设有双重退出条件(湿度目标 + 超时)。
- 用户安全与控制 — 异常停止后需手动确认,以防止潜在问题后自动重启。
- 可扩展性 — 易于添加状态(例如,检测到降雨, 电量不足, 冬季模式)或调整阈值。
- 低复杂度 — 尽可能扁平化,仅在逻辑分组能提升清晰度时才使用复合结构(如灌溉)。
该设计在鲁棒性、安全性和简洁性之间取得平衡——适用于嵌入式微控制器实现(如Arduino、ESP32等)。
6. 结论
状态机状态机为建模反应式控制系统(如智能灌溉控制器)提供了极佳的形式化方法。通过明确定义状态、事件、守卫条件和动作,工程师可以在编写代码前对系统行为、边界情况和错误恢复进行推理。
上述PlantUML表示既可作为文档,也可作为实现蓝图。通过PlantUML工具或在线服务器渲染后,可生成清晰专业的图表,适用于需求评审、代码生成或教授UML概念。
未来可扩展的功能包括:
- 天气API集成(若预报降雨则跳过感应)。
- 多个区域,每个区域具有独立的湿度阈值。
- 在超时或出错时通过手机应用发送通知。
本案例研究展示了看似简单的自动化问题如何从结构化的基于状态的建模中获益巨大。