Introduction
Ce guide technique détaille la mise en place d'un système de télémétrie environnementale utilisant un microcontrôleur ESP8266 (format NodeMCU) couplé à un capteur DHT11. L'objectif est de collecter les mesures de température et d'humidité, puis de les transmettre de manière asynchrone via le protocole MQTT vers un broker cloud. Le protocole MQTT est particulièrement adapté à ce cas d'usage IoT grâce à son overhead minimal et sa faible consommation énergétique, facilitant l'intégration avec les plateformes cloud modernes.
Prérequis Matériels et Logiciels
Composants Physiques
- 1x Carte de développement NodeMCU (ESP8266)
- 1x Capteur numérique de température et d'humidité DHT11
- 1x Plaque d'essai (Breadboard)
- Câbles de liaison (Jumper wires)
Le capteur DHT11 doit être connecté à la carte NodeMCU. La broche de données (DATA) du capteur est généralement reliée à la broche D4 (GPIO2) de l'ESP8266, avec une résistance de pull-up si le module du capteur ne l'intègre pas déjà.
Environnement de Développement
- Arduino IDE configuré avec le gestionnaire de cartes ESP8266.
- Pilote USB CH340G installé sur la machine hôte.
- Bibliothèque
PubSubClientpour la gestion du protocole MQTT. - Bibliothèque
DHT sensor librarypour l'interfaçage avec le capteur.
Configuration du Broker MQTT
Pour acheminer les données, un broker MQTT est nécessaire. Vous pouvez utiliser un broker public, un service cloud IoT (comme AWS IoT Core ou Azure IoT Hub) ou une instance auto-hébergée. Pour simplifier cette démonstration, nous utiliserons un broker accessible sur le port standard 1883. Note de sécurité : En environnement de production, il est impératif d'utiliser une connexion chiffrée (TLS/SSL sur le port 8883) et de configurer une authentification par certificat ou par mot de passe.
Implémentation du Firmware
Le code ci-dessous initialise la connexion Wi-Fi, établit le lien avec le broker MQTT, et publie les données du capteur à intervalles réguliers. Une logique de seuil a été ajoutée pour ne publier les données que si la variation dépasse un certain cap, optimisant ainsi la bande passante.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// Configuration des broches et identifiants
const uint8_t SENSOR_PIN = D4;
const char* WIFI_SSID = "VOTRE_SSID_WIFI";
const char* WIFI_PASS = "VOTRE_MOT_DE_PASSE_WIFI";
const char* MQTT_HOST = "votre.broker.mqtt.com";
const uint16_t MQTT_PORT = 1883;
const char* TOPIC_TEMP = "iot/sensors/dht11/temperature";
const char* TOPIC_HUM = "iot/sensors/dht11/humidity";
const char* CLIENT_ID = "esp8266_node_01";
// Paramètres du capteur et de la transmission
#define DHT_MODEL DHT11
#define READ_INTERVAL_MS 30000
#define VALUE_THRESHOLD 1.0
WiFiClient netClient;
PubSubClient mqttClient(netClient);
DHT envSensor(SENSOR_PIN, DHT_MODEL);
float lastTemp = 0.0;
float lastHum = 0.0;
unsigned long lastReadTime = 0;
void initWifi() {
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void maintainMqttConnection() {
if (!mqttClient.connected()) {
while (!mqttClient.connected()) {
if (mqttClient.connect(CLIENT_ID)) {
// Connexion établie
} else {
delay(5000);
}
}
}
}
bool hasValueChanged(float current, float previous) {
return abs(current - previous) >= VALUE_THRESHOLD;
}
void setup() {
Serial.begin(115200);
initWifi();
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
envSensor.begin();
}
void loop() {
maintainMqttConnection();
mqttClient.loop();
unsigned long currentTime = millis();
if (currentTime - lastReadTime >= READ_INTERVAL_MS) {
lastReadTime = currentTime;
float currentTemp = envSensor.readTemperature();
float currentHum = envSensor.readHumidity();
if (!isnan(currentTemp) && hasValueChanged(currentTemp, lastTemp)) {
lastTemp = currentTemp;
mqttClient.publish(TOPIC_TEMP, String(currentTemp).c_str(), true);
}
if (!isnan(currentHum) && hasValueChanged(currentHum, lastHum)) {
lastHum = currentHum;
mqttClient.publish(TOPIC_HUM, String(currentHum).c_str(), true);
}
}
}
Déploiement et Vérification
Connectez la carte NodeMCU à votre ordinateur via USB. Dans l'Arduino IDE, sélectionnez le port COM correspondant et téléversez le croquis. Ouvrez le moniteur série avec un débit de 115200 bauds. Vous devriez voir les tentatives de connexion Wi-Fi, suivies de l'établissement du lien MQTT. Si des erreurs surviennent, vérifiez les identifiants Wi-Fi et l'accessbiilité du broker MQTT.
Consommation des Données en Python
Pour valider la réception des messages, un script Python utilisant la bibliothèque paho-mqtt peut être exécuté sur une machine distante. Ce client s'abonne aux topics de température et d'humidité et affiche les charges utiles en temps réel.
import paho.mqtt.client as mqtt
BROKER_URL = "votre.broker.mqtt.com"
BROKER_PORT = 1883
SUBSCRIBE_TOPICS = [
("iot/sensors/dht11/temperature", 0),
("iot/sensors/dht11/humidity", 0)
]
def handle_connection(client, userdata, flags, rc):
if rc == 0:
client.subscribe(SUBSCRIBE_TOPICS)
def handle_message(client, userdata, msg):
payload = msg.payload.decode('utf-8')
print(f"Donnée reçue sur {msg.topic} : {payload}")
def start_listener():
mqtt_client = mqtt.Client()
mqtt_client.on_connect = handle_connection
mqtt_client.on_message = handle_message
mqtt_client.connect(BROKER_URL, BROKER_PORT, 60)
mqtt_client.loop_forever()
if __name__ == "__main__":
start_listener()