Sistema de Invernadero Inteligente con ESP32

Hace unos días, uno de vosotros me escribió preguntándome si podía ayudarle con un proyecto de invernadero inteligente. Quería algo funcional pero que fuera fácil de entender para empezar en el mundo del ESP32 y los sensores.

Me pareció una petición genial, así que me puse manos a la obra y creé este proyecto ejemplo. Y pensé: si le sirve a él, seguro que a muchos más de vosotros también os viene bien como punto de partida. Así que aquí lo comparto con todos.

Este proyecto es perfecto si:

  • Estás empezando con ESP32 y quieres un ejemplo práctico

  • Quieres aprender a usar sensores y actuadores

  • Nunca has trabajado con pantallas OLED

  • Te gustaría entender cómo hacer un sistema automático

  • Buscas un proyecto útil que puedas mejorar después

¿Qué hace este sistema?

He intentado que sea completo pero sin complicarlo demasiado. Incluye lo esencial:

  • 🌡️ Lee temperatura y humedad del ambiente con un DHT22

  • 💧 Mide la humedad del suelo para saber cuándo regar

  • 🚰 Activa una bomba automáticamente cuando hace falta agua

  • 📊 Muestra todo en una pantalla OLED para que veáis qué está pasando

  • 🚦 Usa LEDs de colores como indicadores visuales

  • ⚠️ Sistema de alertas para condiciones críticas

Es un ejemplo funcional que podéis usar tal cual, o modificar según vuestras necesidades. Todo el código está súper comentado para que entendáis cada parte.

Materiales que necesitáis

Os dejo exactamente lo que usé para este ejemplo:

Componentes electrónicos:

  • 1x ESP32 (cualquier modelo básico vale)

  • 1x Pantalla OLED 128x64 I2C

  • 1x Sensor DHT22

  • 1x Sensor de humedad de suelo (preferiblemente capacitivo)

  • 1x Módulo relé de 5V de 1 canal

  • 3x LEDs: verde, amarillo y rojo

  • 3x Resistencias de 220Ω

  • 1x Bomba de agua sumergible de 5V

  • Cables Dupont y una protoboard

Herramientas básicas:

  • Cable micro-USB para programar

  • Multímetro (si tenéis uno)

  • Soldador (opcional, para hacerlo permanente)

Todo esto son componentes muy comunes que seguro muchos ya tenéis, o que podéis conseguir fácilmente.

Simulación online en Wokwi

Antes de que compréis componentes o hagáis el montaje físico, he preparado una simulación completa en Wokwi para que podáis probar el proyecto virtualmente.

🔗 Acceder a la simulación en Wokwi

¿Qué es Wokwi? Es un simulador online gratuito donde podéis ver el proyecto funcionando sin necesidad de hardware. Podéis:

  • Ver cómo funciona el código en tiempo real

  • Modificar valores y ver qué pasa

  • Probar cambios antes de hacerlos en físico

  • Aprender sin miedo a romper nada

Cómo usar la simulación:

  1. Haced clic en el enlace de arriba

  2. Pulsad el botón verde "Start Simulation"

  3. Veréis la pantalla OLED mostrando datos

  4. Podéis hacer clic en el sensor de humedad para cambiar valores

  5. Observad cómo reacciona el sistema

Es perfecto para entender cómo funciona todo antes de montarlo. Os recomiendo que juguéis con la simulación primero.

Esquema de conexiones paso a paso

Voy a explicarlo bien claro para que no haya dudas. Si es vuestro primer proyecto con ESP32, tomad nota:

Sensor DHT22 (temperatura y humedad)

  • DHT22 ESP32 VCC → 3.3V

  • DATA → GPIO 4

  • GND → GND

Pantalla OLED (aquí mostramos la info)

  • OLED ESP32 VCC → 3.3V

  • GND → GND

  • SDA → GPIO 21 (pin I2C)

  • SCL → GPIO 22 (pin I2C)

Sensor de humedad del suelo

  • Sensor ESP32 VCC → 3.3V

  • GND → GND

  • AOUT → GPIO 34 (pin analógico)

Módulo relé (para controlar la bomba)

  • Relé ESP32 VCC → 5V (pin VIN)

  • GND → GND

  • IN → GPIO 25

LEDs indicadores (con sus resistencias)

  • LED Verde → GPIO 26 → Resistencia 220Ω → GND

  • LED Amarillo → GPIO 27 → Resistencia 220Ω → GND

  • LED Rojo → GPIO 14 → Resistencia 220Ω → GND

Bomba de agua (¡importante!)

  • Bomba (+) → Terminal COMÚN del relé

  • Bomba (-) → GND de fuente externa

  • 5V Relé NO → +5V de fuente externa

⚠️ Importante para principiantes: La bomba NO se conecta directamente al ESP32. Necesita su propia fuente de alimentación externa de 5V. El ESP32 solo controla el relé, que es el interruptor que enciende y apaga la bomba. Esto es básico pero fundamental.

Preparando el software (paso a paso)

Si es vuestra primera vez con ESP32, seguid esto al pie de la letra:

Paso 1: Descargar Arduino IDE

Id a arduino.cc/software y descargad la versión para vuestro sistema operativo. Es gratis y fácil de instalar.

Paso 2: Configurar ESP32 en Arduino IDE

