Communication MQTT de ESP8266 à ESP8266

Dans ce tutoriel, nous couvrirons :

communication entre deux esp8266 via MQTT

Préparation du matériel

2×ESP8266 NodeMCU
2×Micro USB Cable
1×(Optional) ESP8266 Screw Terminal Adapter

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos de ESP8266 et MQTT

Nous avons un tutoriel détaillé sur comment utiliser ESP8266 avec MQTT ici :

Communication entre deux ESP8266 via MQTT

Deux cartes ESP8266 peuvent communiquer entre elles via un serveur MQTT. Si vous préférez une communication directe entre deux ESP8266 sans dépendre d'un serveur MQTT, veuillez consulter le tutoriel sur la communication TCP Client/Serveur entre deux ESP8266.

Lorsque ESP8266 #1 et ESP8266 #2 échangent des données via un courtier MQTT :

  • Les deux ESP8266 se connectent au courtier MQTT.
  • Pour permettre à ESP8266 #2 d'envoyer des données à ESP8266 #1 :
    • ESP8266 #1 s'abonne à un sujet, tel que : esp8266-1/data.
    • ESP8266 #2 peut transmettre des données à ESP8266 #1 en les publiant sur le sujet auquel ESP8266 #1 est abonné.
  • De même, pour permettre à ESP8266 #1 d'envoyer des données à ESP8266 #2 :
    • ESP8266 #2 s'abonne à un sujet, comme : esp8266-2/data.
    • ESP8266 #1 peut envoyer des données à ESP8266 #2 en les publiant sur le sujet auquel ESP8266 #2 est abonné.

    En suivant cette approche, deux ESP8266 peuvent échanger des données de manière bidirectionnelle.

Exemple de Cas d’Utilisation

Réalisons l'application suivante : un bouton/interrupteur connecté à ESP8266 #1 contrôle une LED connectée à ESP8266 #2 via MQTT.

communication entre deux esp8266

Comme mentionné ci-dessus, il existe certains protocoles d'application que nous pouvons utiliser. Dans cet exemple, pour simplifier, nous allons définir un protocole par nous-mêmes (un protocole auto-défini).

Comment ça marche

Définissons un protocole simple :

  • Les ESP8266 #1 et ESP8266 #2 se connectent à un courtier MQTT (serveur MQTT).
  • Pour ESP8266 #1 :
    • ESP8266 #1 publie un message MQTT sur un sujet spécifique chaque fois que l'état d'un interrupteur change.
    • Lorsque le bouton/interrupteur est activé, la charge utile du message MQTT est définie à 1.
    • Lorsque le bouton/interrupteur est désactivé, la charge utile du message MQTT est définie à 0.
  • Pour ESP8266 #2 :
    • ESP8266 #2 s'abonne au même sujet.
    • Si ESP8266 #2 reçoit un message MQTT avec une charge utile de 1, il active la LED.
    • Si ESP8266 #2 reçoit un message MQTT avec une charge utile de 0, il désactive la LED.

    Schéma de câblage

    • ESP8266 #1 - Schéma de câblage entre l'ESP8266 et le bouton
    Schéma de câblage du bouton ESP8266 NodeMCU

    This image is created using Fritzing. Click to enlarge image

    Voir plus dans l'agencement des broches de l'ESP8266 et comment alimenter l'ESP8266 et d'autres composants.

    • Schéma de câblage entre ESP8266 et LED
    Schéma de câblage LED ESP8266 NodeMCU

    This image is created using Fritzing. Click to enlarge image

Communication entre deux ESP8266 via MQTT

Code ESP8266 #1

/* * Ce code ESP8266 NodeMCU a été développé par newbiely.fr * Ce code ESP8266 NodeMCU est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp8266/esp8266-to-esp8266-mqtt-communication */ // ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN D7 // The ESP8266 pin connected to button const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS //const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp8266-001"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP8266 should publish/subscribe const char MQTT_TOPIC[] = "esp8266/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); ezButton button(BUTTON_PIN); // create ezButton that attach to pin 7 void setup() { Serial.begin(9600); button.setDebounceTime(100); // set debounce time to 100 milliseconds Serial.println("ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); button.loop(); // MUST call the loop() function first if (button.isPressed()) { Serial.println("- The button is pressed, send command: 1"); sendToMQTT('1'); } if (button.isReleased()) { Serial.println("- The button is released, send command: 0"); sendToMQTT('0'); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } Serial.println("ESP8266 - MQTT broker Connected!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(MQTT_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); }

Code ESP8266 #2

