Blog
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:
- Clava el sensor en tierra seca → anota la lectura analógica (p. ej., 3200)
- Clávalo en tierra mojada → anota la lectura (p. ej., 1400)
- 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
- Clava el sensor capacitivo de humedad en la maceta
- Conecta la bomba de agua a un recipiente con el tubo hasta la planta
- Alimenta el ESP32 por USB o con un escudo de batería 18650
- La pantalla OLED muestra el porcentaje de humedad en vivo y el estado de la bomba
- 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