Uncategorized

Jardín inteligente con ESP32: riego automático por humedad

El problema

Tus plantas se mueren porque te olvidas de regarlas. O riegas de más y se pudren las raíces. Necesitas un sistema que sepa cuándo tus plantas tienen sed de verdad y las riegue él solo.

Con un ESP32, un sensor de humedad de suelo y un relé, puedes montar un jardín inteligente totalmente automático que:

  • Vigila la humedad del suelo las 24 horas
  • Riega tus plantas cuando lo necesitan (no con un horario fijo)
  • Te avisa cuando el depósito de agua está vacío

Qué vas a construir

Un sistema de riego automático con ESP32 que lee la humedad del suelo cada hora y activa una bomba de agua cuando la tierra se seca. Opcional: conéctalo al WiFi para monitorizarlo a distancia por MQTT.

Dificultad: Principiante  |  Tiempo: 45 minutos  |  Coste: ~35,00 $ en piezas

Hardware necesario (lista de materiales)

Componente Modelo Cant. Precio Comprar
Microcontrolador ESP32 DevKitC V4 1 13,49 $ Ver producto
Sensor de humedad de suelo Sensor capacitivo de humedad v1.2 1 4,49 $ Ver producto
Módulo de relé Relé de 2 canales 5V 1 5,24 $ Ver producto
Pantalla 0.96″ OLED SSD1306 1 5,99 $ Ver producto
Protoboard 830 puntos 1 4,49 $ Ver producto
Cables jumper M-M 40 uds. 1 2,99 $ Ver producto

También necesitarás una mini bomba de agua (5V, ~3 $ en cualquier ferretería) y tubo de silicona. Conecta el cable positivo de la bomba a través del relé.

Paso 1: Cableado

ESP32 ↔ Sensor de humedad de suelo

Pin del sensor Pin ESP32 Nota
VCC 3V3 Alimentación
GND GND Tierra
AOUT GPIO 34 Salida analógica (ADC1_CH6)

ESP32 ↔ Módulo de relé

Pin del relé Pin ESP32 Nota
VCC 5V/VIN Alimentación
GND GND Tierra
IN1 GPIO 26 Señal de control del relé

ESP32 ↔ Pantalla OLED

Pin OLED Pin ESP32 Nota
VCC 3V3 Alimentación
GND GND Tierra
SDA GPIO 21 Datos I2C
SCL GPIO 22 Reloj I2C

Importante: conecta la bomba de agua entre el terminal NO (Normalmente Abierto) del relé y el terminal COM. El relé actúa como un interruptor: cuando GPIO 26 pasa a LOW, la bomba se enciende.

Paso 2: Calibración

Antes de automatizar, tienes que averiguar los valores de “seco” y “mojado” de tu tierra:

  1. Clava el sensor en tierra seca → anota la lectura analógica (p. ej., 3200)
  2. Clávalo en tierra mojada → anota la lectura (p. ej., 1400)
  3. Calcula el umbral: por debajo de este valor = hay suficiente agua, por encima = necesita riego
DRY_VALUE = 3200   (your reading in dry soil)
WET_VALUE = 1400   (your reading in wet soil)
THRESHOLD = 2500   (trigger watering above this)

Paso 3: Sube el código

#include <Wire.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// --- Pins ---
#define SOIL_PIN 34
#define PUMP_PIN 26

// --- Calibration (change these!) ---
const int DRY_VALUE = 3200;
const int WET_VALUE = 1400;
const int THRESHOLD = 2500;

const unsigned long CHECK_INTERVAL = 3600000;
const unsigned long PUMP_DURATION = 5000;
unsigned long lastCheck = 0;

void displayReading(int raw, int percent) {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Smart Garden");
  display.drawLine(0, 10, 128, 10, SSD1306_WHITE);
  display.setCursor(0, 20);
  display.printf("Moisture: %d%%", percent);
  display.setCursor(0, 35);
  if (percent < 40) {
    display.println("Status: DRY");
    display.println("Pump: ACTIVE");
  } else {
    display.println("Status: OK");
    display.println("Pump: OFF");
  }
  display.setCursor(0, 55);
  display.printf("Raw: %d", raw);
  display.display();
}

void setup() {
  Serial.begin(115200);
  pinMode(PUMP_PIN, OUTPUT);
  digitalWrite(PUMP_PIN, HIGH);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLED not found!");
  }
  display.clearDisplay();
  display.display();
}

void loop() {
  if (millis() - lastCheck >= CHECK_INTERVAL || lastCheck == 0) {
    lastCheck = millis();
    int raw = analogRead(SOIL_PIN);
    int percent = map(raw, DRY_VALUE, WET_VALUE, 0, 100);
    percent = constrain(percent, 0, 100);
    Serial.printf("Soil: %d%% (raw: %d)n", percent, raw);
    displayReading(raw, percent);
    if (percent < 40) {
      Serial.println("Soil is dry! Watering...");
      digitalWrite(PUMP_PIN, LOW);
      delay(PUMP_DURATION);
      digitalWrite(PUMP_PIN, HIGH);
      Serial.println("Watering complete.");
    }
  }
}

Paso 4: Ponlo en marcha

  1. Clava el sensor capacitivo de humedad en la maceta
  2. Conecta la bomba de agua a un recipiente con el tubo hasta la planta
  3. Alimenta el ESP32 por USB o con un escudo de batería 18650
  4. La pantalla OLED muestra el porcentaje de humedad en vivo y el estado de la bomba
  5. Cada hora, el sistema comprueba la humedad del suelo y riega automáticamente

Por qué los sensores capacitivos son mejores

Este sistema usa un sensor de humedad capacitivo (no resistivo). Los sensores resistivos llevan sondas metálicas expuestas que se corroen en tierra húmeda en semanas. Los capacitivos sellan la electrónica tras una capa protectora y duran años sin degradarse.

Ir más allá

  • Añade WiFi + MQTT — manda los datos de humedad a tu móvil (combínalo con el tutorial de MQTT)
  • Añade varios sensores — usa un multiplexor (CD4051BE) para vigilar varias plantas con un solo ESP32
  • Añade un sensor de nivel de agua — te avisa cuando el depósito esté a punto de vaciarse
  • Integración con Home Assistant — controla la bomba desde el dashboard de tu casa inteligente
  • Energía solar — añade una placa solar de 5V + escudo de batería 18650 para instalarlo en exterior de forma permanente

Leave a Reply

Your email address will not be published. Required fields are marked *