Communication MQTT entre Arduino et Arduino

Dans ce tutoriel, nous allons apprendre :

communication entre deux Arduino via MQTT

Préparation du matériel

2×Arduino UNO R4 WiFi
2×USB Cable Type-C
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

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 d'Arduino et MQTT

Nous avons un tutoriel détaillé sur la manière d’utiliser Arduino avec MQTT ici :

Communication entre deux Arduino via MQTT

Deux cartes Arduino peuvent communiquer entre elles via un serveur MQTT. Si vous souhaitez que deux Arduinos communiquent directement sans utiliser de serveur MQTT, veuillez consulter le tutoriel sur la communication Client/Serveur TCP Arduino à Arduino.

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

  • Les deux Arduinos se connectent au courtier MQTT.
  • Pour que l'Arduino n°2 envoie des données à l'Arduino n°1 :
    • L'Arduino n°1 s'abonne à un sujet, par exemple : arduino-1/data.
    • L'Arduino n°2 peut envoyer des données à l'Arduino n°1 en publiant les données sur le sujet auquel l'Arduino n°1 est abonné.
  • De manière similaire, pour que l'Arduino n°1 envoie des données à l'Arduino n°2 :
    • L'Arduino n°2 s'abonne à un sujet, par exemple : arduino-2/data.
    • L'Arduino n°1 peut envoyer des données à l'Arduino n°2 en publiant les données sur le sujet auquel L'Arduino n°2 est abonné.

    En suivant cette méthode, deux Arduinos peuvent échanger des données de manière bidirectionnelle.

Exemple de cas d'utilisation

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

communication entre deux Arduino

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)

Protocole auto-défini

Définissons un protocole simple :

  • Arduino #1 et Arduino #2 se connectent au Broker MQTT (serveur MQTT)
  • Arduino #1 :
    • Arduino #1 publie un message MQTT sur un sujet lorsque l'état de l'interrupteur change.
    • Lorsque le bouton/interrupteur est mis en position on, la charge utile du message MQTT est 1.
    • Lorsque le bouton/interrupteur est mis en position off, la charge utile du message MQTT est 0.
  • Arduino #2 :
    • Arduino #2 s'abonne au sujet
    • Si Arduino #2 reçoit un message MQTT dont la charge utile est 1, il allume la LED
    • Si Arduino #2 reçoit un message MQTT dont la charge utile est 0, il éteint la LED

    Schéma de câblage

    • Schéma de câblage entre Arduino et bouton
    Schéma de câblage du bouton Arduino

    This image is created using Fritzing. Click to enlarge image

    • Arduino #2 - Schéma de câblage entre l'Arduino et la LED
    Schéma de câblage de LED Arduino

    This image is created using Fritzing. Click to enlarge image

Communication entre deux Arduino via MQTT

Code Arduino #1

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino 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/arduino/arduino-to-arduino-mqtt-communication */ // ARDUINO #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER #include <WiFiS3.h> #include <MQTTClient.h> #include <ezButton.h> const int BUTTON_PIN = 7; 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[] = "arduino-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 Arduino should publish/subscribe const char MQTT_TOPIC[] = "arduino/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("ARDUINO #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("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("Arduino - 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("Arduino - MQTT broker Timeout!"); return; } Serial.println("Arduino - MQTT broker Connected!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("Arduino - sent to MQTT:"); Serial.print("- topic: "); Serial.println(MQTT_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); }

Code Arduino #2

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino 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/arduino/arduino-to-arduino-mqtt-communication */ // ARDUINO #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER #include <WiFiS3.h> #include <MQTTClient.h> const int LED_PIN = 9; 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[] = "arduino-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 Arduino should publish/subscribe const char MQTT_TOPIC[] = "arduino/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ARDUINO #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("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("Arduino - 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("Arduino - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageReceived() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(MQTT_TOPIC); Serial.println("Arduino - MQTT broker Connected!"); } void messageReceived(String &topic, String &payload) { Serial.println("Arduino - 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

  • Connectez un bouton/interrupteur à Arduino #1
  • Connectez une LED à Arduino #2
  • Ouvrez Arduino IDE (nommé Arduino IDE #1)
  • Ouvrez une autre fenêtre Arduino IDE (nommé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 Arduino
  • Tapez ezButton dans la barre de recherche, puis trouvez la bibliothèque de boutons par ArduinoGetStarted.
  • Cliquez sur le bouton Install pour installer la bibliothèque ezButton.
Bibliothèque de boutons Arduino
  • Connectez Arduino #1 au PC via un câble USB et sélectionnez le port COM de Arduino #1 sur Arduino IDE #1
  • Connectez Arduino #2 au PC via un câble USB et sélectionnez le port COM de Arduino #2 sur Arduino IDE #2
  • Copiez le code de Arduino #1, collez-le dans Arduino IDE #1 et enregistrez-le (nommé Arduino-1)
  • Copiez le code de Arduino #2, collez-le dans Arduino IDE #2 et enregistrez-le (nommé Arduino-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éversez le code de Arduino #1 sur Arduino #1
  • Téléversez le code de Arduino #2 sur Arduino #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 Arduino #1 → observez l'état de la LED sur Arduino #2 (ON)
  • Relâchez le bouton sur Arduino #1 → observez l'état de la LED sur Arduino #2 (OFF)
  • Appuyez, maintenez et relâchez le bouton plusieurs fois.
  • Observez les sorties sur les deux moniteurs série
COM6
Send
Arduino #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER Arduino - Attempting to connect to SSID: YOUR_WIFI_SSID IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - MQTT broker Connected! - The button is pressed, send command: 1 Arduino - sent to MQTT: - topic: arduino/command - payload:1 - The button is released, send command: 0 Arduino - sent to MQTT: - topic: arduino/command - payload:0
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Moniteur série de Arduino #2
COM6
Send
Arduino #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER Arduino - Attempting to connect to SSID: YOUR_WIFI_SSID IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: arduino/command Arduino - MQTT broker Connected! Arduino - received from MQTT: - topic: arduino/command - payload: 1 - Received command: 1 => Turned LED on Arduino - received from MQTT: - topic: arduino/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!