🛠 Publier et s'abonner en MQTT avec PubSubClient
Objetivos
Conectar el ESP8266-ESP-12E a un broker MQTT (el protocolo rey de la domótica, muy ligero y perfectamente adaptado al chip) con la biblioteca PubSubClient. El módulo publica su RSSI cada 5 segundos en el tema «esp12e/rssi» y controla el LED integrado suscribiéndose a «esp12e/led» (mensajes ON/OFF). Se aprende el mantenimiento de la conexión (keepalive mediante mqtt.loop llamado regularmente), la reconexión manual cuando el broker desaparece y el aprovechamiento del callback de recepción. El broker puede ser Mosquitto en una Raspberry Pi o un NAS de la red local.
Material
- 1 módulo ESP8266-ESP-12E alimentado a 3,3 V (puntas ≥ 500 mA)
- 1 broker MQTT en la red (Mosquitto: sudo apt install mosquitto-clients para probar)
- Biblioteca Arduino «PubSubClient» (Nick O'Leary) instalada mediante el gestor de bibliotecas
- Red Wi-Fi de 2,4 GHz
Código completo
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* SSID = "mon-reseau";
const char* PASS = "mot-de-passe";
const char* BROKER = "192.168.1.50"; // IP du broker Mosquitto
const uint8_t LED = 2; // active-LOW
WiFiClient net;
PubSubClient mqtt(net);
unsigned long dernierePub = 0;
void callback(char* topic, byte* payload, unsigned int len) {
String msg = String((char*)payload).substring(0, len);
msg.toUpperCase;
if (String(topic) == "esp12e/led") {
digitalWrite(LED, msg == "ON" ? LOW : HIGH); // LOW = allumee
Serial.printf("LED -> %s\n", msg.c_str);
}
}
void connexion {
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASS);
while (WiFi.status != WL_CONNECTED) { delay(250); Serial.print("."); yield; }
while (!mqtt.connected) {
Serial.print("Connexion MQTT...");
if (mqtt.connect("esp12e-01")) { // client id unique sur le broker
Serial.println(" ok");
mqtt.subscribe("esp12e/led");
} else {
Serial.printf("echec rc=%d, retry 2s\n", mqtt.state);
delay(2000);
}
}
}
void setup {
Serial.begin(115200);
pinMode(LED, OUTPUT);
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(callback);
connexion;
}
void loop {
if (WiFi.status != WL_CONNECTED || !mqtt.connected) connexion;
mqtt.loop; // keepalive + réception, indispensable
if (millis - dernierePub > 5000) {
dernierePub = millis;
char buf[16];
snprintf(buf, sizeof(buf), "%d", WiFi.RSSI);
mqtt.publish("esp12e/rssi", buf);
}
delay(10);
}
Verificación esperada
Inicia el broker y luego el módulo: la consola muestra la conexión Wi-Fi y después «Conexión MQTT... ok». En el lado del broker, mosquitto_sub -t 'esp12e/#' debe mostrar un RSSI cada 5 segundos. Envía mosquitto_pub -t esp12e/led -m ON: el LED del módulo se enciende inmediatamente; «OFF» lo apaga. Detén el broker: el módulo muestra los fallos y luego se reconecta solo cuando el broker vuelve.
Errores frecuentes
- Olvidar mqtt.loop en loop: sin él, no hay keepalive (el broker desconecta tras 15 s) ni se reciben mensajes.
- Usar un delay de varios segundos: la conexión MQTT y la pila Wi-Fi se saturan; usa delay(10) o yield.
- Dos módulos con el mismo client id: el broker expulsa en bucle al primero de los dos («ping timeout»); asigna un id único a cada dispositivo.
- Poner la IP del broker en otra subred u olvidar abrir el puerto 1883 en el firewall del servidor.
- Publicar antes de la conexión: publish devuelve false mientras mqtt.connected sea falso; comprueba siempre el estado.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht11.inoArduinoluxmetre.inoArduinoserveur-web.inoArduino