Caso práctico: Riego automático según luz solar

Esquemático — Caso práctico: Riego automático según luz solar

Objetivo y caso de uso

Qué construirás: Un riego automático con Arduino que enciende una mini bomba de 5 V cuando baja la luz (atardecer o nublado) usando una LDR y un umbral calibrable con histéresis. La decisión se toma en menos de 300 ms.

Para qué sirve

  • Regar macetas de balcón al atardecer para reducir evaporación (ON cuando VA < 2.2 V o A0 < 450; OFF > 550).
  • Activar riego en días muy nublados para evitar estrés hídrico (D3 alto controla la bomba vía NPN).
  • Automatizar el riego de semilleros al final del día de manera consistente (bomba 100–400 mA).
  • Mantener húmedas jardineras cuando la vivienda está desocupada (histéresis evita conmutaciones por luz variable).

Resultado esperado

  • Señal analógica en VA (nodo divisor): 0.1–4.8 V; riego ON cuando VA < 2.2 V (umbral calibrable).
  • Lectura ADC A0: 0–1023; riego ON típicamente por debajo de 450; OFF por encima de 550 (histéresis).
  • Pin D3 (control): nivel alto al activar bomba; nivel bajo en reposo.
  • Corriente de bomba (I_PUMP): 100–400 mA; caída de VC a ~0.2–0.3 V cuando Q1 satura.
  • Latencia de decisión: < 300 ms (con lectura y filtrado simple).

Público objetivo: Personas que inician en electrónica/Arduino; Nivel: básico

Arquitectura/flujo: LDR -> Divisor -> ADC A0 -> MCU -> Transistor NPN -> Bomba 5V

Materiales

  • 1 × Arduino UNO (o compatible 5 V)
  • 1 × Fotoresistencia (LDR) tipo GL5528 (o similar)
  • 1 × Resistor [R1] 10 k
  • 1 × Transistor NPN [Q1] 2N2222 (o 2N3904)
  • 1 × Resistor [R2] 1 k (base de Q1)
  • 1 × Resistor [R3] 100 k (pull-down de base)
  • 1 × Diodo [D1] 1N4007 (rueda libre)
  • 1 × Mini bomba de agua DC 5 V [M1] (200–400 mA)
  • 1 × Fuente 5 V DC (≥ 1 A) para bomba y Arduino (masa común)
  • 6–8 × Cables Dupont y protoboard

Guía de conexionado

  • Alimentación y referencia:
  • Conecta +5V de la fuente al pin 5V del Arduino y al positivo de la bomba [M1]; comparte GND entre fuente y Arduino.
  • Divisor de luz (sensor):
  • Conecta [LDR1] LDR entre +5V y o VA node.
  • Conecta [R1] 10 k entre o VA node y GND.
  • Conecta o VA node al pin A0 del Arduino.
  • Etapa de potencia (bomba):
  • Conecta [M1] Bomba 5V entre +5V y o VC node.
  • Conecta el colector de [Q1] NPN 2N2222 a o VC node y el emisor a GND.
  • Conecta [D1] 1N4007 entre +5V (cátodo) y o VC node (ánodo) en antiparalelo con la bomba.
  • Control de base (Arduino D3):
  • Conecta o VD node al pin D3 del Arduino.
  • Conecta [R2] 1 k entre o VD node y o VB node.
  • Conecta [R3] 100 k entre o VB node y GND.
  • Conecta la base de [Q1] NPN 2N2222 a o VB node.

Esquemático

                           +5V
                           |
             +-------------+-------------+
             |                           |
         [LDR1] LDR                   [M1] Bomba 5V
             |                           |
   VA node-> o                           o <- VC node
             |                           |
          [R1] 10k                       |
             |                           |
            GND                          |
                                         |         C
                                         o----- [Q1] NPN 2N2222
                                         |          E
                                         |          |
                                        GND        GND

                         +5V
                         |
                       [D1] 1N4007
                         |
                   o VC node  (antiparalelo a la bomba)

Desde el nodo VA (lectura ADC):
   VA node o
            |
            o A0 pin

Desde el nodo VD (control desde Arduino):
   D3 pin o----o VD node----[R2] 1k----o VB node
                                      |
                                    [R3] 100k
                                      |
                                     GND

Base de Q1:
   VB node o----(a base de [Q1])
                            ---
Esquemático (ASCII)

Código de ejemplo (Arduino)

const int PIN_LDR = A0;
const int PIN_PUMP = 3;    // D3
// Umbrales con histéresis (ajusta según tu luz ambiente)
const int UMBRAL_ON  = 450; // A0 < 450 => poca luz => regar
const int UMBRAL_OFF = 550; // A0 > 550 => suficiente luz => parar
const unsigned long MIN_INTERVAL_MS = 60000; // 1 min entre riegos (demo)
const unsigned long DURACION_RIEGO_MS = 10000; // 10 s de bomba

unsigned long tUltimoRiego = 0;
bool regando = false;
unsigned long tInicioRiego = 0;

int leerLuzSuavizada() {
  long acc = 0;
  const int N = 16;
  for (int i=0; i<N; i++) {
    acc += analogRead(PIN_LDR);
    delay(5);
  }
  return acc / N;
}

void setup() {
  pinMode(PIN_PUMP, OUTPUT);
  digitalWrite(PIN_PUMP, LOW);
  Serial.begin(115200);
}

void loop() {
  int luz = leerLuzSuavizada();
  unsigned long now = millis();

  if (regando) {
    if (now - tInicioRiego >= DURACION_RIEGO_MS) {
      regando = false;
      digitalWrite(PIN_PUMP, LOW);
      Serial.println("BOMBA=OFF fin de ciclo");
    }
  } else {
    if (luz < UMBRAL_ON && (now - tUltimoRiego) >= MIN_INTERVAL_MS) {
      regando = true;
      tInicioRiego = now;
      tUltimoRiego = now;
      digitalWrite(PIN_PUMP, HIGH);
      Serial.println("BOMBA=ON por poca luz");
    }
  }

  // Seguridad: si hay mucha luz, asegura bomba OFF
  if (luz > UMBRAL_OFF && !regando) {
    digitalWrite(PIN_PUMP, LOW);
  }

  Serial.print("A0=");
  Serial.print(luz);
  Serial.print("  VA_V=");
  Serial.println((luz * 5.0) / 1023.0, 2);
}
Esquemático (ASCII)

Mediciones y pruebas

  • Verificación del divisor de luz:

    • Con un multímetro, mide V_VA (tensión en el nodo VA respecto a GND). V_VA significa “voltaje en VA” y se mide poniendo la punta roja en VA y la negra en GND.
    • Ilumina la LDR con una linterna: V_VA debe subir a ~3.5–4.8 V; cúbrela con la mano: V_VA debe bajar a < 1.0 V.
    • En el monitor serie, verifica que A0 sube (> 800) con luz y baja (< 200) en oscuridad.
  • Ajuste de umbrales:

    • Coloca la LDR en la iluminación típica de “atardecer” deseada y anota V_VA y A0.
    • Fija UMBRAL_ON a ese valor de A0 menos ~50 y UMBRAL_OFF a ese valor más ~50 para crear histéresis.
    • Criterio: la bomba no debe oscilar con nubes pasajeras.
  • Prueba de etapa de potencia (sin agua primero):

    • Ordena “riego” tapando la LDR; mide V_VC (tensión en VC respecto a GND). V_VC debe caer a ~0.2–0.3 V con la bomba encendida.
    • Mide I_PUMP (corriente de la bomba). I_PUMP significa “corriente de la bomba” y se mide colocando el multímetro en serie entre +5V y M1, en rango de corriente DC. Debe estar dentro de la especificación de tu fuente.
  • Prueba integral con agua (breve):

    • Coloca la manguera de la bomba en un recipiente. Activa el riego cubriendo la LDR; observa un caudal estable durante DURACION_RIEGO_MS.
    • Criterio de éxito: latencia < 300 ms desde que baja la luz hasta encendido; sin reinicios de Arduino; temperatura de transistor “tocable” (< 60 °C).

Calibración rápida

  • Si riega demasiado pronto (todavía hay luz): baja UMBRAL_ON en pasos de 25.
  • Si no riega al anochecer: sube UMBRAL_ON en pasos de 25.
  • Si hay oscilaciones por nubes: aumenta la diferencia entre UMBRAL_ON y UMBRAL_OFF (histéresis) a ≥ 150.

Errores comunes

  • Olvidar el diodo [D1] en la bomba: provoca picos inductivos y reinicios del Arduino.
  • No compartir GND entre la fuente de la bomba y el Arduino: la etapa de control no conmuta.
  • Conectar la LDR y R1 al revés si esperas la relación contraria (recuerda: con LDR arriba y R1 abajo, VA sube con luz).
  • Alimentar la bomba desde el USB del PC: el puerto no entrega suficiente corriente.

Seguridad y alimentación

  • Usa una fuente de 5 V con corriente nominal superior al máximo de la bomba (margen del 50% recomendado).
  • Mantén las conexiones y la bomba alejadas del agua; eleva la electrónica y utiliza mangueras bien fijadas.
  • Para bombas > 500 mA o válvulas más grandes, considera un MOSFET lógico con disipador y fusible.

Mejoras y extensiones

  • Añadir un sensor de humedad de suelo y regar solo si hay poca luz y el suelo está seco.
  • Registrar A0 y eventos en tarjeta SD o enviar por MQTT (telemetría).
  • Programar ventanas horarias (por ejemplo, permitir riego solo 20:00–07:00).
  • Sustituir transistor por MOSFET lógico (IRLZ44N o similar) para mayor eficiencia en cargas más grandes.

Más Casos Prácticos en Prometeo.blog

Encuentra este producto y/o libros sobre este tema en Amazon

Ir a 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.

Quiz rápido

Pregunta 1: ¿Qué condición activa el riego automático en el sistema propuesto?




Pregunta 2: ¿Qué lectura típica en A0 enciende el riego según el umbral indicado?




Pregunta 3: ¿Qué lectura en A0 apaga el riego por la histéresis establecida?




Pregunta 4: ¿Qué pin del Arduino controla la bomba a través del transistor?




Pregunta 5: ¿Qué nivel lógico tiene el pin D3 cuando la bomba está activa?




Pregunta 6: ¿Cuál es la latencia máxima objetivo para la toma de decisión de encendido/apagado?




Pregunta 7: ¿Cuál es la corriente típica de la mini bomba de agua especificada?




Pregunta 8: ¿Qué tipo de transistor se usa para conmutar la bomba?




Pregunta 9: ¿A qué tensión del nodo VA se activa el riego?




Pregunta 10: ¿Qué caída de tensión se observa en el colector cuando Q1 está saturado?




Carlos Núñez Zorrilla
Carlos Núñez Zorrilla
Electronics & Computer Engineer

Ingeniero Superior en Electrónica de Telecomunicaciones e Ingeniero en Informática (titulaciones oficiales en España).

Sígueme:
Scroll al inicio