Un sistema de riego automático es un montaje que activa una bomba según la humedad del suelo y la detiene cuando alcanza el nivel deseado.
Hasta ahora, en nuestra serie “Learn by playing”, hemos encendido luces y emitido sonidos. Hoy vamos a dar el salto a mover fluidos y tomar decisiones basadas en el estado biológico de una planta.
Este proyecto tiene dos grandes retos técnicos que lo diferencian de los anteriores:
- La lectura analógica no es binaria (todo o nada), sino un rango continuo que debemos interpretar.
- La necesidad de separar la potencia (la bomba de agua) de la lógica (el Arduino).
El objetivo no es solo regar, sino regar bien. Para ello, aprenderemos a evitar que la bomba se encienda y apague frenéticamente cuando la humedad está justo en el límite.
Sensores resistivos y capacitivos
Para medir la humedad del suelo, necesitamos un sensor higrómetro. Existen dos tecnologías principales y conviene conocer la diferencia:
- Resistivos (Los baratos de horquilla metálica): Funcionan pasando corriente a través de la tierra. La tierra húmeda conduce mejor. El problema: Sufren electrólisis. Literalmente, el sensor se corroe y se disuelve en la tierra en cuestión de semanas.
- Capacitivos: Miden cambios relacionados con la permitividad del suelo sin dejar electrodos metálicos expuestos. Suelen ser más duraderos, aunque también necesitan calibración y protección frente al agua en la zona de la electrónica.
En este tutorial usaremos una lógica válida para ambos, pero es preferible un sensor capacitivo si quieres reducir los problemas de corrosión.
Histéresis
Supongamos que decidimos regar cuando la humedad baja del 50%. ¿Qué pasa si la humedad está fluctuando en 49.9% - 50.1%? Que la bomba se encendería y apagaría cientos de veces por minuto. Eso quemaría el relé o el motor.
Para evitarlo, usamos Histéresis. Definimos dos umbrales:
- Umbral Inferior (ej. 30%): Si baja de aquí, ENCENDEMOS la bomba.
- Umbral Superior (ej. 70%): Mantenemos la bomba encendida hasta superar este nivel, y entonces APAGAMOS.
Entre el 30% y el 70% no hacemos nada (mantenemos el estado anterior). Esto garantiza ciclos de riego largos y estables.
Componentes
- [1x|blue] Arduino Uno | El cerebro del proyecto
- [1x|green] Sensor de Humedad de Suelo | Preferiblemente Capacitivo v1.2
- [1x|red] Módulo Relé de 5V | Control de la bomba {5V}
- [1x|orange] Mini Bomba de agua sumergible | 3V a 12V
- [1x|yellow] Fuente de alimentación externa | Pilas o adaptador para la bomba
- [Varios|gray] Tubería de vinilo y recipiente con agua | Sistema de riego
No alimentes la bomba desde el pin de 5 V de Arduino. Usa una fuente adecuada para su tensión y corriente, y mantén el agua alejada de conexiones, fuentes y placas sin protección.
Esquema de conexión
Aquí tenemos dos circuitos que conviven: el de control (5V) y el de potencia (el de la bomba).
Sensor de humedad
El sensor entrega una señal analógica que leeremos por A0. Según el modelo, puede alimentarse a 5V o 3.3V.
[ { “from”: “Sensor VCC”, “to”: “5V Arduino”, “color”: “red” }, { “from”: “Sensor GND”, “to”: “GND Arduino”, “color”: “black” }, { “from”: “Sensor Aout”, “to”: “Pin A0”, “color”: “orange”, “note”: “Entrada analógica” } ]
Módulo relé
El relé es la frontera entre la lógica del Arduino y el circuito de potencia de la bomba.
[ { “from”: “Relé VCC”, “to”: “5V Arduino”, “color”: “red” }, { “from”: “Relé GND”, “to”: “GND Arduino”, “color”: “black” }, { “from”: “Relé IN (Señal)”, “to”: “Pin 7”, “color”: “purple” } ]
Bomba y alimentación externa
La bomba no se alimenta desde Arduino. El relé solo abre o cierra el positivo de la fuente externa.
[ { “from”: “Batería (+) → Relé COM”, “to”: “Relé NO → Bomba (+)”, “color”: “red”, “note”: “Circuito de potencia” }, { “from”: “Bomba (-)”, “to”: “Batería (-)”, “color”: “black” } ]
Si usas una fuente externa para la bomba y alimentas Arduino por USB, mantén la parte de potencia separada de la lógica en los contactos del relé. Si el módulo de relé no tiene aislamiento real y comparte señal con Arduino, entonces sí necesitará una referencia de GND común en la parte de control.
El código
El código tiene una particularidad: La Calibración. Los sensores analógicos devuelven un valor entre 0 y 1023. Pero, ¿qué es 0 y qué es 1023?
- En los capacitivos, suele ser: Aire (Seco) ≈ 600-800, Agua (Húmedo) ≈ 200-300.
- Fíjate que es inverso: a mayor humedad, menor valor de voltaje.
Debemos medir experimentalmente qué valores da nuestro sensor en suelo seco y húmedo y ponerlos en el código. Si usas uno capacitivo, no sumerjas la parte que contiene la electrónica; respeta la línea de inserción indicada por el fabricante.
Definiciones y calibración
const int pinSensor = A0;
const int pinBomba = 7;
// --- CALIBRACIÓN (Cambia estos valores tras tus pruebas) ---
// Valor leído con el sensor al aire (completamente seco)
const int VALOR_SECO = 590;
// Valor leído en suelo húmedo, sin mojar la electrónica
const int VALOR_MOJADO = 280;
// Umbrales de riego (en Porcentaje %)
const int UMBRAL_ENCENDIDO = 30; // Regar si baja del 30%
const int UMBRAL_APAGADO = 70; // Parar al llegar al 70%
bool bombaEncendida = false; // Estado actual de la bomba
void setup() {
Serial.begin(9600);
pinMode(pinBomba, OUTPUT);
digitalWrite(pinBomba, HIGH); // Apagamos relé (muchos módulos funcionan con lógica inversa, HIGH=Apagado)
// Nota: Si tu relé se activa con HIGH, pon aquí LOW.
// Asumiremos un relé de activación en LOW (común en módulos).
}
Función de lectura y mapeo
No queremos trabajar con números raros (280, 590), queremos porcentajes (0% - 100%). Usaremos la función map(), pero con cuidado, ya que el sensor puede dar valores fuera del rango teórico en condiciones extremas.
int obtenerHumedad() {
int lectura = analogRead(pinSensor);
// Mapeamos el valor: de (SECO, MOJADO) a (0, 100)
// Al poner VALOR_SECO primero, invertimos la lógica automáticamente
int porcentaje = map(lectura, VALOR_SECO, VALOR_MOJADO, 0, 100);
// Constrain evita que salgan números negativos o > 100
return constrain(porcentaje, 0, 100);
}
El loop con histéresis
Aquí aplicamos la lógica de control. No hay un else que fuerce un estado en la zona intermedia: las dos condiciones crean la ventana de histéresis.
void loop() {
int humedadActual = obtenerHumedad();
Serial.print("Humedad: ");
Serial.print(humedadActual);
Serial.println("%");
// --- LÓGICA DE CONTROL (HISTÉRESIS) ---
if (humedadActual <= UMBRAL_ENCENDIDO && !bombaEncendida) {
Serial.println("-> Suelo muy seco. ENCENDIENDO BOMBA.");
digitalWrite(pinBomba, LOW); // Activa Relé (lógica inversa)
bombaEncendida = true;
}
else if (humedadActual >= UMBRAL_APAGADO && bombaEncendida) {
Serial.println("-> Suelo regado. APAGANDO BOMBA.");
digitalWrite(pinBomba, HIGH); // Desactiva Relé
bombaEncendida = false;
}
// Importante: No ponemos un 'else' que apague la bomba si está al 50%.
// Si está al 50%, se queda como estaba (encendida si venía subiendo, apagada si venía bajando).
delay(1000); // Leemos cada segundo
}
Seguridad y mejoras
Manipular agua y electricidad requiere precauciones.
- Lecturas inválidas: Un sensor desconectado puede dejar la entrada flotante y producir valores imprevisibles. Conviene detectar lecturas fuera del rango calibrado, limitar el tiempo máximo de riego y exigir un periodo de reposo antes de volver a activar la bomba.
- Corrosión de sensores: Si usas un sensor resistivo, aliméntalo solo durante la lectura para reducir la electrólisis. Comprueba antes que su consumo sea compatible con el método de conmutación elegido.
- Interferencias: Los motores generan ruido eléctrico. Si el Arduino se reinicia al encender la bomba, necesitaréis añadir un condensador o un diodo flyback en los bornes del motor.