ESP32/ESP8266 y WiFi
Tenemos sensores que leen y una Pi que procesa, pero todo sigue atado por cables. Para que la «Estación inteligente del salón» sea de verdad inteligente y conectada, necesita enviar sus datos por WiFi. Esa es la pieza que construye este módulo, y la placa estrella para ello es el ESP32.
¿Qué es?
El ESP32 (y su hermano menor, el ESP8266) es un microcontrolador, como el Arduino, pero con WiFi y Bluetooth integrados. Es barato, potente y se programa de dos formas: con el Arduino IDE (C/C++) o con MicroPython, una versión de Python que corre dentro de la propia placa. Usaremos MicroPython porque encaja con el espíritu del curso.
¿Cómo funciona?
El ESP32 ejecuta tu programa en bucle, igual que el Arduino, pero además puede conectarse a tu red WiFi y hablar con servidores de internet. Tras grabarle el firmware de MicroPython, subes un archivo main.py que se ejecuta solo al encender. Lee sus pines, se conecta al WiFi y envía datos por HTTP o MQTT.
¿Para qué sirve?
Sirve para cortar el cable. En la estación, el ESP32 lee el sensor de ambiente y publica las lecturas en la red sin depender de un PC. Es el puente entre el mundo físico y la nube.
Paso 0: MicroPython en el ESP32
Una sola vez, graba el firmware de MicroPython en la placa (con la herramienta esptool, conectando la placa por USB). Luego usa Thonny (un editor sencillo) para escribir archivos directamente en el ESP32.
El ESP32 trabaja a 3.3V, como la Raspberry Pi. Sus pines NO toleran 5V. Alimenta los sensores a 3.3V y verifica niveles antes de conectar cualquier cosa de 5V.
La pieza que construye: enviar el ambiente por WiFi
Conectamos el DHT22 al ESP32 y publicamos sus lecturas.
Conexiones (DHT22 al ESP32):
- Pin VCC del DHT22 → 3V3 del ESP32.
- Pin GND del DHT22 → GND del ESP32.
- Pin DATA del DHT22 → GPIO15 del ESP32.
Primero, conectar al WiFi. En MicroPython:
import network
import time
SSID = "MiRedWiFi"
PASSWORD = "mi-clave-secreta"
def conectar_wifi():
wlan = network.WLAN(network.STA_IF) # modo estación (cliente)
wlan.active(True)
if not wlan.isconnected():
print("Conectando a WiFi...")
wlan.connect(SSID, PASSWORD)
# Esperar hasta tener conexión
while not wlan.isconnected():
time.sleep(0.5)
print("Conectado. IP:", wlan.ifconfig()[0])
return wlan
Ahora el programa principal, main.py, que lee el sensor y manda la lectura a un servidor por HTTP (una API que recibe JSON):
import time
import dht
from machine import Pin
import urequests # versión ligera de requests para MicroPython
from wifi import conectar_wifi # la función de arriba, en wifi.py
URL_SERVIDOR = "http://192.168.1.50:8000/lecturas" # tu API o dashboard
sensor = dht.DHT22(Pin(15)) # DHT22 en GPIO15
conectar_wifi()
while True:
try:
sensor.measure() # dispara una medición
temp = sensor.temperature() # °C
hum = sensor.humidity() # %
datos = {"temp": temp, "hum": hum}
# Enviar como JSON por POST
respuesta = urequests.post(URL_SERVIDOR, json=datos)
print("Enviado:", datos, "->", respuesta.status_code)
respuesta.close() # IMPORTANTE: liberar memoria
except Exception as e:
print("Error en el ciclo:", e)
time.sleep(10) # enviar cada 10 segundos
Al encender el ESP32, se conecta al WiFi y empieza a publicar la temperatura y humedad cada 10 segundos. Ya no hay cables de datos: la estación habla por la red.
respuesta.close() no es opcional en MicroPython: el ESP32 tiene poca memoria y, si no cierras cada respuesta, se queda sin RAM y se reinicia.
Tech English: firmware (programa base de la placa), station mode (modo cliente WiFi), endpoint (dirección de la API), payload (los datos que envías).
Ejercicios
- Cambia el envío para que, antes de publicar, el ESP32 reintente la conexión WiFi si se cayó (verifica
wlan.isconnected()en cada ciclo). - Añade al
payloadun campo"sala": "salon-101"para identificar de qué estación viene la lectura, pensando en que habrá varias.