🛠 Publier et s'abonner en MQTT avec PubSubClient
Objectifs
Connecter l'ESP8266-ESP-12E à un broker MQTT (le protocole roi de la domotique, très léger et parfaitement adapté à la puce) avec la bibliothèque PubSubClient. Le module publie son RSSI toutes les 5 secondes sur le sujet « esp12e/rssi » et commande la LED embarquée en s'abonnant à « esp12e/led » (messages ON/OFF). On apprend le maintien de la connexion (keepalive via mqtt.loop appelé régulièrement), la reconnexion manuelle quand le broker disparaît, et l'exploitation du callback de réception. Le broker peut être Mosquitto sur un Raspberry Pi ou un NAS du réseau local.
Matériel
- 1 module ESP8266-ESP-12E alimenté en 3,3 V (pointes ≥ 500 mA)
- 1 broker MQTT sur le réseau (Mosquitto : sudo apt install mosquitto-clients pour tester)
- Bibliothèque Arduino « PubSubClient » (Nick O'Leary) installée via le gestionnaire de bibliothèques
- Réseau Wi-Fi 2,4 GHz
Code complet
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* SSID = "mon-réseau";
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("échec 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);
}
Vérification attendue
Lance le broker puis le module : la console affiche la connexion Wi-Fi puis « Connexion MQTT... ok ». Côté broker, mosquitto_sub -t 'esp12e/#' doit afficher un RSSI toutes les 5 secondes. Envoie mosquitto_pub -t esp12e/led -m ON : la LED du module s'allume immédiatement ; « OFF » l'éteint. Coupe le broker : le module affiche les échecs puis se reconnecte seul quand le broker revient.
Erreurs fréquentes
- Oublier mqtt.loop dans loop : sans lui, aucun keepalive (le broker déconnecte au bout de 15 s) et aucun message reçu.
- Mettre un delay de plusieurs secondes : la connexion MQTT et le stack Wi-Fi saturent, utilise delay(10) ou yield.
- Deux modules avec le même client id : le broker éjecte en boucle le premier des deux (« ping timeout »), donne un id unique à chaque appareil.
- Mettre l'IP du broker sur un autre sous-réseau ou oublier le port 1883 ouvert dans le pare-feu du serveur.
- Publier avant la connexion : publish renvoie false tant que mqtt.connected est faux, teste toujours l'état.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht11.inoArduinoluxmetre.inoArduinoserveur-web.inoArduino