Découvrez comment publier les relevés de température et d’humidité d’un capteur DHT11 ou DHT22 via MQTT avec le NodeMCU ESP8266 sur n’importe quelle plate-forme prenant en charge MQTT ou n’importe quel client MQTT. Par exemple, nous publierons les lectures des capteurs sur le tableau de bord Node-RED et l’ESP8266 sera programmé à l’aide de l’IDE Arduino.

Lecture recommandée: Qu’est-ce que MQTT et comment ça marche
Aperçu du projet
Le diagramme suivant montre une vue d’ensemble de haut niveau du projet que nous allons construire.

- L’ESP8266 demande des lectures de température et d’humidité au capteur DHT11 ou DHT22 ;
- Les relevés de température sont publiés dans le esp/dht/température sujet;
- Les mesures d’humidité sont publiées dans le esp/dht/humidité sujet;
- Node-RED est abonné à ces sujets ;
- Node-RED reçoit les lectures des capteurs et les affiche sur des jauges ;
- Vous pouvez recevoir les lectures sur n’importe quelle autre plate-forme prenant en charge MQTT et gérer les lectures comme vous le souhaitez.
Conditions préalables
Avant de poursuivre ce didacticiel, assurez-vous de vérifier les prérequis suivants.
EDI Arduino
Nous allons programmer l’ESP8266 à l’aide de l’IDE Arduino, alors assurez-vous que le module complémentaire ESP8266 est installé.
Courtier MQTT

Pour utiliser MQTT, vous avez besoin d’un courtier. Nous utiliserons Courtier Moustique installé sur un Raspberry Pi. Lisez Comment installer Mosquitto Broker sur Raspberry Pi.
Vous pouvez utiliser n’importe quel autre broker MQTT, y compris un broker cloud MQTT. Nous vous montrerons comment faire cela dans le code plus tard.
Si vous n’êtes pas familier avec MQTT, assurez-vous de lire notre tutoriel d’introduction : Qu’est-ce que MQTT et comment ça marche.
Bibliothèques MQTT
Pour utiliser MQTT avec l’ESP8266, nous utiliserons le Bibliothèque cliente MQTT asynchrone.
Installation de la bibliothèque cliente MQTT asynchrone
- Cliquez ici pour télécharger la bibliothèque client Async MQTT. Vous devriez avoir un dossier .zip dans votre dossier Téléchargements
- Décompressez le dossier .zip et vous devriez obtenir async-mqtt-client-maître dossier
- Renommez votre dossier de
async-mqtt-client-maîtreà async_mqtt_client - Bouge le async_mqtt_client dossier dans le dossier des bibliothèques d’installation de votre IDE Arduino
- Enfin, rouvrez votre IDE Arduino
Alternativement, vous pouvez aller à Esquisser > Inclure la bibliothèque > Ajouter . ZIP *: FRANÇAIS bibliothèque et sélectionnez la bibliothèque que vous venez de télécharger.
Installation de la bibliothèque ESPAsync TCP
Pour utiliser MQTT avec l’ESP8266, vous avez également besoin du Bibliothèque ESPAsync TCP.
- Cliquez ici pour télécharger la bibliothèque client ESPAsync TCP. Vous devriez avoir un dossier .zip dans votre dossier Téléchargements
- Décompressez le dossier .zip et vous devriez obtenir ESPAsyncTCP-maître dossier
- Renommez votre dossier de
ESPAsyncTCP-maîtreà ESPAsyncTCP - Bouge le ESPAsyncTCP dossier dans le dossier des bibliothèques d’installation de votre IDE Arduino
- Enfin, rouvrez votre IDE Arduino
Alternativement, vous pouvez aller à Esquisser > Inclure la bibliothèque > Ajouter . ZIP *: FRANÇAIS bibliothèque et sélectionnez la bibliothèque que vous venez de télécharger.
Bibliothèques de capteurs DHT
Pour lire à partir du capteur DHT, nous utiliserons le Bibliothèque DHT d’Adafruit. Pour utiliser cette bibliothèque, vous devez également installer le Bibliothèque de capteurs unifiés Adafruit. Suivez les étapes suivantes pour installer ces bibliothèques.
1. Ouvrez votre IDE Arduino et accédez à Esquisser > Inclure la bibliothèque > Gérer les bibliothèques. Le gestionnaire de bibliothèque devrait s’ouvrir.
2. Recherchez « DHT » dans la zone de recherche et installez la bibliothèque DHT d’Adafruit.

3. Après avoir installé la bibliothèque DHT d’Adafruit, tapez « Capteur unifié Adafruit” dans le champ de recherche. Faites défiler vers le bas pour trouver la bibliothèque et installez-la.

Après avoir installé les bibliothèques, redémarrez votre IDE Arduino.
Pièces requises
Pour ce tutoriel, vous avez besoin des pièces suivantes :
Vous pouvez utiliser les liens précédents ou accéder directement à MakerAdvisor.com/tools pour trouver toutes les pièces pour vos projets au meilleur prix !
Diagramme schématique
Câblez le DHT11 ou DHT22 à l’ESP8266 comme indiqué dans le schéma suivant avec la broche de données connectée à GPIO 14.

Noter: si vous avez un capteur DHT dans une carte de dérivation, il est livré avec seulement trois broches et avec une résistance de rappel interne sur la broche 2, vous n’avez donc pas besoin de connecter la résistance. Il vous suffit de câbler VCC, les données et GND.
Dans cet exemple, nous connectons la broche de données DHT à GPIO 14. Cependant, vous pouvez utiliser n’importe quelle autre broche numérique appropriée.
Apprenez à utiliser les GPIO ESP8266 avec notre guide : Référence de brochage ESP8266 : Quelles broches GPIO devez-vous utiliser ?
Code
Copiez le code suivant dans votre IDE Arduino. Pour que cela fonctionne pour vous, vous devez insérer vos informations d’identification réseau ainsi que les détails du courtier MQTT.
/*
Rui Santos
Complete project details at https://Raspberryme.com/esp8266-nodemcu-mqtt-publish-dht11-dht22-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <AsyncMqttClient.h>
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
// Raspberri Pi Mosquitto MQTT Broker
#define MQTT_HOST IPAddress(192, 168, 1, XXX)
// For a cloud MQTT broker, type the domain name
//#define MQTT_HOST "example.com"
#define MQTT_PORT 1883
// Temperature MQTT Topics
#define MQTT_PUB_TEMP "esp/dht/temperature"
#define MQTT_PUB_HUM "esp/dht/humidity"
// Digital pin connected to the DHT sensor
#define DHTPIN 14
// Uncomment whatever DHT sensor type you're using
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor
DHT dht(DHTPIN, DHTTYPE);
// Variables to hold sensor readings
float temp;
float hum;
AsyncMqttClient mqttClient;
Ticker mqttReconnectTimer;
WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;
unsigned long previousMillis = 0; // Stores last time temperature was published
const long interval = 10000; // Interval at which to publish sensor readings
void connectToWifi() {
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}
void onWifiConnect(const WiFiEventStationModeGotIP& event) {
Serial.println("Connected to Wi-Fi.");
connectToMqtt();
}
void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
Serial.println("Disconnected from Wi-Fi.");
mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
wifiReconnectTimer.once(2, connectToWifi);
}
void connectToMqtt() {
Serial.println("Connecting to MQTT...");
mqttClient.connect();
}
void onMqttConnect(bool sessionPresent) {
Serial.println("Connected to MQTT.");
Serial.print("Session present: ");
Serial.println(sessionPresent);
}
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
Serial.println("Disconnected from MQTT.");
if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}
}
/*void onMqttSubscribe(uint16_t packetId, uint8_t qos) {
Serial.println("Subscribe acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
Serial.print(" qos: ");
Serial.println(qos);
}
void onMqttUnsubscribe(uint16_t packetId) {
Serial.println("Unsubscribe acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}*/
void onMqttPublish(uint16_t packetId) {
Serial.print("Publish acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}
void setup() {
Serial.begin(115200);
Serial.println();
dht.begin();
wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
//mqttClient.onSubscribe(onMqttSubscribe);
//mqttClient.onUnsubscribe(onMqttUnsubscribe);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
// If your broker requires authentication (username and password), set them below
//mqttClient.setCredentials("REPlACE_WITH_YOUR_USER", "REPLACE_WITH_YOUR_PASSWORD");
connectToWifi();
}
void loop() {
unsigned long currentMillis = millis();
// Every X number of seconds (interval = 10 seconds)
// it publishes a new MQTT message
if (currentMillis - previousMillis >= interval) {
// Save the last time a new reading was published
previousMillis = currentMillis;
// New DHT sensor readings
hum = dht.readHumidity();
// Read temperature as Celsius (the default)
temp = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
//temp = dht.readTemperature(true);
// Publish an MQTT message on topic esp/dht/temperature
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temp).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId: %i ", MQTT_PUB_TEMP, packetIdPub1);
Serial.printf("Message: %.2f \n", temp);
// Publish an MQTT message on topic esp/dht/humidity
uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(hum).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId %i: ", MQTT_PUB_HUM, packetIdPub2);
Serial.printf("Message: %.2f \n", hum);
}
}
Comment fonctionne le code
La section suivante importe toutes les bibliothèques requises.
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <AsyncMqttClient.h>
Incluez vos informations d’identification réseau sur les lignes suivantes.
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
Insérez l’adresse IP du Raspberry Pi, afin que l’ESP8266 se connecte à votre courtier.
#define MQTT_HOST IPAddress(192, 168, 1, 106)
Si vous utilisez un courtier cloud MQTT, insérez le nom de domaine du courtier, par exemple :
#define MQTT_HOST "example.com"
Définissez le port MQTT.
#define MQTT_PORT 1883
La température et l’humidité seront publiées sur les sujets suivants :
#define MQTT_PUB_TEMP "esp/dht/temperature"
#define MQTT_PUB_HUM "esp/dht/humidity"
Définissez le GPIO auquel la broche de données du capteur DHT est connectée. Dans notre cas, il est lié à GPIO 14.
#define DHTPIN 14
Décommentez le type de capteur DHT que vous utilisez. Dans notre exemple, nous utilisons le DHT22.
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
Initialisez le capteur DHT sur la broche et le type définis précédemment.
DHT dht(DHTPIN, DHTTYPE);
le temp et Hum les variables contiendront les valeurs de température et d’humidité du capteur DHT22.
float temp;
float hum;
Créé un AsyncMqttClientAsyncMqttClient objet appelé mqttClient pour gérer le client MQTT et les minuteurs pour se reconnecter à votre courtier et routeur MQTT lorsqu’il se déconnecte.
AsyncMqttClient mqttClient;
Ticker mqttReconnectTimer;
WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;
Ensuite, créez des variables de minuterie auxiliaires pour publier les lectures toutes les 10 secondes. Vous pouvez modifier le temps de retard sur le intervalle variable.
unsigned long previousMillis = 0; // Stores last time temperature was published
const long interval = 10000; // Interval at which to publish sensor readings
Noter: les DHT11 et DHT22 ont un faible taux d’échantillonnage. Vous ne pouvez demander des lectures DHT11 que toutes les secondes, ou toutes les deux secondes pour le DHT22.
Fonctions MQTT : connexion au Wi-Fi, connexion au MQTT et événements Wi-Fi
Nous n’avons ajouté aucun commentaire aux fonctions définies dans la section de code suivante. Ces fonctions sont fournies avec la bibliothèque Async Mqtt Client. Les noms des fonctions sont assez explicites.
Par exemple, le connectToWifi() connecte votre ESP8266 à votre routeur :
void connectToWifi() {
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}
le connectToMqtt() connecte votre ESP8266 à votre broker MQTT :
void connectToMqtt() {
Serial.println("Connecting to MQTT...");
mqttClient.connect();
}
le onMqttConnect() La fonction s’exécute après le démarrage d’une session avec le courtier.
void onMqttConnect(bool sessionPresent) {
Serial.println("Connected to MQTT.");
Serial.print("Session present: ");
Serial.println(sessionPresent);
}
Fonctions MQTT : déconnecter et publier
Si l’ESP8266 perd la connexion avec le courtier MQTT, il appelle le onMqttDisconnect fonction qui imprime ce message dans le moniteur série.
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
Serial.println("Disconnected from MQTT.");
if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}
}
Lorsque vous publiez un message dans un sujet MQTT, le onMqttPublish() fonction est appelée. Il imprime l’identifiant du paquet dans le moniteur série.
void onMqttPublish(uint16_t packetId) {
Serial.print("Publish acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}
Fondamentalement, toutes ces fonctions que nous venons de mentionner sont des fonctions de rappel. Ils sont donc exécutés de manière asynchrone.
mettre en place()
Passons maintenant à la mettre en place(). Initialiser le capteur DHT.
dht.begin();
Les deux lignes suivantes créent des gestionnaires qui permettront à la fois au courtier MQTT et à la connexion Wi-Fi de se reconnecter, au cas où la connexion serait perdue.
wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
Enfin, attribuez toutes les fonctions de rappel. Cela signifie que ces fonctions seront exécutées automatiquement en cas de besoin. Par exemple, lorsque l’ESP8266 se connecte au courtier, il appelle automatiquement le onMqttConnect() fonction, et ainsi de suite.
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
//mqttClient.onSubscribe(onMqttSubscribe);
//mqttClient.onUnsubscribe(onMqttUnsubscribe);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
Authentification du courtier
Si votre courtier requiert une authentification, décommentez la ligne suivante et insérez vos informations d’identification (nom d’utilisateur et mot de passe).
mqttClient.setCredentials("REPlACE_WITH_YOUR_USER", "REPLACE_WITH_YOUR_PASSWORD");
Enfin, connectez-vous au Wi-Fi.
connectToWifi();
boucler()
Dans le boucler(), vous créez une minuterie qui vous permettra d’obtenir de nouvelles lectures de température et d’humidité du capteur DHT et de les publier sur le sujet correspondant toutes les 10 secondes.
unsigned long currentMillis = millis();
// Every X number of seconds (interval = 10 seconds)
// it publishes a new MQTT message
if (currentMillis - previousMillis >= interval) {
// Save the last time a new reading was published
previousMillis = currentMillis;
// New DHT sensor readings
hum = dht.readHumidity();
// Read temperature as Celsius (the default)
temp = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
//temp = dht.readTemperature(true);
Publication dans des rubriques
Pour publier les lectures sur les sujets MQTT correspondants, utilisez les lignes suivantes :
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temp).c_str());
uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(hum).c_str());
En gros, utilisez le publier() méthode sur la mqttClient objet de publier des données sur un sujet. le publier() La méthode accepte les arguments suivants, dans l’ordre :
- Rubrique MQTT (const char*)
- QoS (uint8_t) : qualité de service – elle peut être de 0, 1 ou 2
- retenir l’indicateur (bool): conserver l’indicateur
- charge utile (const char*) – dans ce cas, la charge utile correspond à la lecture du capteur
La QoS (qualité de service) est un moyen de garantir que le message est délivré. Il peut s’agir de l’un des niveaux suivants :
- 0: le message sera délivré une fois ou pas du tout. Le message n’est pas acquitté. Il n’y a aucune possibilité de messages en double ;
- 1: le message sera délivré au moins une fois, mais peut être délivré plus d’une fois ;
- 2: le message est toujours livré exactement une fois ;
- En savoir plus sur la qualité de service MQTT.
Téléchargement du code
Avec votre Raspberry Pi allumé et exécutant le courtier Mosquitto MQTT, téléchargez le code sur votre ESP8266.
Ouvrez le moniteur série à un débit en bauds de 115200 et vous verrez que l’ESP8266 commence à publier des messages sur les sujets que nous avons définis précédemment.

Préparation du tableau de bord Node-RED
L’ESP8266 publie des lectures de température toutes les 10 secondes sur le esp/dht/température et esp/dht/humidité les sujets. Désormais, vous pouvez utiliser n’importe quel tableau de bord prenant en charge MQTT ou tout autre appareil prenant en charge MQTT pour vous abonner à ces rubriques et recevoir les lectures.
À titre d’exemple, nous allons créer un flux simple à l’aide de Node-RED pour vous abonner à ces sujets et afficher les lectures sur les jauges.
Si vous n’avez pas installé Node-RED, suivez les tutoriels suivants :
Avec Node-RED en cours d’exécution sur votre Raspberry Pi, accédez à l’adresse IP de votre Raspberry Pi suivie de :1880.
http://raspberry-pi-ip-address:1880
L’interface Node-RED devrait s’ouvrir. Faites glisser deux nœuds MQTT dans les nœuds et deux nœuds de jauge vers le flux.

Cliquez sur le nœud MQTT et modifiez ses propriétés.

Le champ Serveur fait référence au courtier MQTT. Dans notre cas, le courtier MQTT est le Raspberry Pi, il est donc défini sur localhost:1883. Si vous utilisez un courtier Cloud MQTT, vous devez modifier ce champ.
Insérez le sujet auquel vous souhaitez vous abonner et la QoS. Ce nœud MQTT précédent est abonné au esp/dht/température sujet.
Cliquez sur l’autre nœud MQTT dans et modifiez ses propriétés avec le même serveur, mais pour l’autre sujet : esp/dht/humidité.
Cliquez sur les nœuds de la jauge et modifiez ses propriétés pour chaque lecture. Le nœud suivant est défini pour les relevés de température. Modifiez l’autre nœud du graphique pour les relevés d’humidité.

