Dans ce tutoriel, nous couvrirons les sujets suivants :
Communication bidirectionnelle entre deux ESP32s utilisant MQTT.
Exemple d'application pratique : Utilisation d'un bouton ou d'un interrupteur connecté à ESP32 #1 pour contrôler une LED connectée à ESP32 #2 via MQTT.
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 ESP32 et MQTT
Nous disposons d'un tutoriel détaillé sur l'utilisation de l'ESP32 avec MQTT ici :
Deux cartes ESP32 peuvent communiquer entre elles via un serveur MQTT. Si vous souhaitez qu'elles communiquent directement sans utiliser de serveur MQTT, veuillez consulter le tutoriel sur la communication TCP Client/Serveur de ESP32 à ESP32.
Lorsque ESP32 #1 et ESP32 #2 échangent des données via un courtier MQTT :
Les deux ESP32 se connectent au courtier MQTT.
Pour permettre à l'ESP32 #2 d'envoyer des données à l'ESP32 #1 :
L'ESP32 #1 s'abonne à un sujet, par exemple : esp32-1/data.
L'ESP32 #2 peut envoyer des données à l'ESP32 #1 en publiant les données sur le sujet auquel l'ESP32 #1 est abonné.
De manière similaire, pour que l'ESP32 #1 envoie des données à l'ESP32 #2 :
L'ESP32 #2 s'abonne à un sujet, tel que : esp32-2/data.
L'ESP32 #1 peut envoyer des données à l'ESP32 #2 en publiant les données sur le sujet auquel l'ESP32 #2 est abonné.
En suivant cette méthode, deux ESP32 peuvent échanger des données de manière bidirectionnelle.
Exemple de cas d'utilisation
Réalisons l'application suivante : Un bouton/interrupteur connecté à ESP32 #1 contrôle une LED connectée à ESP32 #2 via MQTT.
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ême (un protocole auto-défini).
Comment ça marche
Définissons un protocole simple :
Les ESP32 #1 et ESP32 #2 se connectent à un courtier MQTT (serveur MQTT).
Pour le ESP32 #1 :
Il publie un message MQTT sur un sujet spécifique chaque fois que l'état d'un interrupteur change.
Lorsque le bouton/interrupteur est enclenché, la charge utile du message MQTT est définie sur 1.
Lorsque le bouton/interrupteur est éteint, la charge utile du message MQTT est définie sur 0.
Pour le ESP32 #2 :
Il s'abonne au même sujet.
Si le ESP32 #2 reçoit un message MQTT avec une charge utile de 1, il allume une LED.
Si le ESP32 #2 reçoit un message MQTT avec une charge utile de 0, il éteint la LED.
Schéma de câblage
Schéma de câblage entre l'ESP32 et le bouton
Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
Si vous ne savez pas comment alimenter l'ESP32 et d'autres composants, consultez les instructions dans le tutoriel suivant : Comment alimenter l'ESP32..
Schéma de câblage entre ESP32 et LED
Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
Communication entre deux ESP32 via MQTT
Code ESP32 #1
/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 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/esp32/esp32-to-esp32-mqtt-communication*/// ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER#include <WiFi.h>#include <MQTTClient.h>#include <ezButton.h>#define BUTTON_PIN 21 // ESP32 pin GPIO21 connected to buttonconstchar WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSIDconstchar WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORDconstchar 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 ADDRESSconstint MQTT_PORT = 1883;constchar MQTT_CLIENT_ID[] = "esp32-001"; // CHANGE IT AS YOU DESIREconstchar MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not requiredconstchar MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required// The MQTT topics that ESP32 should publish/subscribeconstchar MQTT_TOPIC[] = "esp32/command"; // CHANGE IT AS YOU DESIREWiFiClient network;MQTTClientmqtt = MQTTClient(256);ezButtonbutton(BUTTON_PIN); // create ezButton that attach to pin 7voidsetup() {Serial.begin(9600);button.setDebounceTime(100); // set debounce time to 100 millisecondsSerial.println("ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER");WiFi.mode(WIFI_STA);WiFi.begin(WIFI_SSID, WIFI_PASSWORD);Serial.println("ESP32 - Connecting to Wi-Fi");while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("."); }Serial.println(); connectToMQTT();}voidloop() {mqtt.loop();button.loop(); // MUST call the loop() function firstif (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 brokermqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network);Serial.print("ESP32 - 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("ESP32 - MQTT broker Timeout!");return; }Serial.println("ESP32 - MQTT broker Connected!");}void sendToMQTT(charcommand) {char messageBuffer[1]; messageBuffer[0] = command;mqtt.publish(MQTT_TOPIC, messageBuffer);Serial.println("ESP32 - sent to MQTT:");Serial.print("- topic: ");Serial.println(MQTT_TOPIC);Serial.print("- payload:");Serial.println(messageBuffer);}
Code ESP32 #2
/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 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/esp32/esp32-to-esp32-mqtt-communication*/// ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER#include <WiFi.h>#include <MQTTClient.h>#define LED_PIN 18 // ESP32 pin GPIO18 connected to LEDconstchar WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSIDconstchar WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORDconstchar 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 ADDRESSconstint MQTT_PORT = 1883;constchar MQTT_CLIENT_ID[] = "esp32-002"; // CHANGE IT AS YOU DESIREconstchar MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not requiredconstchar MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required// The MQTT topics that ESP32 should publish/subscribeconstchar MQTT_TOPIC[] = "esp32/command"; // CHANGE IT AS YOU DESIREWiFiClient network;MQTTClientmqtt = MQTTClient(256);voidsetup() {Serial.begin(9600);pinMode(LED_PIN, OUTPUT);Serial.println("ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER");WiFi.mode(WIFI_STA);WiFi.begin(WIFI_SSID, WIFI_PASSWORD);Serial.println("ESP32 - Connecting to Wi-Fi");while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("."); }Serial.println(); connectToMQTT();}voidloop() {mqtt.loop();}void connectToMQTT() {// Connect to the MQTT brokermqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network);// Create a handler for incoming messagesmqtt.onMessage(messageReceived);Serial.print("ESP32 - 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("ESP32 - MQTT broker Timeout!");return; }// Subscribe to a topic, the incoming messages are processed by messageReceived() functionif (mqtt.subscribe(MQTT_TOPIC))Serial.print("ESP32 - Subscribed to the topic: ");elseSerial.print("ESP32 - Failed to subscribe to the topic: ");Serial.println(MQTT_TOPIC);Serial.println("ESP32 - MQTT broker Connected!");}void messageReceived(String &topic, String &payload) {Serial.println("ESP32 - received from MQTT:");Serial.println("- topic: " + topic);Serial.print("- payload: ");Serial.println(payload);charcommand = payload[0];if (command == '1') {Serial.print("- Received command: ");Serial.print(command);Serial.println(" => Turned LED on");digitalWrite(LED_PIN, HIGH); // Turn LED on } elseif (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); }}
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.
Tapez ezButton dans la zone de recherche, puis trouvez la bibliothèque de boutons par ESP32GetStarted
Cliquez sur le bouton Install pour installer la bibliothèque ezButton.
Sélectionnez la bonne carte ESP32 (par exemple, Module de développement ESP32).
Connectez ESP32 #1 au PC via un câble USB et sélectionnez le port COM de ESP32 #1 sur Arduino IDE #1
Connectez ESP32 #2 au PC via un câble USB et sélectionnez le port COM de ESP32 #2 sur Arduino IDE #2
Copiez le code de ESP32 #1, collez-le dans Arduino IDE #1 et enregistrez-le (nommé ESP32-1)
Copiez le code de ESP32 #2, collez-le dans Arduino IDE #2 et enregistrez-le (nommé ESP32-2)
Remplacez les informations WiFi (SSID et mot de passe) dans les deux codes par les vôtres.
Remplacez l'adresse du courtier MQTT dans les deux codes (nom de domaine ou adresse IP).
Téléchargez le code de ESP32 #1 sur ESP32 #1
Téléchargez le code de ESP32 #2 sur ESP32 #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 ESP32 #1 → observez l'état de la LED sur ESP32 #2 (ON)
Relâchez le bouton sur ESP32 #1 → observez l'état de la LED sur ESP32 #2 (OFF)
Appuyez, maintenez et relâchez le bouton plusieurs fois.
Observez les sorties sur les deux moniteurs série.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER
ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID
ESP32 - Connecting to MQTT broker
ESP32 - MQTT broker Connected!
- The button is pressed, send command: 1
ESP32 - sent to MQTT:
- topic: esp32/command
- payload:1
- The button is released, send command: 0
ESP32 - sent to MQTT:
- topic: esp32/command
- payload:0
Ln 11, Col 1
ESP32 Dev Module on COM15
2
Moniteur série de ESP32 #2
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER
ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID
ESP32 - Connecting to MQTT broker
ESP32 - Subscribed to the topic: esp32/command
ESP32 - MQTT broker Connected!
ESP32 - received from MQTT:
- topic: esp32/command
- payload: 1
- Received command: 1 => Turned LED on
ESP32 - received from MQTT:
- topic: esp32/command
- payload: 0
- Received command: 0 => Turned LED off
N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !