Arduino - MQTT

Dans ce tutoriel, nous apprendrons comment utiliser Arduino pour envoyer/recevoir des données à un courtier MQTT en utilisant le protocole MQTT. En détail, nous apprendrons :

Arduino MQTT

Nous explorerons deux cas d'utilisation différents :

Préparation du matériel

1×Arduino UNO R4 WiFi
1×USB Cable Type-C
1×(Optional) 9V Power Adapter for Arduino
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

En supposant que vous êtes déjà familier avec le protocole MQTT. Sinon, veuillez effectuer des recherches sur Internet. Ce tutoriel se concentre sur la programmation d'Arduino pour envoyer et recevoir des données en utilisant le protocole MQTT.

Voici des cas d'utilisation de l'Arduino avec MQTT :

  • Arduino se connecte à un courtier MQTT en ligne, par exemple : courtier Mosquitto en ligne, AWS IoT...
  • Arduino se connecte à un courtier MQTT installé sur votre PC, par exemple : courtier Mosquitto, courtier HiveMQ
  • Arduino se connecte à un courtier MQTT installé sur votre Raspberry Pi, par exemple : courtier Mosquitto
  • Arduino se connecte à un courtier MQTT installé sur le cloud, par exemple : courtier Mosquitto ou HiveMQ sur AWS EC2

Dans ce tutoriel, nous commencerons par vérifier rapidement si Arduino peut se connecter à un courtier Mosquitto en ligne. Arduino publiera et s'abonnera à ce courtier via Internet.

Ensuite, nous passerons à l'installation du courtier Mosquitto sur notre PC. Nous connecterons ensuite l'Arduino au courtier MQTT installé sur notre PC, continuant à publier et à souscrire des données via ce courtier local.

Une fois ce tutoriel terminé, vous pourrez approfondir vos connaissances en apprenant à utiliser Arduino avec MQTT dans les tutoriels suivants :

Connectez Arduino à un courtier MQTT en ligne

Dans cette partie, nous apprendrons à connecter Arduino à test.mosquitto.org, un courtier MQTT en ligne créé par Mosquitto. Veuillez noter que ce courtier doit être utilisé uniquement à des fins de test.

Code Arduino

Le code Arduino ci-dessous fait :

  • Se connecter au courtier MQTT
  • S'abonner à un sujet
  • Publier périodiquement des messages sur le même sujet auquel il est abonné
/* * 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-mqtt */ #include <WiFiS3.h> #include <MQTTClient.h> #include <ArduinoJson.h> 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 int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "YOUR-NAME-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 PUBLISH_TOPIC[] = "YOUR-NAME-arduino-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-arduino-001/loopback"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); 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(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); 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 messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("Arduino - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Étapes rapides

  • Si c'est la première fois que vous utilisez Arduino Uno R4, consultez comment configurer l'environnement pour Arduino Uno R4 sur Arduino IDE.
  • Ouvrez Arduino IDE sur votre PC
  • Ouvrez le Gestionnaire de bibliothèques en cliquant sur l'icône Gestionnaire de bibliothèques dans la barre de navigation gauche de l'IDE Arduino
  • 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 ArduinoJson dans la boîte de recherche, puis cherchez la bibliothèque ArduinoJson de Benoit Blanchon.
  • Cliquez sur le bouton Install pour installer la bibliothèque ArduinoJson.
Bibliothèque Json Arduino
  • Copiez le code ci-dessus et ouvrez-le avec Arduino IDE.
  • Remplacez les informations WiFi (SSID et mot de passe) dans le code par les vôtres.
  • Dans le code, vous verrez le mot 'YOUR-NAME' trois fois. Remplacez ce mot par votre nom ou des caractères aléatoires (uniquement des caractères alphabétiques, sans espaces). Ceci est nécessaire car si vous ne faites pas le changement, il pourrait y avoir plusieurs personnes exécutant ce code en même temps, ce qui pourrait entraîner des conflits car les identifiants et les sujets des clients MQTT sont les mêmes pour tout le monde.
  • Cliquez sur le bouton Upload sur l'Arduino IDE pour téléverser le code sur Arduino.
  • Ouvrez le Moniteur Série.
  • Voir le résultat sur le Moniteur Série.
COM6
Send
IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: YOUR-NAME-arduino-001/loopback Arduino - MQTT broker Connected! Arduino - sent to MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload:{"timestamp":11757,"data":255} Arduino - received from MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload: {"timestamp":11757,"data":255} Arduino - sent to MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload:{"timestamp":16896,"data":259} Arduino - received from MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Comme vous pouvez le voir, Arduino publie des messages vers le courtier MQTT, puis reçoit le même message en retour. Cela est dû au fait que le code ci-dessus s'abonne au même sujet sur lequel il publie des données. Si vous ne souhaitez pas qu'Arduino reçoive le message qu'il publie, il suffit de rendre le sujet de SOUSCRIPTION différent du sujet de PUBLICATION.

Connectez Arduino au courtier MQTT installé sur votre PC

Installation du courtier MQTT Mosquitto

  • Téléchargez le Mosquitto MQTT Broker
  • Installez-le sur le lecteur D: au lieu du lecteur C:. Évitez d'installer le courtier Mosquitto sur le lecteur C: pour prévenir les problèmes potentiels.

