🛠 Publier et s'abonner en MQTT avec PubSubClient

ESP8266 (module ESP-12E) · intermediaire · Schéma : IMG-esp8266-esp-12e-intermediaire-3-esp8266-mqtt-pubsub.svg — Module ESP8266-ESP-12E connecté via Wi-Fi à un broker MQTT sur le réseau local, échanges sur les sujets esp12e/rssi et esp12e/led, LED sur GPIO2.

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels