1. Introducción
La jardinería y la agricultura modernas dependen cada vez más de la automatización para optimizar el uso de recursos, especialmente el agua, un recurso escaso en muchas regiones. Un controlador inteligente de riego automatiza el riego según las condiciones en tiempo real del suelo en lugar de temporizadores fijos, reduciendo el desperdicio, evitando el riego excesivo o insuficiente, y favoreciendo un crecimiento más saludable de las plantas.
Este estudio de caso se centra en el modelado del comportamiento de este sistema utilizando un diagrama de máquina de estados UML (también llamado diagrama de estado). El diagrama captura el ciclo de vida del sistema, los puntos de decisión y las respuestas a eventos como lecturas de humedad, tiempos de espera y la intervención del usuario.
El diseño utiliza PlantUML sintaxis, similar a la del ejemplo del café proporcionado, que modela de forma elegante estados compuestos, condiciones de guardia, acciones y rutas de error/recuperación.
2. Enunciado del problema y requisitos
Un controlador de riego automatizado para un jardín doméstico o invernadero pequeño debe:

- Iniciar en un modo de bajo consumo Standby la mayor parte del tiempo.
- Despertar periódicamente según un programa (activado por temporizador) para verificar las condiciones.
- Entrar en un estado de Sensing para leer el nivel de humedad del suelo (mediante un sensor capacitivo o resistivo).
- Si la humedad < 30% (umbral configurable de sequía), comenzar Riego abriendo una válvula solenoide o activando una bomba.
- Si la humedad ≥ 30%, volver a Espera (no se necesita riego).
- Mientras Riego, monitorear continuamente (o periódicamente) la humedad.
- Detener el riego y cerrar la válvula cuando:
- La humedad alcanza 80% (umbral húmedo configurable) → objetivo alcanzado.
- Un Tiempo de seguridad expira (por ejemplo, 30 minutos) → evita inundaciones, estallidos de tuberías o problemas eléctricos si falla el sensor.
- Después de detener el riego, pasar a Apagado estado.
- En Apagado, esperar a confirmación manual (presión de botón o comando de aplicación) antes de regresar a Espera — esto permite al usuario inspeccionar el sistema o anular si es necesario.
- Manejar los fallos de forma adecuada (por ejemplo, falla del sensor, válvula atascada) pasando a un Error estado con opciones de recuperación.
Comportamientos adicionales deseables (mantenidos simples aquí):
- No riego durante ciertas horas (gestionado por horario/temporizador).
- El registro o notificaciones están fuera del alcance de esta máquina de estados principal.
3. Conceptos clave de la máquina de estados utilizados
- Estados: Inactivo/En espera, Sensado, Riego, Apagado, Error.
- Estado compuesto: El riego incluye lógica de monitoreo interna (aunque se mantiene plano aquí por simplicidad).
- Transiciones:
- Desencadenado por eventos (temporizador, lectura de humedad, tiempo de espera).
- Protegido por condiciones [humedad < 30%], [humedad >= 80%].
- Acciones: /abrir_valvula(), /cerrar_valvula(), /notificar_usuario(), etc.
- Pseudestados inicial / final: [*] para inicio/fin.
- Transiciones auto y bucles de recuperación.
4. Diagrama de estados en PlantUML
A continuación se muestra el código completo de PlantUML que implementa el comportamiento descrito. Sigue las convenciones del ejemplo de la cafetería (estilo skinparam, estados compuestos cuando es apropiado, condiciones en [], acciones con /).
plantuml
@startuml
skinparam {
‘ Estilo general
‘ Colores
ColorFlecha #333333
ColorFuenteFlecha #333333
ColorFondo #FFFFFF
ColorBorde #333333
‘ Estilo de estado
Estado {
ColorBorde #005073
ColorFondo #E6F5FF
ColorFuente #005073
}
}
[*] –> Espera
Espera –> Sensado : timer_triggers()
Sensado –> Riego : humedad_suelo < 30%
Sensado –> Espera : humedad_suelo >= 30%
Riego –> Apagado : humedad_suelo >= 80% O timeout_seguridad()
Riego –> Apagado : timeout_seguridad() // Protección de tiempo de espera de respaldo
Apagado –> Espera : usuario_confirma_reinicio()
Espera –> [*]
@enduml
Explicación del diagrama
- Espera — Estado predeterminado de bajo consumo/inactivo.
- Sensado — Comprobación rápida desencadenada por temporizador; evita riego innecesario.
- Riego (composito) — Fase activa de riego con actividad internaRiego subactividad.
- Sale al alcanzar la humedad objetivo o al vencer el tiempo de seguridad.
- Apagado — Estado de espera posterior al riego que requiere confirmación para reanudar la automatización (función de seguridad).
- Error — Estado de contención de fallos con transición de recuperación manual.
5. Razonamiento de diseño y beneficios
- Conservación de agua — Solo riega cuando realmente es necesario (basado en humedad del suelo en lugar de tiempo).
- Prevención de inundaciones — Condiciones de salida dobles desde Riego (objetivo de humedad + tiempo de espera).
- Seguridad y control del usuario — La confirmación manual tras una parada anormal evita el reinicio automático tras posibles problemas.
- Extensibilidad — Fácil de añadir estados (por ejemplo, Lluvia Detectada, Batería Baja, Modo Invierno) o ajustar umbrales.
- Baja complejidad — Plano cuando sea posible, compuesto solo cuando el agrupamiento lógico aporta claridad (Riego).
Este diseño equilibra robustez, seguridad y simplicidad — adecuado para implementación en microcontroladores embebidos (Arduino, ESP32, etc.).
6. Conclusión
Máquina de estadosLas máquinas de estados proporcionan un formalismo excelente para modelar sistemas de control reactivos como controladores de riego inteligentes. Al definir claramente estados, eventos, condiciones y acciones, los ingenieros pueden razonar sobre el comportamiento del sistema, casos límite y recuperación de errores antes de escribir código.
La representación de PlantUML anterior sirve tanto como documentación como plano de implementación. Su renderizado (mediante herramientas de PlantUML o servidores en línea) produce un diagrama limpio y profesional listo para revisiones de requisitos, generación de código o enseñanza de conceptos de UML.
Las futuras extensiones podrían incluir:
- Integración con API meteorológica (omitir sensado si se prevé lluvia).
- Múltiples zonas con umbrales de humedad por zona.
- Notificaciones en la aplicación móvil en caso de tiempo de espera o error.
Este estudio de caso demuestra cómo un problema de automatización aparentemente simple se beneficia enormemente del modelado estructurado basado en estados.