Esta parte confunde a muchos al principio, así que lo explico bien:

  1. Abrid Arduino IDE

  2. Id a Archivo > Preferencias

  3. Donde dice "Gestor de URLs adicionales de tarjetas", copiad y pegad esto:

    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

  4. Aceptad y cerrad

  5. Ahora id a Herramientas > Placa > Gestor de tarjetas

  6. En el buscador escribid "ESP32"

  7. Instalad "esp32 by Espressif Systems"

  8. Esperad a que termine (tarda un poco)

Paso 3: Instalar las librerías

Las librerías son como extensiones que añaden funciones. Necesitamos estas:

  1. Id a Sketch > Incluir Librería > Administrar Bibliotecas

  2. Buscad e instalad una por una:

    • Adafruit SSD1306 (para la pantalla OLED)

    • Adafruit GFX Library (para gráficos)

    • DHT sensor library by Adafruit (para el sensor)

    • Adafruit Unified Sensor (necesaria para el DHT)

Paso 4: Cargar el código

  1. Copiad el código completo que compartí en wokwi

  2. En Herramientas > Placa, seleccionad vuestro ESP32

  3. En Herramientas > Puerto, elegid el puerto COM que aparezca

  4. Pulsad el botón Subir (→)

  5. Esperad a que compile y suba (veréis una barra de progreso)

Si todo va bien, veréis "Subida completada". ¡Ya está programado!

Calibración del sensor de humedad

Esto es importante para que las lecturas sean precisas. Os explico cómo lo hice:

Proceso simple de calibración:

Medida en seco (valor máximo):

  1. Dejad el sensor en el aire, sin tocar nada

  2. Abrid el Monitor Serial (icono de lupa arriba a la derecha)

  3. Poned la velocidad a 115200

  4. Anotad el valor que aparece (suele ser cerca de 4095)

Medida húmedo (valor mínimo):

  1. Meted solo las puntas del sensor en agua

  2. Anotad el valor mínimo (suele ser cerca de 1500)

Ajustar en el código: Buscad esta línea en el código:

soilMoisture = map(soilValue, 4095, 1500, 0, 100);

Cambiad 4095 y 1500 por vuestros valores medidos.

Nota para principiantes: No os preocupéis si no sale exacto. Con valores aproximados también funciona. Lo importante es que entendáis el concepto.

Entendiendo cómo funciona

Si sois nuevos en esto, os explico la lógica básica:

Los tres LEDs:

Es súper simple de entender con solo mirar:

  • 🟢 Verde: Todo bien, sistema funcionando normal

  • 🟡 Amarillo: Está regando o hay algo fuera de lo ideal

  • 🔴 Rojo: Algo va mal y necesita atención

El ciclo automático:

El sistema hace esto en bucle:

  1. Lee los sensores cada 2 segundos

  2. Comprueba si la tierra está seca

  3. Si está seca, activa la bomba por 5 segundos

  4. Actualiza la pantalla con los datos nuevos

  5. Enciende el LED según el estado

  6. Vuelve al paso 1

La información en pantalla:

He diseñado la pantalla para que sea clara y fácil de leer:

  • Primera línea: Nombre del proyecto

  • Temperatura actual

  • Humedad del aire

  • Humedad del suelo (número + barra visual)

  • Estado actual del sistema

Problemas comunes (y soluciones)

Como esto es un ejemplo educativo, os cuento los errores típicos:

"La pantalla no enciende"

  • Revisad las conexiones I2C (GPIO 21 y 22)

  • Probad a cambiar 0x3C por 0x3D en el código

  • Verificad con el multímetro que lleguen 3.3V

"Sale 'nan' en el DHT22"

  • Comprobad la alimentación (3.3V)

  • Verificad que DATA esté en GPIO 4

  • Dejad pasar 2-3 segundos antes de leer

"La bomba no arranca"

  • El relé debe hacer "click" cuando se activa

  • Verificad la alimentación externa de la bomba

  • Comprobad que el pin GPIO 25 mande señal

"Los valores del sensor de suelo son raros"

  • Recalibrad siguiendo el proceso de arriba

  • Asegurad que todas las conexiones estén firmes

  • Si usáis sensor resistivo, cambiad a capacitivo

No os frustréis: Estos problemas son normales cuando empezáis. Forma parte del aprendizaje.

Mis consejos para principiantes

Después de crear este ejemplo, os dejo algunas recomendaciones:

  • Empezad simple: Usad el código tal cual primero, sin modificar nada

  • Leed los comentarios: Todo el código está comentado para que lo entendáis

  • Usad el Monitor Serial: Os ayudará a ver qué está pasando

  • Haced pruebas: Probad a meter el dedo en la tierra para ver cómo reacciona

  • Preguntad: Si tenéis dudas, escribidme. Estoy para ayudar

  • Documentad: Haced fotos del proceso, os servirá para futuros proyectos

  • Compartid: Si conseguís que funcione, enseñadlo a la comunidad

Para cerrar

Este proyecto lo creé como ejemplo para responder a la pregunta de un miembro de la comunidad, pero creo que puede ser útil para muchos más que estáis empezando.

Si montáis este proyecto:

  • Etiquetadme en vuestras fotos en redes

  • Contadme qué problemas tuvisteis (para mejorar el tutorial)

  • Compartid vuestras mejoras con la comunidad

  • Preguntad cualquier duda que tengáis

Recordad que todos empezamos desde cero.

¡Ánimo con vuestros proyectos! Y no olvides seguirnos 🚀