Câblez vos nœuds comme indiqué ci-dessous :

Enfin, déployez votre flux (appuyez sur le bouton dans le coin supérieur droit).

Alternativement, vous pouvez aller à Menu > Importer et copiez ce qui suit dans votre Presse-papiers pour créer votre flux Node-RED.
[{"id":"59f95d85.b6f0b4","type":"mqtt in","z":"b01416d3.f69f38","name":"","topic":"esp/dht/temperature","qos":"1","datatype":"auto","broker":"8db3fac0.99dd48","x":910,"y":340,"wires":[["2babfd19.559212"]]},{"id":"2babfd19.559212","type":"ui_gauge","z":"b01416d3.f69f38","name":"","group":"37de8fe8.46846","order":2,"width":0,"height":0,"gtype":"gage","title":"Temperature","label":"ºC","format":"{{value}}","min":0,"max":"40","colors":["#00b500","#f7df09","#ca3838"],"seg1":"","seg2":"","x":1210,"y":340,"wires":[]},{"id":"b9aa2398.37ca3","type":"mqtt in","z":"b01416d3.f69f38","name":"","topic":"esp/dht/humidity","qos":"1","datatype":"auto","broker":"8db3fac0.99dd48","x":900,"y":420,"wires":[["d0f75e86.1c9ae"]]},{"id":"d0f75e86.1c9ae","type":"ui_gauge","z":"b01416d3.f69f38","name":"","group":"37de8fe8.46846","order":2,"width":0,"height":0,"gtype":"gage","title":"Humidity","label":"%","format":"{{value}}","min":"30","max":"100","colors":["#53a4e6","#1d78a9","#4e38c9"],"seg1":"","seg2":"","x":1200,"y":420,"wires":[]},{"id":"8db3fac0.99dd48","type":"mqtt-broker","z":"","name":"","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"37de8fe8.46846","type":"ui_group","z":"","name":"BME280","tab":"53b8c8f9.cfbe48","order":1,"disp":true,"width":"6","collapse":false},{"id":"53b8c8f9.cfbe48","type":"ui_tab","z":"","name":"Home","icon":"dashboard","order":2,"disabled":false,"hidden":false}]
Manifestation
Accédez à votre adresse IP Raspberry Pi suivie de :1880/ui.
http://raspberry-pi-ip-address:1880/ui
Vous devriez avoir accès aux relevés de température et d’humidité DHT actuels sur le tableau de bord. Vous pouvez utiliser d’autres nœuds de type tableau de bord pour afficher les lectures de différentes manières.

C’est ça! Votre carte ESP8266 publie les relevés de température et d’humidité DHT sur Node-RED via MQTT.
Conclusion
MQTT est un excellent protocole de communication pour échanger de petites quantités de données entre appareils. Dans ce didacticiel, vous avez appris à publier les lectures de température et d’humidité d’un capteur DHT avec l’ESP8266 sur différents sujets MQTT. Ensuite, vous pouvez utiliser n’importe quel appareil ou plate-forme domotique pour vous abonner à ces sujets et recevoir les lectures.
Au lieu d’un DHT, vous pouvez utiliser n’importe quel capteur différent :
Nous espérons que vous avez trouvé ce tutoriel utile. Si vous souhaitez en savoir plus sur l’ESP8266, consultez nos ressources :
Merci d’avoir lu.

