Objetivo
Conectar un ESP32 a WiFi y publicar lecturas de temperatura/humedad (DHT22) a un broker MQTT cada 5 segundos. Usando esp-idf sin Arduino ni librerías de terceros.
Stack de comunicación
DHT22 → ESP32 (GPIO) → esp-idf MQTT client → Broker (Mosquitto) → Dashboard
Configurar WiFi
#include "esp_wifi.h"
#include "esp_event.h"
static void wifi_init(void) {
esp_netif_init();
esp_event_loop_create_default();
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
wifi_config_t wifi_cfg = {
.sta = {
.ssid = "TU_SSID", /* ← cambiar */
.password = "TU_PASSWORD", /* ← cambiar */
},
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg);
esp_wifi_start();
esp_wifi_connect();
}
Configurar cliente MQTT
#include "mqtt_client.h"
static esp_mqtt_client_handle_t client;
static void mqtt_init(void) {
esp_mqtt_client_config_t cfg = {
.broker.address.uri = "mqtt://192.168.1.100", /* ← IP del broker */
};
client = esp_mqtt_client_init(&cfg);
esp_mqtt_client_start(client);
}
Publicar datos
static void publish_sensor_data(float temp, float hum) {
char payload[64];
snprintf(payload, sizeof(payload),
"{\"temp\":%.1f,\"hum\":%.1f}", temp, hum);
esp_mqtt_client_publish(client,
"/firmware-factory/sensores", /* topic */
payload,
0, /* len = 0 → usar strlen */
1, /* QoS 1: al menos una vez */
0); /* retain = false */
}
Task principal
void app_main(void) {
wifi_init();
vTaskDelay(pdMS_TO_TICKS(2000)); /* esperar conexión */
mqtt_init();
float temp, hum;
for (;;) {
if (dht22_read(&temp, &hum) == ESP_OK) {
publish_sensor_data(temp, hum);
}
vTaskDelay(pdMS_TO_TICKS(5000));
}
}
Broker Mosquitto en la mini PC
Si tienes Mosquitto instalado en tu servidor, suscríbete para ver los datos:
mosquitto_sub -h localhost -t "/firmware-factory/sensores" -v