ESP32 Riego IoT de Plantas (Sensor + Bomba)
Que la bomba arranque sola cuando la tierra de la maceta se seque, y mira la humedad del suelo en directo en el móvil. Este proyecto es la guía paso a paso de la plantilla IoT Humedad del suelo + bomba de la app, con un ESP32, un sensor de humedad del suelo, un relé y una mini bomba de agua. Ve a Taller › Dispositivos › Añadir dispositivo; Ohmi prepara el código con tu clave de dispositivo. El código de aquí es un ejemplo: la clave y el Wi-Fi son de relleno.

Controla este dispositivo desde la app
Conecta tu ESP32 o Raspberry Pi Pico W al wifi, enciéndelo y apágalo desde el móvil y mira las lecturas en directo. Ohmi prepara el código; tú solo pones los datos de tu wifi y lo subes.
Plantilla en la app: Humedad del suelo + bomba
- ¿Dónde está en la app?Añade un dispositivo nuevo desde la pestaña Herramientas o en Taller › Dispositivos y elige esta plantilla.
- Librería de ArduinoAbre el Gestor de librerías en el Arduino IDE, busca BlueGraysIoT e instálala.
El plan gratis incluye 1 dispositivo, 1 gráfica y 24 horas de historial. Con Premium tienes más dispositivos, más gráficas y un historial más largo.
Diagrama del circuito

Código fuente
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// ESP32 Riego IoT de Plantas (Sensor + Bomba)
4// ─────────────────────────────────────────
5// La plantilla IoT "Humedad del suelo + bomba" de la app BlueGrays: el
6// sensor de humedad del suelo mide cada 2 segundos y envía el valor a la
7// app, el relé enciende la bomba cuando la humedad baja del umbral de
8// riego y la apaga 10 puntos por encima; también controlas la bomba y el
9// umbral desde el móvil. Ohmi prepara el código real en la app con tu
10// propia clave de dispositivo (Taller › Dispositivos › Añadir
11// dispositivo); el código de aquí es un ejemplo, la clave del dispositivo
12// y los datos del Wi-Fi son de relleno. Gestor de bibliotecas:
13// BlueGraysIoT (con sus dependencias). La placa solo se conecta a redes
14// Wi-Fi de 2,4 GHz. El relé se activa con LOW. Seguridad: alimenta la
15// bomba con su propio portapilas (4 x AA), no desde la placa; mantén la
16// placa, el relé y las pilas lejos del agua, en una caja cerrada; no hagas
17// funcionar la bomba en seco.
18//
19// Pines:
20// GPIO34 -> Sensor de humedad del suelo AO
21// 3V3, GND -> Sensor de humedad del suelo VCC, GND
22// GPIO26 -> Módulo de relé IN
23// 5V, GND -> Módulo de relé VCC, GND
24// Relé COM -> portapilas (+), NO -> bomba (+), bomba (-) -> portapilas (-); la bomba usa sus
25// propias 4 x AA
26// Pico W: sensor de humedad AO GP26, relé IN GP15
27
28/*
29 * Humedad del suelo + bomba · BlueGrays IoT
30 * BlueGrays · bluegrays.com
31 * No compartas este código: contiene la clave de tu dispositivo y la contraseña del Wi-Fi.
32 */
33
34#include <BlueGraysIoT.h>
35
36const char *DEVICE_KEY = "TU_CLAVE_DE_DISPOSITIVO";
37const char *WIFI_NAME = "TU_RED_WIFI";
38const char *WIFI_PASSWORD = "TU_CONTRASENA_WIFI";
39
40BlueGraysIoT bg(DEVICE_KEY);
41
42const int RELAY_PIN = 26;
43const bool RELAY_ACTIVE_LOW = true; // la mayoría de los módulos de relé se activan con LOW
44void setRelay(bool on) { digitalWrite(RELAY_PIN, (on != RELAY_ACTIVE_LOW) ? HIGH : LOW); }
45const int SOIL_PIN = 34;
46const int SOIL_DRY = 3200; // lectura en tierra seca
47const int SOIL_WET = 1300; // lectura en tierra húmeda
48int threshold = 30; bool pump = false; unsigned long lastReadMs = 0;
49
50void setup() {
51 Serial.begin(115200);
52 pinMode(RELAY_PIN, OUTPUT);
53 setRelay(false);
54 analogReadResolution(12);
55 bg.onSwitch("pompa", [](bool on) { pump = on; setRelay(on); });
56 bg.onNumber("esik", [](float v) { threshold = (int)v; });
57 bg.setDeadband("toprak", 1.0);
58 bg.setDebug(Serial);
59 bg.setLanguage(BG_LANG_EN);
60 bg.begin(WIFI_NAME, WIFI_PASSWORD);
61}
62
63void loop() {
64 bg.loop(); // evita aquí los delay() largos
65 if (millis() - lastReadMs >= 2000) {
66 lastReadMs = millis();
67 int pct = constrain(map(analogRead(SOIL_PIN), SOIL_DRY, SOIL_WET, 0, 100), 0, 100);
68 bg.send("toprak", pct);
69 // Enciende la bomba por debajo del umbral y apágala 10 puntos por encima
70 if (pct < threshold && !pump) { pump = true; setRelay(true); bg.send("pompa", true); }
71 if (pct > threshold + 10 && pump) { pump = false; setRelay(false); bg.send("pompa", false); }
72 }
73}
74Preguntas frecuentes
¿Puedo subir a la placa el código de esta página tal cual?
Puedes, pero no se conectará: la clave del dispositivo y los datos del Wi-Fi son de relleno. En la app ve a Taller › Dispositivos › Añadir dispositivo y elige la plantilla Humedad del suelo + bomba; Ohmi prepara el código con tu clave, el nombre de tu red y tu contraseña. Copia ese código y súbelo. Después puedes ver el código completo en Dispositivo › Código y clave.
¿Funciona también con una Pico W?
Sí. Al añadir el dispositivo elige Pico W como placa; el código es el mismo y solo cambian los pines y los valores de calibración: el sensor de humedad va al GP26 (una entrada analógica) y el relé al GP15. En Arduino IDE instala el paquete "pico" desde el Gestor de placas. El circuito y la foto de esta página se hicieron con un ESP32.
¿Por qué la bomba lleva sus propias pilas?
La corriente que consume la bomba y el ruido de su motor pueden reiniciar la placa. Por eso la bomba se alimenta con un portapilas de 4 x AA y solo pasa por los terminales COM y NO del relé; no tiene ningún cable unido a la placa. Mantén la placa, el relé y el portapilas lejos del agua, en una caja cerrada, y que los empalmes no se mojen. La bomba solo debe funcionar sumergida; en seco se calienta y se estropea en pocos minutos. Quita las pilas mientras colocas la manguera o sacas la bomba del agua.
¿Cuándo funciona la bomba y qué pasa si la enciendo a mano?
La placa mide la humedad cada 2 segundos. Cuando baja del Umbral de riego de la app (al principio 30 %) la bomba se enciende, y se apaga 10 puntos por encima del umbral; ese margen evita que se encienda y apague sin parar. También puedes tocar a mano el interruptor Bomba, pero manda la regla automática: si la apagas con la tierra por debajo del umbral, vuelve a encenderse en 2 segundos, y si la enciendes con la tierra 10 puntos por encima, se apaga enseguida. Ajusta el umbral a tu maceta.
