Objetivo y caso de uso
Qué construirás: Un controlador de riego para plantas con Raspberry Pi que lee un sensor digital de humedad del suelo y activa una bomba de agua controlada por relé cuando la tierra está demasiado seca. El sistema realiza ciclos cortos de riego y luego hace una pausa antes de volver a comprobar para evitar el exceso de riego y el traqueteo del relé.
Por qué es importante / Casos de uso
- Automatiza el riego de una planta de interior, una maceta de hierbas o una pequeña bandeja de plántulas sin necesidad de comprobaciones manuales constantes.
- Ayuda a mantener condiciones del suelo más consistentes reaccionando en segundos ante una señal de estado seco en lugar de esperar horas o días a la intervención humana.
- Ofrece una introducción sencilla al control GPIO, la conmutación por relé y la automatización basada en sensores en Raspberry Pi.
- Útil para configuraciones interiores de bajo voltaje donde una bomba de 5 V puede funcionar en ráfagas cortas, como 2–10 segundos por ciclo.
Resultado esperado
- Un controlador funcional basado en Python que consulta el sensor de humedad a intervalos temporizados, por ejemplo cada 30–60 segundos.
- Activación automática de la bomba solo cuando el sensor informa suelo seco, con una ventana de riego controlada de 3–5 segundos.
- Baja sobrecarga de cómputo en la Raspberry Pi, normalmente muy por debajo del 5% de CPU y sin carga significativa de GPU para esta tarea de automatización sin interfaz gráfica.
- Un prototipo de bajo voltaje más seguro que mantiene la Pi a 5 V, usa un módulo de relé GPIO aislado y alimenta la bomba desde una fuente independiente adecuada.
Público: Principiantes, estudiantes y makers DIY que construyen su primer proyecto con sensores y actuadores; Nivel: Básico
Arquitectura/flujo: El sensor digital de humedad del suelo detecta estado seco/húmedo → Raspberry Pi GPIO lee la señal digital con umbral → el script de control decide si hace falta regar → la salida GPIO conmuta el relé → el relé alimenta una bomba externa durante un ciclo corto → el sistema espera un período de enfriamiento y luego vuelve a comprobar.
Nota educativa de validación
Antes de publicar este caso, el contenido pasó la puerta automática de validación de Prometeo con estado PASS. El validador comprobó los bloques de código, la estructura del artículo, los comandos copiables y la coherencia con el catálogo de dispositivos soportados.
Evidencia de validación publicada
- Resultado automático: PASS.
- Estructura parseada: 3 apartados, 3 tablas y 10 bloques de código detectados antes de publicar.
- Código comprobado: 4 Python/py_compile, 6 Bash/copy-paste checks.
- Catálogo soportado: el texto se contrastó contra los perfiles de dispositivo validables de Prometeo y los stacks no soportados bloquean la publicación.
- Hallazgos del informe: sin hallazgos bloqueantes.
Esta validación confirma compatibilidad sintáctica y de herramientas para el material publicado, pero no sustituye la prueba física sobre tu hardware, cableado y entorno exactos.
Nota educativa de seguridad
Este proyecto es un prototipo educativo, no un producto certificado. Antes de alimentar el montaje, verifica el pinout de la revisión exacta de tu placa ULX3S, mantén las señales de E/S de FPGA a 3.3 V, nunca conectes 5 V directamente a los pines de E/S, desconecta la alimentación antes de cambiar el cableado y utiliza fuentes externas adecuadas para cargas, motores o servos, compartiendo tierra solo cuando el cableado lo requiera.
title: Caso práctico: Controlador de bomba de riego para plantas con Raspberry Pi
slug: practical-case-raspberry-pi
level: Basic
Controlador de bomba de riego para plantas con Raspberry Pi
Este caso práctico muestra cómo construir un controlador de bomba de riego para plantas con una Raspberry Pi. El controlador lee un sensor de humedad del suelo y conmuta una bomba de agua mediante un relé cuando la tierra está seca.
Nota de seguridad
Este es un proyecto educativo de bajo voltaje. Mantén la Raspberry Pi solo a 5 V y utiliza un módulo de relé diseñado para aislamiento GPIO de Raspberry Pi. No conectes tensión de red directamente al GPIO. Alimenta la bomba con su propia fuente adecuada, comparte tierra solo cuando lo requiera el diseño del relé y mantén el agua alejada de la electrónica.
Diagrama de bloques conceptual
Vista de alto nivel: qué entra, qué procesa cada bloque y qué sale del sistema.
Arquitectura funcional
Flujo conceptual de señales y responsabilidades entre bloques del dispositivo.
Objetivo y caso de uso
Construir un controlador basado en Raspberry Pi que:
- mida la humedad del suelo,
- decida si una planta necesita riego,
- active una bomba durante un ciclo corto de riego,
- espere antes de volver a comprobar.
Como una Raspberry Pi no tiene una entrada analógica integrada, este tutorial utiliza un módulo digital de humedad del suelo con umbral ajustable y salida digital.
Componentes
- Raspberry Pi con Raspberry Pi OS
- Tarjeta MicroSD
- Módulo sensor digital de humedad del suelo con
DO,VCC,GND - Módulo de relé de 1 canal y 5 V compatible con disparo GPIO de 3.3 V
- Bomba de agua DC pequeña
- Fuente de alimentación externa adecuada para la bomba
- Cables jumper
- Protoboard o terminales de tornillo
- Tubo y recipiente de agua
Cableado
La Raspberry Pi lee la salida digital del sensor y controla la entrada del relé.
| Función | Pin del módulo | Pin de Raspberry Pi | BCM GPIO |
|---|---|---|---|
| Alimentación del sensor de suelo | VCC | Pin 1 | 3.3 V |
| Tierra del sensor de suelo | GND | Pin 6 | GND |
| Salida digital del sensor de suelo | DO | Pin 11 | GPIO17 |
| Alimentación del relé | VCC | Pin 2 | 5 V |
| Tierra del relé | GND | Pin 9 | GND |
| Entrada de control del relé | IN | Pin 13 | GPIO27 |
Cableado del lado de la bomba
El relé conmuta la alimentación de la bomba, no el riel de alimentación de la Raspberry Pi.
| Elemento del circuito de la bomba | Conectar a |
|---|---|
| Positivo de la fuente de la bomba | Relay COM |
| Relay NO | Cable positivo de la bomba |
| Cable negativo de la bomba | Negativo de la fuente de la bomba |
| Relay NC | No usado |
Usa NO (normalmente abierto) para que la bomba permanezca apagada cuando la Raspberry Pi esté arrancando o apagada.
Cómo funciona
Un módulo digital típico de humedad del suelo expone una salida de comparador:
DO = 0o1según el diseño de la placa y el umbral del trimmer,- el trimmer establece el punto de conmutación entre seco/húmedo.
Esta guía asume:
GPIO17 == LOWsignifica suelo secoGPIO17 == HIGHsignifica suelo húmedo
Si tu sensor se comporta de forma opuesta, el script de prueba de abajo lo mostrará claramente.
Habilitar acceso a GPIO
Actualiza los paquetes e instala la biblioteca GPIO:
sudo apt update
sudo apt install -y python3-gpiozero
Código 1: Prueba de cableado del sensor y del relé
Guarda como sensor_relay_test.py:
#!/usr/bin/env python3
from gpiozero import DigitalInputDevice, OutputDevice
from signal import pause
import time
SENSOR_PIN = 17
RELAY_PIN = 27
sensor = DigitalInputDevice(SENSOR_PIN, pull_up=False)
relay = OutputDevice(RELAY_PIN, active_high=False, initial_value=False)
def state_text() -> str:
return "WET/HIGH" if sensor.value == 1 else "DRY/LOW"
print("Reading soil sensor for 10 seconds...")
for _ in range(10):
print(f"Sensor raw state: {sensor.value} ({state_text()})")
time.sleep(1)
print("Turning pump relay ON for 2 seconds...")
relay.on()
time.sleep(2)
print("Turning pump relay OFF")
relay.off()
Ejecútalo:
python3 sensor_relay_test.py
Resultado esperado
- Cuando mueves el sensor entre suelo seco y húmedo, el estado impreso cambia.
- El relé debería hacer clic una vez al encenderse y otra vez al apagarse.
- Si el comportamiento del relé está invertido, probablemente la configuración
active_high=Falsesea correcta para tu módulo de relé. Muchas placas de relé para Raspberry Pi son activas en bajo.
Código 2: Controlador de bomba de riego para plantas
Guarda como irrigation_controller.py:
#!/usr/bin/env python3
from gpiozero import DigitalInputDevice, OutputDevice
import time
from datetime import datetime
SENSOR_PIN = 17
RELAY_PIN = 27
CHECK_INTERVAL_SECONDS = 30
PUMP_ON_SECONDS = 5
POST_WATERING_DELAY_SECONDS = 60
MAX_CYCLES_PER_HOUR = 6
# Assumption for this tutorial:
# sensor.value == 0 means dry soil
# sensor.value == 1 means wet soil
DRY_SENSOR_VALUE = 0
sensor = DigitalInputDevice(SENSOR_PIN, pull_up=False)
relay = OutputDevice(RELAY_PIN, active_high=False, initial_value=False)
cycle_timestamps = []
def now_text() -> str:
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
def is_dry() -> bool:
return sensor.value == DRY_SENSOR_VALUE
def prune_old_cycles() -> None:
global cycle_timestamps
cutoff = time.time() - 3600
cycle_timestamps = [t for t in cycle_timestamps if t >= cutoff]
def can_water() -> bool:
prune_old_cycles()
return len(cycle_timestamps) < MAX_CYCLES_PER_HOUR
def water_once() -> None:
print(f"{now_text()} Pump ON for {PUMP_ON_SECONDS} s")
relay.on()
time.sleep(PUMP_ON_SECONDS)
relay.off()
cycle_timestamps.append(time.time())
print(f"{now_text()} Pump OFF")
def main() -> None:
print(f"{now_text()} Irrigation controller started")
while True:
dry = is_dry()
print(f"{now_text()} Sensor value={sensor.value} dry={dry}")
if dry:
if can_water():
water_once()
print(f"{now_text()} Waiting {POST_WATERING_DELAY_SECONDS} s after watering")
time.sleep(POST_WATERING_DELAY_SECONDS)
else:
print(f"{now_text()} Watering skipped: hourly cycle limit reached")
time.sleep(CHECK_INTERVAL_SECONDS)
else:
time.sleep(CHECK_INTERVAL_SECONDS)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
relay.off()
print(f"{now_text()} Stopped by user")
Ejecútalo:
python3 irrigation_controller.py
Opcional: Iniciar al arrancar con systemd
Copia el script a una ruta estable:
mkdir -p /home/pi/irrigation
cp irrigation_controller.py /home/pi/irrigation/
chmod +x /home/pi/irrigation/irrigation_controller.py
Crea el archivo de servicio:
sudo tee /etc/systemd/system/irrigation-controller.service >/dev/null <<'EOF'
[Unit]
Description=Raspberry Pi Plant Irrigation Pump Controller
After=multi-user.target
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/irrigation
ExecStart=/usr/bin/python3 /home/pi/irrigation/irrigation_controller.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
Habilítalo e inícialo:
sudo systemctl daemon-reload
sudo systemctl enable irrigation-controller.service
sudo systemctl start irrigation-controller.service
sudo systemctl status irrigation-controller.service --no-pager
Calibración
El módulo de humedad suele tener un pequeño potenciómetro.
- Coloca la sonda en la tierra a la profundidad que quieras supervisar.
- Ejecuta
python3 sensor_relay_test.py. - Gira el potenciómetro lentamente.
- Observa el punto en el que cambia la salida digital.
- Ajusta hasta que la salida cambie en el nivel de sequedad que debe activar el riego.
Método de validación
Para respaldar la afirmación de que este proyecto con Raspberry Pi implementa un controlador de bomba de riego para plantas funcional, valídalo con evidencia observable:
| Comprobación | Método | Evidencia esperada |
|---|---|---|
| Detección del sensor | Mueve la sonda entre suelo seco y suelo húmedo mientras ejecutas sensor_relay_test.py | La salida de consola cambia entre estados seco y húmedo |
| Conmutación de la bomba | Ejecuta sensor_relay_test.py | Clic audible del relé y funcionamiento visible de la bomba durante 2 segundos |
| Riego automático | Coloca la sonda en suelo seco y ejecuta irrigation_controller.py | El registro con marca de tiempo muestra detección de seco, bomba encendida, bomba apagada |
| Recuperación tras el riego | Humedece la tierra después de un ciclo de riego | El controlador registra estado húmedo y deja de activar la bomba |
| Limitación de frecuencia | Mantén el sensor seco de forma continua | El registro finalmente muestra Watering skipped: hourly cycle limit reached |
Solución de problemas
El sensor nunca cambia de estado
- Comprueba el cableado de
VCC,GNDyDO. - Confirma que el módulo del sensor está alimentado con 3.3 V si su salida va directamente al GPIO de Raspberry Pi.
- Recalibra el potenciómetro del umbral.
El relé hace clic pero la bomba no funciona
- Comprueba la fuente de alimentación independiente de la bomba.
- Confirma que la bomba está cableada a través de COM y NO.
- Verifica que el voltaje de la bomba coincide con su fuente de alimentación.
La bomba funciona en el momento equivocado
- La lógica de tu sensor puede estar invertida.
- Cambia esta línea en
irrigation_controller.py:
DRY_SENSOR_VALUE = 0
Si tu módulo informa seco como alto, cámbialo a:
DRY_SENSOR_VALUE = 1
Resultado
Ahora tienes un controlador de bomba de riego para plantas con Raspberry Pi que:
- supervisa la humedad del suelo,
- acciona una bomba mediante un relé,
- riega solo cuando la planta necesita riego,
- incluye un límite de seguridad simple para reducir bombeos repetidos.
Encuentra este producto y/o libros sobre este tema en Amazon
Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.




