Studium przypadku: Projektowanie maszyny stanów dla inteligentnego sterownika nawadniania ogrodu

1. Wprowadzenie

Nowoczesne ogrodnictwo i rolnictwo coraz częściej opierają się na automatyzacji w celu optymalizacji zużycia zasobów, szczególnie wody – zasobu rzadkiego w wielu regionach. Sterownik inteligentny sterownik nawadniania automatyzuje podlewania na podstawie rzeczywistych warunków gleby, a nie ustalonych czasów, zmniejszając straty, zapobiegając nadmiernemu lub niedostatecznemu podlewaniu oraz wspierając zdrowszy wzrost roślin.

To studium przypadku skupia się na modelowaniu zachowania takiego systemu przy użyciu diagram maszyny stanów UML (nazywany również diagramem stanów). Diagram ten uchwytywa cykl życia systemu, punkty decyzyjne oraz reakcje na zdarzenia takie jak pomiary wilgotności, wygaśnięcia timera oraz interwencje użytkownika.

Projekt wykorzystuje składnię PlantUMLsyntax, podobną do przykładu z kawiarnią przedstawionego, który elegancko modeluje stany złożone, warunki (guards), działania oraz ścieżki błędów i odzyskiwania.

2. Sformułowanie problemu i wymagania

Automatyczny sterownik nawadniania dla ogrodu domowego lub małego szklarni musi:

  • Uruchamiać się w trybie Oczekiwanianajczęściej, w trybie niskiego zużycia energii.
  • Okresowo wzbudzać się zgodnie z harmonogramem (wyzwalaczem timera) w celu sprawdzenia warunków.
  • Przechodzić do stanu Skanowania w celu odczytania poziomu wilgotności gleby (przez czujnik pojemnościowy lub rezystancyjny).
  • Jeśli wilgotność < 30% (dostosowalny próg suchego), rozpocząć Nawadnianie otwierając zawór elektromagnetyczny lub aktywując pompe.
  • Jeśli wilgotność ≥ 30%, powrócić do Gotowego (nie wymaga podlewania).
  • Podczas gdy Podlewania, ciągle (lub okresowo) monitoruj wilgotność.
  • Zatrzymaj podlewania i zamknij zawór, gdy:
    • Wilgotność osiąga 80% (dostosowalna granica wilgotności) → cel osiągnięty.
    • Przez Czas wygaśnięcia bezpieczeństwa wygasa (np. 30 minut) → zapobiega powodzi, pęknięciom rur lub problemom elektrycznym w przypadku awarii czujnika.
  • Po zatrzymaniu podlewania przejdź do stanuWyłączenia stanu.
  • W stanieWyłączenia, czekaj na potwierdzenie ręczne (naciśnięcie przycisku lub polecenie aplikacji) przed powrotem do Gotowego — umożliwia użytkownikowi sprawdzenie systemu lub jego przejęcie, jeśli to konieczne.
  • Obsługuj błędy zgodnie z zasadami (np. awaria czujnika, zawór zablokowany), przechodząc do stanuBłędu stanu z opcjami odzyskania.

Dodatkowe pożądane zachowania (utrzymane prosto tutaj):

  • Brak podlewania w określonych godzinach (zarządzane przez harmonogram/czasomierz).
  • Rejestrowanie lub powiadomienia są poza zakresem tego podstawowego maszyn stanów.

3. Użyte kluczowe koncepcje maszyny stanów

  • Stany: Bezczynność/tryb gotowości, wykrywanie, podlewania, wyłączanie, błąd.
  • Stan złożony: Podlewania zawiera wewnętrzną logikę monitorowania (choć tutaj utrzymana jest płaska dla uproszczenia).
  • Przejścia:
    • Wyzwalane zdarzeniami (timer, odczyt wilgotności, przekroczenie czasu).
    • Chronione warunkami [wilgotność < 30%], [wilgotność >= 80%].
  • Działania: /otworz_zawór(), /zamknij_zawór(), /powiadom_użytkownika(), itd.
  • Pseudostany początkowy / końcowy: [*] dla początku/końca.
  • Przejścia samodzielne oraz pętle odzyskiwania.

4. Diagram stanów w PlantUML

Poniżej znajduje się pełny kod PlantUML implementujący opisane zachowanie. Używa konwencji z przykładu kawiarni (stylowanie skinparam, stany złożone tam, gdzie odpowiednie, warunki w [], działania z /).

plantuml
@startuml

skinparam {
' Ogólny styl
' Kolory
ArrowColor #333333
ArrowFontColor #333333
BackgroundColor #FFFFFF
BorderColor #333333

' Stylowanie stanów
State {
BorderColor #005073
BackgroundColor #E6F5FF
FontColor #005073
}
}

[*] --> Standby

Standby --> Sensing : timer_triggers()

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

Irigating --> Shutdown : wilgotnosc_rolna >= 80% OR bezpieczny_timeout()
Irigating --> Shutdown : bezpieczny_timeout() // Ochrona przed przekroczeniem czasu (rezerwa)

Shutdown --> Standby : uzytkownik_potwierdza_reset()

Standby --> [*]

@enduml

Wyjaśnienie diagramu

  • Tryb gotowości — Domyślny stan niskiego zużycia mocy/tryb bezczynności.
  • Wykrywanie — Szybka kontrola wyzwalana przez timer; zapobiega niepotrzebnemu podlewaniu.
  • Podlewania (złożony) — Aktywna faza podlewania z wewnętrznąPodlewania podczynnością.
    • Zakończenie przy osiągnięciu docelowej wilgotności lub przekroczeniu czasu bezpieczeństwa.
  • Wyłączenie — Stan zawieszenia po podlaniu wymagający potwierdzenia przed wznowieniem automatyzacji (funkcja bezpieczeństwa).
  • Błąd — Stan zawierania uszkodzenia z przejściem ręcznym do odzyskania.

5. Podstawy projektowe i zalety

  • Oszczędzanie wody — Podlewa tylko wtedy, gdy jest naprawdę potrzebne (oparte na wilgotności gleby, a nie czasie).
  • Zapobieganie powodzi — Dwa warunki wyjścia z trybu podlewania (docelowa wilgotność + limit czasu).
  • Bezpieczeństwo użytkownika i kontrola — Potwierdzenie ręczne po nieprzewidzianym zatrzymaniu zapobiega automatycznemu ponownemu uruchomieniu po możliwych problemach.
  • Rozszerzalność — Łatwe dodawanie stanów (np. Wykryto deszcz, Niska pojemność baterii, Tryb zimowy) lub dostosowanie progów.
  • Niska złożoność — Płaskie tam, gdzie to możliwe, złożone tylko tam, gdzie logiczne grupowanie poprawia jasność (podlewania).

Ten projekt równoważy odporność, bezpieczeństwo i prostotę — odpowiedni do wdrożenia na mikrokontrolerach wbudowanych (Arduino, ESP32 itp.).

6. Wnioski

Maszyna stanówMaszyny stanów zapewniają doskonały formalizm do modelowania systemów sterowania reaktywnego, takich jak inteligentne sterowniki podlewania. Poprzez jasne określenie stanów, zdarzeń, warunków i działań inżynierowie mogą analizować zachowanie systemu, przypadki graniczne i odtwarzanie po błędach jeszcze przed napisaniem kodu.

Reprezentacja PlantUML powyżej pełni rolę zarówno dokumentacji, jak i szablonu do wdrożenia. Jej renderowanie (przez narzędzia PlantUML lub serwery online) generuje czysty, profesjonalny schemat gotowy do przeglądu wymagań, generowania kodu lub nauczania koncepcji UML.

Przyszłe rozszerzenia mogą obejmować:

  • Integracja z API pogodowym (pomiń czujniki, jeśli prognozowany deszcz).
  • Wielokrotne strefy z progami wilgotności dla każdej strefy.
  • Powiadomienia aplikacji mobilnej przy przekroczeniu limitu czasu lub błędzie.

Ten studium przypadku pokazuje, jak z pozornego prostego problemu automatyzacji korzysta znacznie z modelowania opartego na stanach.