Blog
ESP32 + MQTT: envía datos de sensores a la nube en 30 min
El problema
Has montado una estación meteorológica con ESP32. La temperatura y la humedad se ven perfectas en tu monitor serie. Pero aquí está el problema: esos datos están atrapados en tu portátil. No puedes consultarlos desde el móvil. No puedes guardarlos. No puedes disparar automatizaciones.
MQTT lo resuelve. Es el protocolo de comunicación que mueve la mayoría de los sistemas IoT del mundo, desde fábricas inteligentes hasta instalaciones de Home Assistant.
Qué vas a construir
Un nodo sensor con ESP32 que:
- Lee temperatura y humedad cada 30 segundos
- Publica los datos en un broker MQTT de nube gratuito
- Te deja monitorizarlo todo desde cualquier navegador, estés donde estés
Dificultad: Principiante | Tiempo: 30 minutos | Coste: ~23,00 $ en piezas
Hardware necesario (lista de materiales)
| Componente | Modelo | Cant. | Precio | Comprar |
|---|---|---|---|---|
| Microcontrolador | ESP32 DevKitC V4 | 1 | 13,49 $ | Ver producto |
| Sensor de temperatura/humedad | DHT22 | 1 | 5,24 $ | Ver producto |
| Pantalla (opcional) | 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 |
Paso 1: Cableado
ESP32 ↔ DHT22
| Pin DHT22 | Pin ESP32 | Nota |
|---|---|---|
| VCC | 3V3 | Alimentación |
| GND | GND | Tierra |
| DATA | GPIO 13 | Línea de datos |
ESP32 ↔ OLED (opcional)
| Pin OLED | Pin ESP32 | Nota |
|---|---|---|
| VCC | 3V3 | Alimentación |
| GND | GND | Tierra |
| SDA | GPIO 21 | Datos I2C |
| SCL | GPIO 22 | Reloj I2C |
Paso 2: Instala las librerías
Abre el Arduino IDE → Sketch → Include Library → Manage Libraries e instala:
- PubSubClient de Nick O’Leary (comunicación MQTT)
- DHT sensor library de Adafruit (driver del DHT22)
- Adafruit SSD1306 (pantalla OLED, si la usas)
Paso 3: Sube el código
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// --- WiFi Settings ---
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// --- MQTT Settings ---
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* temp_topic = "sensbench/home/temperature";
const char* hum_topic = "sensbench/home/humidity";
// --- Sensor Settings ---
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// --- Globals ---
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("nWiFi connected! IP: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
String clientId = "sensbench-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected!");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5s");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Sensor read failed!");
return;
}
char tempStr[8], humStr[8];
dtostrf(t, 4, 2, tempStr);
dtostrf(h, 4, 2, humStr);
client.publish(temp_topic, tempStr);
client.publish(hum_topic, humStr);
Serial.printf("Temp: %s°C Humidity: %s%%n", tempStr, humStr);
delay(30000);
}
Paso 4: Mira tus datos en la nube
- Abre https://www.hivemq.com/mqtt-web-client/ en tu navegador
- Haz clic en Connect
- En Subscriptions, añade el topic:
sensbench/home/# - Mira cómo tu ESP32 envía datos en tiempo real cada 30 segundos
¿Y ahora qué?
Ahora que tus datos están en la nube, puedes:
- Montar un dashboard con Node-RED o Home Assistant para visualizar los datos
- Añadir más sensores — un BME280 para la presión del aire, humedad del suelo para las plantas
- Disparar automatizaciones — “si la temperatura > 30°C, enciende el ventilador”
- Pasarte a batería — añade el modo deep sleep y funcionará durante meses