Exécuter le courtier MQTT Mosquitto

Vérifions maintenant si le courtier MQTT fonctionne correctement en suivant ces étapes :

  • Accédez au répertoire où Mosquitto a été installé. Par exemple : D:\Draft\mosquitto>
  • Créez un nouveau fichier nommé test.conf, copiez le contenu ci-dessous et enregistrez-le dans ce répertoire :
listener 1883 allow_anonymous true
  • Exécutez une invite de commande en tant qu'administrateur sur votre PC. Appelons-la Fenêtre Broker. Ne la fermez pas jusqu'à la fin du tutoriel.
Invite de commande administrateur Windows
  • Exécutez les commandes ci-dessous une par une :
cd /d D:\Draft\mosquitto mosquitto -v -c test.conf
  • Vous verrez :
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto -v -c test.conf 1710918939: mosquitto version 2.0.18 starting 1710918939: Config loaded from test.conf. 1710918939: Opening ipv6 listen socket on port 1883. 1710918939: Opening ipv4 listen socket on port 1883. 1710918939: mosquitto version 2.0.18 running
  • Ouvrez une autre invite de commande en tant qu'administrateur sur votre PC.
  • Trouvez l'adresse IP de votre PC en exécutant la commande ci-dessous :
ipconfig
Command Prompt
C:\WINDOWS\system32>ipconfig Windows IP Configuration Ethernet adapter: Subnet Mask . . . . . . . . . . . : 255.0.0.0 IPv4 Address. . . . . . . . . . . : 192.168.0.26 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . :
  • Notez l'adresse IP pour une utilisation ultérieure. Dans l'exemple ci-dessus : 192.168.0.26

Tester si le Broker Mosquitto fonctionne

  • Ouvrez une autre invite de commande en tant qu'administrateur sur votre PC. Appelons-la Fenêtre Abonné
  • Abonnez-vous à un sujet en exécutant les commandes ci-dessous une par une (remplacez par votre adresse IP) :
cd /d D:\Draft\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send
  • Ouvrez une autre invite de commande en tant qu'administrateur sur votre PC. Appelons-la Fenêtre de l'éditeur
  • Publiez un message sur le même sujet en exécutant les commandes ci-dessous une à une (remplacez par votre adresse IP) :
cd /d D:\Draft\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/send -m "Hello, MQTT!"
  • Vous verrez :
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/send -m "Hello, MQTT!" D:\Draft\mosquitto>

Vous verrez que le message est transféré à la Fenêtre d'Abonné comme suit :

Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send Hello, MQTT!

Maintenant, vous avez installé avec succès le courtier MQTT Mosquitto sur votre PC. Veuillez NE PAS fermer trois fenêtres : Fenêtre du Courtier, Fenêtre de l'Abonné et Fenêtre de l'Éditeur. Nous les utiliserons ensuite.

Code Arduino

Le code Arduino ci-dessous effectue les opérations suivantes :

  • Se connecter au courtier MQTT
  • S'abonner à un sujet
  • Publier périodiquement des messages sur un autre sujet
/* * 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-mqtt */ #include <WiFiS3.h> #include <MQTTClient.h> #include <ArduinoJson.h> 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 PUBLISH_TOPIC[] = "arduino-001/send"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "arduino-001/receive"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); 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(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); 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 messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("Arduino - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); // You can process the incoming data as json object, then control something /* StaticJsonDocument<200> doc; deserializeJson(doc, payload); const char* message = doc["message"]; */ }

Étapes rapides

  • Copiez le code ci-dessus et ouvrez-le avec l'IDE Arduino
  • Remplacez les informations WiFi (SSID et mot de passe) dans le code par les vôtres.
  • Remplacez l'adresse du broker MQTT dans le code (nom de domaine ou adresse IP).
  • Cliquez sur le bouton Upload dans l'IDE Arduino pour téléverser le code vers Arduino.

Envoyer un message de l'Arduino au PC via MQTT

Les codes Arduino publient des données sur le sujet MQTT arduino-001/send, Fenêtre d'abonné sur PC s'abonne à ce sujet pour recevoir les données.

  • Ouvrez le moniteur série, vous verrez l'Arduino publier périodiquement un message à un sujet.
COM6
Send
IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: arduino-001/receive Arduino - MQTT broker Connected! Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":10708,"data":311} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":15837,"data":298} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":20965,"data":291} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Vérifiez la Fenêtre d'Abonné, vous verrez qu'elle reçoit le message publié par Arduino comme suit :
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

Envoyer un message du PC à l'Arduino via MQTT

Arduino souscrit au sujet arduino-001/receive, Fenêtre de l'éditeur sur PC publie un message sur ce sujet pour l'envoyer à l'Arduino.

  • Publiez un message sur le sujet auquel Arduino est abonné en exécutant la commande suivante dans la fenêtre de l'éditeur :
mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/receive -m "Hello, Arduino!"
  • Vous verrez que ce message est reçu par Arduino sur le moniteur série comme ci-dessous :
COM6
Send
Arduino - received from MQTT: - topic: arduino-001/receive - payload: Hello, Arduino!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Vidéo

※ 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!