/* * Ce code ESP8266 NodeMCU a été développé par newbiely.fr * Ce code ESP8266 NodeMCU est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp8266/esp8266-to-esp8266-mqtt-communication */ // ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER #include <ESP8266WiFi.h> #include <MQTTClient.h> #define LED_PIN D6 // The ESP8266 pin connected to LED const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS //const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp8266-002"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP8266 should publish/subscribe const char MQTT_TOPIC[] = "esp8266/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageReceived); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageReceived() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(MQTT_TOPIC); Serial.println("ESP8266 - MQTT broker Connected!"); } void messageReceived(String &topic, String &payload) { Serial.println("ESP8266 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.print("- payload: "); Serial.println(payload); char command = payload[0]; if (command == '1') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => Turned LED on"); digitalWrite(LED_PIN, HIGH); // Turn LED on } else if (command == '0') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => Turned LED off"); digitalWrite(LED_PIN, LOW); // Turn LED off } else { Serial.print("- Received an unsupported command: "); Serial.println(command); } }

Étapes rapides

Pour commencer avec l'ESP8266 sur Arduino IDE, suivez ces étapes :

  • Consultez le tutoriel comment configurer l'environnement pour ESP8266 sur Arduino IDE si c'est votre première utilisation de l'ESP8266.
  • Câblez les composants comme indiqué dans le schéma.
  • Connectez la carte ESP8266 à votre ordinateur à l'aide d'un câble USB.
  • Ouvrez Arduino IDE sur votre ordinateur.
  • Choisissez la bonne carte ESP8266, comme par exemple NodeMCU 1.0 (module ESP-12E), et son port COM respectif.
  • Connectez un bouton/commutateur à ESP8266 #1
  • Connectez une LED à ESP8266 #2
  • Ouvrez Arduino IDE (appelé Arduino IDE #1)
  • Ouvrez une autre fenêtre Arduino IDE (appelée Arduino IDE #2) en cliquant sur l'icône Arduino IDE sur votre PC (important!(**))
  • Ouvrez le Gestionnaire de bibliothèques en cliquant sur l'icône Gestionnaire de bibliothèques dans la barre de navigation gauche de l'Arduino IDE
  • Tapez MQTT dans la boîte de recherche, puis recherchez la bibliothèque MQTT de Joel Gaehwiler.
  • Cliquez sur le bouton Install pour installer la bibliothèque MQTT.
Bibliothèque MQTT ESP8266 NodeMCU
  • Tapez ezButton dans la zone de recherche, puis trouvez la bibliothèque de boutons par ESP8266GetStarted.
  • Cliquez sur le bouton Install pour installer la bibliothèque ezButton.
Bibliothèque de boutons ESP8266 NodeMCU
  • Connectez ESP8266 #1 au PC via un câble USB et sélectionnez le port COM de ESP8266 #1 sur Arduino IDE #1
  • Connectez ESP8266 #2 au PC via un câble USB et sélectionnez le port COM de ESP8266 #2 sur Arduino IDE #2
  • Copiez le code de ESP8266 #1, collez-le dans Arduino IDE #1 et enregistrez-le (nommé ESP8266-1)
  • Copiez le code de ESP8266 #2, collez-le dans Arduino IDE #2 et enregistrez-le (nommé ESP8266-2)
  • Remplacez les informations WiFi (SSID et mot de passe) dans les deux codes par les vôtres.
  • Remplacez l'adresse du broker MQTT dans les deux codes (nom de domaine ou adresse IP).
  • Téléversez le code de ESP8266 #1 sur ESP8266 #1
  • Téléversez le code de ESP8266 #2 sur ESP8266 #2
  • Ouvrez le moniteur série sur Arduino IDE #1
  • Ouvrez le moniteur série sur Arduino IDE #2
  • Appuyez et maintenez le bouton sur ESP8266 #1 → observez l'état de la LED sur ESP8266 #2 (ON)
  • Relâchez le bouton sur ESP8266 #1 → observez l'état de la LED sur ESP8266 #2 (OFF)
  • Appuyez, maintenez et relâchez le bouton plusieurs fois.
  • Observez les sorties sur les deux moniteurs série
COM6
Send
ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - MQTT broker Connected! - The button is pressed, send command: 1 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:1 - The button is released, send command: 0 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:0
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Moniteur série de ESP8266 #2
COM6
Send
ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: esp8266/command ESP8266 - MQTT broker Connected! ESP8266 - received from MQTT: - topic: esp8266/command - payload: 1 - Received command: 1 => Turned LED on ESP8266 - received from MQTT: - topic: esp8266/command - payload: 0 - Received command: 0 => Turned LED off
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!