Estudo de Caso: Projeto de Máquina de Estados para um Controlador Inteligente de Irrigação para Jardim

1. Introdução

A jardinagem e a agricultura modernas dependem cada vez mais da automação para otimizar o uso de recursos, especialmente água — um recurso escasso em muitas regiões. Um controlador de irrigação inteligente automatiza a irrigação com base nas condições em tempo real do solo, em vez de cronômetros fixos, reduzindo desperdícios, evitando regas excessivas ou insuficientes e apoiando um crescimento mais saudável das plantas.

Este estudo de caso foca na modelagem comportamental de um sistema desse tipo usando um diagrama de máquina de estados UML (também chamado de diagrama de estado). O diagrama captura o ciclo de vida do sistema, pontos de decisão e respostas a eventos como leituras de umidade, tempos esgotados e intervenções do usuário.

O projeto utiliza a sintaxe PlantUML sintaxe, semelhante ao exemplo da cafeteria fornecido, que modela elegantemente estados compostos, guardas, ações e caminhos de erro/recuperação.

2. Declaração do Problema e Requisitos

Um controlador de irrigação automatizado para um jardim doméstico ou pequeno estufa deve:

  • Iniciar em um modo de baixo consumo de energia Standby a maioria do tempo.
  • Acordar periodicamente de acordo com um cronograma (disparador de temporizador) para verificar as condições.
  • Entrar em um estado de Sensing para ler o nível de umidade do solo (por meio de um sensor capacitivo ou resistivo).
  • Se a umidade < 30% (limiar seco configurável), iniciar Irrigando abrindo uma válvula solenóide ou ativando uma bomba.
  • Se a umidade ≥ 30%, retornar para Aguardando (não é necessário regar).
  • Enquanto Regando, monitore continuamente (ou periodicamente) a umidade.
  • Pare de regar e feche a válvula quando:
    • A umidade atinge 80% (limiar de umidade ajustável) → meta alcançada.
    • Um Tempo limite de segurança expira (por exemplo, 30 minutos) → evita inundação, estouro de tubos ou problemas elétricos se o sensor falhar.
  • Após parar a irrigação, vá para o estado Desligamento.
  • Em Desligamento, aguarde confirmação manual (pressão de botão ou comando do aplicativo) antes de retornar ao Aguardando — isso permite que o usuário inspecione o sistema ou anule a ação, se necessário.
  • Trate falhas com elegância (por exemplo, falha no sensor, válvula travada) passando para um estado Erro com opções de recuperação.

Comportamentos desejáveis adicionais (mantidos simples aqui):

  • Nenhuma irrigação durante certas horas (gerenciada por cronograma/temporizador).
  • Registro ou notificações estão fora do escopo desta máquina de estados principal.

3. Conceitos principais da máquina de estados utilizados

  • Estados: Ocioso/Standby, Sensando, Irrigando, Desligando, Erro.
  • Estado composto: Irrigando inclui lógica de monitoramento interna (embora mantida plana aqui para simplificação).
  • Transições:
    • Disparado por eventos (temporizador, leitura de umidade, tempo limite).
    • Protegido por condições [umidade < 30%], [umidade >= 80%].
  • Ações: /abrir_valvula(), /fechar_valvula(), /notificar_usuario(), etc.
  • Pseudostados iniciais/finais: [*] para início/fim.
  • Transições auto e loops de recuperação.

4. Diagrama de Estados em PlantUML

Abaixo está o código completo em PlantUML que implementa o comportamento descrito. Ele segue as convenções do exemplo da cafeteria (estilo skinparam, estados compostos quando apropriado, guardas em [], ações com /).

plantuml
@startuml

skinparam {
' Estilo geral
' Cores
ArrowColor #333333
ArrowFontColor #333333
BackgroundColor #FFFFFF
BorderColor #333333

' Estilo de estado
State {
BorderColor #005073
BackgroundColor #E6F5FF
FontColor #005073
}
}

[*] --> Standby

Standby --> Sensing : timer_triggers()

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

Irigating --> Shutdown : umidade_solo >= 80% OU tempo_limite_seguranca()
Irigating --> Shutdown : tempo_limite_seguranca() // Proteção de tempo limite de fallback

Shutdown --> Standby : usuario_confirma_reinicializacao()

Standby --> [*]

@enduml

Explicação do Diagrama

  • Standby — Estado padrão de baixo consumo/ocioso.
  • Sensando — Verificação rápida disparada por temporizador; evita rega desnecessária.
  • Irrigando (composto) — Fase ativa de rega com subatividade interna Rega subatividade.
    • Sai quando atinge a umidade alvo ou tempo limite de segurança.
  • Desligamento — Estado de espera pós-irrigação que exige confirmação para retomar a automação (recursos de segurança).
  • Erro — Estado de contenção de falhas com transição de recuperação manual.

5. Racional de Design e Benefícios

  • Conservação de água — Irriga apenas quando realmente necessário (baseado na umidade do solo, em vez de tempo).
  • Prevenção de inundação — Duas condições de saída do estado Irrigando (alvo de umidade + tempo limite).
  • Segurança e controle do usuário — Confirmação manual após parada anormal evita reinício automático após problemas potenciais.
  • Extensibilidade — Fácil de adicionar estados (por exemplo, Chuva Detectada, Bateria Baixa, Modo Inverno) ou ajustar os limites.
  • Baixa complexidade — Plano sempre que possível, composto apenas quando o agrupamento lógico aumenta a clareza (Irrigando).

Este design equilibra robustez, segurança e simplicidade — adequado para implementação em microcontroladores embarcados (Arduino, ESP32, etc.).

6. Conclusão

Máquina de estadosAs máquinas de estados fornecem um formalismo excelente para modelar sistemas de controle reativos, como controladores de irrigação inteligentes. Ao definir claramente estados, eventos, guardas e ações, engenheiros podem analisar o comportamento do sistema, casos extremos e recuperação de erros antes de escrever o código.

A representação em PlantUML acima serve como documentação e como um plano para implementação. Renderizá-la (por meio de ferramentas PlantUML ou servidores online) produz um diagrama limpo e profissional, pronto para revisões de requisitos, geração de código ou ensino de conceitos de UML.

Extensões futuras poderiam incluir:

  • Integração com API de clima (pular Sensing se houver previsão de chuva).
  • Várias zonas com limites de umidade por zona.
  • Notificações em aplicativo móvel em caso de tempo limite ou erro.

Este estudo de caso demonstra como um problema de automação aparentemente simples se beneficia grandemente da modelagem baseada em estados estruturada.