Кейс: проектирование машины состояний для умного контроллера полива сада

1. Введение

Современные садоводство и сельское хозяйство всё больше полагаются на автоматизацию для оптимизации использования ресурсов, особенно воды — дефицитного ресурса во многих регионах. умный контроллер поливаавтоматизирует полив на основе реальных условий почвы, а не фиксированных таймеров, снижая потери, предотвращая пере- или недополив, и способствуя более здоровому росту растений.

В этом кейсе акцент делается на моделировании поведения такой системы с использованием диаграммы машины состояний UML (также называемой диаграммой состояний). Диаграмма отражает жизненный цикл системы, точки принятия решений и реакции на события, такие как показания влажности, тайм-ауты и вмешательство пользователя.

Проектирование использует PlantUMLсинтаксис, аналогичный примеру с кофейней, который элегантно моделирует составные состояния, условия, действия и пути ошибок/восстановления.

2. Постановка проблемы и требования

Автоматический контроллер полива для домашнего сада или небольшого теплицы должен:

  • Запускаться в режиме низкого энергопотребления Пассивного режимав большинстве случаев.
  • Периодически просыпаться в соответствии с графиком (сигнал таймера), чтобы проверить условия.
  • Переходить в состояние Сенсорноедля чтения уровня влажности почвы (через ёмкостной или резистивный датчик).
  • Если влажность < 30% (настраиваемый порог сухости), начинать Поливоткрывая электромагнитный клапан или включая насос.
  • Если влажность ≥ 30%, возвращаться к Готовность (полив не требуется).
  • Пока Полив, непрерывно (или периодически) контролируйте влажность.
  • Остановите полив и закройте клапан, когда:
    • Влажность достигает 80% (настраиваемый порог влажности) → цель достигнута.
    • Срок действия тайм-аут безопасности истекает (например, 30 минут) → предотвращает затопление, разрыв труб или электрические неисправности при выходе датчика из строя.
  • После остановки полива перейдите в состояние Выключения состояние.
  • В состоянии Выключения, ожидайте ручного подтверждения (нажатие кнопки или команда приложения) перед возвратом в Готовность — это позволяет пользователю проверить систему или вмешаться при необходимости.
  • Обрабатывайте сбои корректно (например, выход датчика из строя, застрявший клапан), перейдя в состояние Ошибка состояние с возможностями восстановления.

Дополнительные желательные поведения (сохранены простыми здесь):

  • Нет полива в определённые часы (управление осуществляется по расписанию/таймеру).
  • Ведение журнала или уведомления выходят за рамки основной машины состояний.

3. Используемые ключевые концепции машины состояний

  • Состояния: Бездействие/Готовность, Опрос, Полив, Отключение, Ошибка.
  • Составное состояние: Полив включает внутреннюю логику мониторинга (хотя здесь она сохранена в простом виде для упрощения).
  • Переходы:
    • Срабатывает по событиям (таймер, показания влажности, таймаут).
    • Защищено условиями [влажность < 30%], [влажность >= 80%].
  • Действия: /открыть_клапан(), /закрыть_клапан(), /уведомить_пользователя(), и т.д.
  • Начальные / конечные псевдосостояния: [*] для начала/конца.
  • Самопереходы и циклы восстановления.

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% ИЛИ safety_timeout()
Irigating --> Shutdown : safety_timeout() // Защита от таймаута по умолчанию

Shutdown --> Standby : user_confirms_reset()

Standby --> [*]

@enduml

Объяснение диаграммы

  • Готовность — Стандартное состояние низкого энергопотребления/простоя.
  • Опрос — Быстрая проверка, запускаемая таймером; предотвращает необоснованный полив.
  • Полив (составное) — Активная фаза полива с внутренним Полив поддеятельностью.
    • Завершается при достижении целевой влажности или срабатывании таймаута безопасности.
  • Выключение — Состояние ожидания после полива, требующее подтверждения для возобновления автоматизации (функция безопасности).
  • Ошибка — Состояние изоляции неисправности с ручным переходом к восстановлению.

5. Обоснование и преимущества архитектуры

  • Сохранение воды — Поливает только тогда, когда это действительно необходимо (на основе влажности почвы, а не по времени).
  • Предотвращение затопления — Два условия выхода из состояния полива (целевая влажность + тайм-аут).
  • Безопасность и контроль пользователя — Ручное подтверждение после аварийной остановки предотвращает автоматическое возобновление работы после возможных проблем.
  • Масштабируемость — Легко добавлять состояния (например, Обнаружено дождевое осадки, Низкий уровень заряда батареи, Зимний режим) или изменять пороговые значения.
  • Низкая сложность — Плоская структура там, где возможно, составные состояния только там, где логическая группировка улучшает понимание (Полив).

Этот дизайн обеспечивает баланс между надежностью, безопасностью и простотой — подходит для реализации на встраиваемых микроконтроллерах (Arduino, ESP32 и др.).

6. Заключение

Машина состоянийМашины состояний предоставляют отличную формализацию для моделирования реактивных систем управления, таких как умные системы полива. Четко определив состояния, события, условия и действия, инженеры могут анализировать поведение системы, крайние случаи и восстановление после ошибок до написания кода.

Представление на PlantUML выше служит одновременно документацией и чертежом для реализации. Его отображение (с помощью инструментов PlantUML или онлайн-серверов) даёт чистую, профессиональную диаграмму, готовую к использованию при обзоре требований, генерации кода или обучении концепциям UML.

В будущем можно добавить:

  • Интеграция с API погоды (пропуск этапа сенсорики при прогнозе дождя).
  • Множественные зоны с пороговыми значениями влажности для каждой зоны.
  • Уведомления в мобильном приложении при тайм-ауте или ошибке.

В этом исследовании показано, как, несмотря на кажущуюся простоту, задача автоматизации значительно выигрывает от структурированного моделирования на основе состояний.