// Inclusion des bibliothèques pour le capteur DHT, la connexion WiFi, le formatage JSON et la communication MQTT
#include <DHT_U.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#include "PubSubClient.h"
// Définition des broches auxquelles sont connectés le capteur DHT et la LED
#define DHTPIN 15 // Broche de données du capteur DHT
#define LED 13 // Broche de contrôle de la LED
// Définition du type de capteur DHT utilisé (DHT22 ou DHT11)
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE); // Initialisation du capteur DHT
// Informations de connexion au réseau WiFi
const char *ssid = "Wokwi-GUEST"; // Nom du réseau WiFi
const char *password = ""; // Mot de passe du réseau WiFi (vide si ouvert)
// Informations de connexion au serveur MQTT
const char *mqttServer = "broker.emqx.io"; // Adresse du serveur MQTT
const char *mqttUserName = ""; // Nom d'utilisateur pour le serveur MQTT (si nécessaire)
const char *mqttPwd = ""; // Mot de passe pour le serveur MQTT (si nécessaire)
const char *clientID = "poly_demo_mqtt"; // Identifiant unique du client MQTT
const char *topic = "demo/mesure"; // Topic MQTT sur lequel publier les mesures
// Variables pour stocker les valeurs actuelles et précédentes de température et d'humidité
String msgStr = "";
float temp, hum, lastHum, lastTemp;
// Initialisation des objets client pour la connexion WiFi et MQTT
WiFiClient espClient;
PubSubClient client(espClient);
// Fonction pour se connecter au réseau WiFi
void setup_wifi() {
delay(10); // Petite pause pour la stabilité
Serial.println("Tentative de connexion au WiFi");
WiFi.begin(ssid, password); // Démarre la connexion au réseau WiFi
// Boucle jusqu'à la connexion réussie au WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connexion : Tentative reussie!");
}
// Fonction pour se reconnecter au serveur MQTT si la connexion est perdue
void reconnect() {
Serial.println("Tentative de connexion au Serveur MQTT... ");
// Tente de se connecter jusqu'à réussite
while (!client.connected()) {
if (client.connect(clientID)) {
Serial.println("Connexion au serveur MQTT : Tentative reussie!");
// S'abonne à un topic MQTT pour recevoir des commandes, par exemple pour contrôler une LED
client.subscribe("poly/demo/Led");
} else {
Serial.print("Échec de la connexion au serveur MQTT");
delay(5000); // Attend 5 secondes avant de réessayer
}
}
}
// Fonction de rappel appelée lors de la réception de messages MQTT sur les topics souscrits
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Reception du message dont le Topic est : ");
Serial.println(topic);
Serial.print("Message : ");
String data = "";
// Assemble le message reçu en une chaîne de caractères
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
data += (char)payload[i];
}
Serial.println("");
// Actionne la LED en fonction du message reçu
if (data == "ON") {
digitalWrite(LED, HIGH); // Allume la LED si le message est "ON"
} else {
digitalWrite(LED, LOW); // Éteint la LED sinon
}
}
// Fonction setup exécutée une fois au démarrage du microcontrôleur
void setup() {
Serial.begin(115200); // Démarre la communication série
dht.begin(); // Initialise le capteur DHT
pinMode(LED, OUTPUT); // Configure la broche de la LED en sortie
digitalWrite(LED, LOW); // Assure que la LED est éteinte au démarrage
setup_wifi(); // Connecte le microcontrôleur au WiFi
client.setServer(mqttServer, 1883); // Configure le client MQTT avec les informations du serveur
client.setCallback(callback); // Définit la fonction de rappel pour les messages MQTT
}
// Fonction loop exécutée en boucle après le setup
void loop() {
bool publish = false; // Indicateur pour savoir si de nouvelles données doivent être publiées
// Tente de se reconnecter au serveur MQTT si la connexion est perdue
if (!client.connected()) {
reconnect();
}
client.loop(); // Nécessaire pour maintenir la connexion MQTT et gérer les messages entrants
// Lecture de la température et de l'humidité
temp = dht.readTemperature();
// Vérifie si la lecture est valide
if (isnan(temp)) {
Serial.println(F("Erreur lors de la lecture de la mesure de la température!"));
} else {
Serial.print(F("Température: "));
Serial.print(temp);
Serial.println(F("°C"));
// Vérifie si la température a changé depuis la dernière lecture
if (lastTemp != temp) {
publish = true; // Indique qu'une nouvelle mesure de température est disponible
}
lastTemp = temp; // Mémorise la dernière mesure de température
}
hum = dht.readHumidity();
// Vérifie si la lecture est valide
if (isnan(hum)) {
Serial.println(F("Erreur lors de la lecture de la mesure de l'humidité!"));
} else {
Serial.print(F("Humidité: "));
Serial.print(hum);
Serial.println(F("%"));
// Vérifie si l'humidité a changé depuis la dernière lecture
if (lastHum != hum) {
publish = true; // Indique qu'une nouvelle mesure d'humidité est disponible
}
lastHum = hum; // Mémorise la dernière mesure d'humidité
}
// Publie les nouvelles mesures sur le serveur MQTT si nécessaire
if (publish == true) {
char buffer[256]; // Buffer pour stocker la chaîne JSON
StaticJsonDocument<256> doc; // Crée un document JSON
doc["Temperature"] = temp; // Ajoute la température au document
doc["Humidity"] = hum; // Ajoute l'humidité au document
serializeJson(doc, buffer); // Sérialise le document JSON dans le buffer
Serial.println("MAJ des mesures!");
Serial.println("Publication de mesures.");
client.publish(topic, buffer, true); // Publie les mesures sur le topic MQTT
} else {
Serial.println("Aucune MAJ dans les mesures");
}
delay(2000); // Attend 2 secondes avant la prochaine itération de la boucle
}