#include <WiFi.h>
#include <PubSubClient.h>
#include <DHTesp.h>
// Définition des pins
const int DHT_PIN = 16; // Pin pour le capteur de température et d'humidité DHT
const int LDR_PIN = 35; // Pin pour la lecture de la résistance LDR (Light Dependent Resistor)
const int LDR_POWER = 15; // Pin pour contrôler l'alimentation de la LDR (si nécessaire)
// Configuration Wi-Fi et MQTT
const char* ssid = "Wokwi-GUEST"; // Nom du réseau Wi-Fi
const char* password = ""; // Mot de passe du réseau Wi-Fi
const char* mqtt_server = "broker.hivemq.com"; // Serveur MQTT
WiFiClient espClient; // Client Wi-Fi
PubSubClient client(espClient); // Client MQTT
unsigned long lastMsg = 0; // Variable pour gérer le délai entre les publications
float temp = 0; // Température
float hum = 0; // Humidité
DHTesp dht; // Objet DHTesp pour la gestion du capteur DHT
// Fonction pour connecter l'ESP32 au réseau Wi-Fi
void setup_wifi() {
delay(10); // Délai avant de commencer
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA); // Mode station Wi-Fi
WiFi.begin(ssid, password); // Connexion au réseau Wi-Fi
// Boucle jusqu'à ce que la connexion soit établie
while (WiFi.status() != WL_CONNECTED) {
delay(500); // Attente de 500 ms
Serial.print(".");
}
randomSeed(micros()); // Génération d'un nombre aléatoire pour le client MQTT
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); // Affichage de l'adresse IP locale de l'ESP32
}
// Fonction de rappel pour les messages reçus du serveur MQTT
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]); // Affiche le message reçu
}
}
// Fonction pour tenter de se reconnecter au serveur MQTT si la connexion est perdue
void reconnect() {
// Essaye de se reconnecter au serveur MQTT tant que la connexion échoue
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX); // ID du client unique
if (client.connect(clientId.c_str())) {
Serial.println("Connected");
client.publish("/ThinkIOT/Publish", "Welcome"); // Envoie un message de bienvenue au serveur MQTT
client.subscribe("/ThinkIOT/Subscribe"); // Souscrit à un sujet
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000); // Attend 5 secondes avant de réessayer
}
}
}
void setup() {
pinMode(2, OUTPUT); // Définit la pin 2 comme sortie
pinMode(LDR_POWER, OUTPUT); // Définit la pin d'alimentation de la LDR comme sortie
digitalWrite(LDR_POWER, HIGH); // Active l'alimentation de la LDR
Serial.begin(115200); // Initialisation de la communication série
setup_wifi(); // Connexion au Wi-Fi
client.setServer(mqtt_server, 1883); // Définition du serveur MQTT
client.setCallback(callback); // Définition de la fonction de rappel
dht.setup(DHT_PIN, DHTesp::DHT22); // Initialisation du capteur DHT22
}
void loop() {
if (!client.connected()) {
reconnect(); // Si la connexion est perdue, tenter de se reconnecter
}
client.loop(); // Maintient la communication avec le serveur MQTT
unsigned long now = millis(); // Temps écoulé en millisecondes
if (now - lastMsg > 2000) { // Si plus de 2 secondes se sont écoulées
lastMsg = now;
// Lecture des données du capteur DHT (température et humidité)
TempAndHumidity data = dht.getTempAndHumidity();
String temp = String(data.temperature, 2); // Conversion de la température en chaîne
client.publish("/ThinkIOT/temp", temp.c_str()); // Publication de la température sur MQTT
String hum = String(data.humidity, 1); // Conversion de l'humidité en chaîne
client.publish("/ThinkIOT/hum", hum.c_str()); // Publication de l'humidité sur MQTT
Serial.print("Temperature: ");
Serial.println(temp); // Affichage de la température sur le moniteur série
Serial.print("Humidity: ");
Serial.println(hum); // Affichage de l'humidité sur le moniteur série
// Lecture de la valeur du capteur LDR (résistance dépendant de la lumière)
int ldrValue = analogRead(LDR_PIN); // Lecture de la valeur analogique de la LDR
String ldr = String(ldrValue); // Conversion de la valeur en chaîne
client.publish("/ThinkIOT/ldr", ldr.c_str()); // Publication de la valeur LDR sur MQTT
Serial.print("LDR Value: ");
Serial.println(ldr); // Affichage de la valeur de la LDR sur le moniteur série
}
}