#include "DHT.h"
#include <ESP32Servo.h>
#include <ThingSpeak.h>
#include <WiFi.h>
//connecter le circuit avec thinkspeak
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASS = "";
WiFiClient client;
//thingspeak details
const int myChannelNumber = 2550234;
const char* write_API_Key = "ZC0ZI8ZFQQML9E0H";
const char* server = "api.thingspeak.com";
// Déclaration des broches pour les composants
#define SEUIL_CLIMATISATION 25
#define SEUIL_CHAUFFAGE 20
#define LED_R_PIN 12
#define LED_B_PIN 27
#define SERVO_PIN 32 // Pin du servomoteur
#define DHTPIN 13
#define DHTTYPE DHT22 // Type de capteur DHT utilisé
// Déclaration des objets
DHT dht(DHTPIN, DHTTYPE); // Initialize the DHT sensor
Servo servo; // Initialize the servo motor
//les leds de led-bar
const int LED1 = 23; // Broche de la première LED du bar graph
const int LED2 = 22; // Broche de la deuxième LED du bar graph
const int LED3 = 21; // Broche de la troisième LED du bar graph
const int LED4 = 19; // Broche de la quatrième LED du bar graph
const int LDR_PIN = 35; // Broche analogique à laquelle le LDR(capteur de luminosite) est connecté
const float RL10 = 50; // Résistance de 10 lux (en kOhm)
const float GAMMA = 0.7; // Facteur de gamma utilisé pour le calcul de la luminosité
const int potPin = 36; // Broche analogique pour le slide-potentiomètre sur ESP32
int CO2Threshold = 0 ; // Seuil initial de CO2
// Declare global variables
float temperature;
float humidity;
float lux;
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
dht.begin(); // Initialize the DHT sensor
//attendre que la connexion WiFi soit établie avant de poursuivre l'exécution du programme.
WiFi.begin(WIFI_NAME, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED){
delay(1000);
Serial.println("Wifi not connected");
}
Serial.println("Wifi connected !");
Serial.println("Local IP: " + String(WiFi.localIP()));
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
servo.attach(SERVO_PIN); // Attacher le servomoteur à la broche définie
pinMode(LDR_PIN, INPUT); // Configurer la broche LDR_PIN comme une entrée
pinMode(LED1, OUTPUT); // Configurer la broche LED1 comme une sortie
pinMode(LED2, OUTPUT); // Configurer la broche LED2 comme une sortie
pinMode(LED3, OUTPUT); // Configurer la broche LED3 comme une sortie
pinMode(LED4, OUTPUT); // Configurer la broche LED4 comme une sortie
pinMode(LED_R_PIN, OUTPUT);
pinMode(LED_B_PIN, OUTPUT);
digitalWrite(LED_R_PIN, LOW);
digitalWrite(LED_B_PIN, LOW);
}
void loop() {
delay(10); // this speeds up the simulation
// Lecture de la température et de l'humidité depuis le DHT22
temperature = dht.readTemperature();
humidity = dht.readHumidity();
//
float tempData, humidityData, co2Data, lux1;
tempData = temperature;
humidityData = humidity;
co2Data = CO2Threshold;
lux1=lux;
// Lecture de la valeur du potentiomètre
int potValue = analogRead(potPin);
CO2Threshold = map(potValue, 0, 4095, 0, 1000); // La valeur du seuil de CO2 peut varier de 0 à 1000 ppm sur ESP32
// Affichage des données sur le moniteur série
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" °C\t");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("CO2 Threshold: ");
Serial.println(CO2Threshold);
// Lire la valeur analogique de la broche LDR_PIN
int analogValue = analogRead(LDR_PIN);
// Convertir la valeur analogique en tension
float voltage = analogValue / 1024.0 * 5.0;
float resistance;
if (voltage > 0.0 && voltage < 5.0) {
// Calculer la résistance du LDR en utilisant la loi d'Ohm
resistance = 2000.0 * voltage / (1.0 - voltage / 5.0);
} else {
// Gérer le cas où la tension est en dehors de la plage attendue
resistance = 1000000.0; // Fixer la résistance à une grande valeur
}
// Calculer la luminosité en lux en utilisant la formule appropriée
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1.0 / GAMMA));
// Afficher la luminosité calculée dans le moniteur série
Serial.print("Luminosity: ");
Serial.println(lux);
// Contrôler les LEDs en fonction de la luminosité mesurée
if (lux < 100) {
// Luminosité faible - activer seulement la première LED
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
Serial.println("Dark");
} else if (lux >= 100 && lux < 500) {
// Luminosité modérée - activer les deux premières LEDs
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
Serial.println("Light");
} else if (lux >= 500 && lux < 3000) {
// Luminosité élevée - activer les trois premières LEDs
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
Serial.println("Bright");
} else if (lux >= 3000) {
// Luminosité très élevée - activer toutes les LEDs
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
Serial.println("Very Bright");
} else {
// Cas de lecture invalide
Serial.println("Invalid");
}
delay(1000); // Attendre une seconde avant de reprendre la boucle
// Contrôler le servomoteur en fonction des niveaux de CO2
if (CO2Threshold > 800) { // Si le seuil de CO2 est dépassé
openWindows(); // Appeler la fonction pour ouvrir les fenêtres
} else {
closeWindows(); // Appeler la fonction pour fermer les fenêtres
}
// Contrôler le chauffage et la climatisation en fonction de la température
controlTemperature(temperature);
// Envoyer les données groupées à ThingSpeak
sendDataToThingSpeak(tempData, humidityData, co2Data, lux1);
}
void openWindows() {
for (int angle = 0; angle <= 180; angle += 1) { // Ouvrir les fenêtres progressivement
servo.write(angle);
// delay(15);
}
}
void closeWindows() {
for (int angle = 180; angle >= 0; angle -= 1) { // Fermer les fenêtres progressivement
servo.write(angle);
//delay(15);
}
}
void controlTemperature(float temperature) {
if (!isnan(temperature)) { // Vérifier si la lecture de la température est valide
if (temperature > SEUIL_CLIMATISATION) {
digitalWrite(LED_R_PIN, LOW); // Éteindre la LED rouge
digitalWrite(LED_B_PIN, HIGH); // Allumer la LED bleue pour la climatisation
} else if (temperature < SEUIL_CHAUFFAGE) {
digitalWrite(LED_R_PIN, HIGH); // Allumer la LED rouge pour le chauffage
digitalWrite(LED_B_PIN, LOW); // Éteindre la LED bleue
}else{
digitalWrite(LED_R_PIN, LOW);
digitalWrite(LED_B_PIN, LOW); // Éteindre la LED bleue
}
} else {
Serial.println("Erreur de lecture de la température !");
}
}
void sendDataToThingSpeak(float temperature, float humidity, int CO2Threshold,float lux) {
// Envoi des données à ThingSpeak
ThingSpeak.setField(1, temperature);
delay(500);
ThingSpeak.setField(2, humidity);
delay(500);
ThingSpeak.setField(3, CO2Threshold);
delay(500);
ThingSpeak.setField(4, lux);
// Envoi des données et gestion des résultats
int writeResult = ThingSpeak.writeFields(myChannelNumber, write_API_Key);
if(writeResult == 200){
Serial.println("Data pushed successfully");
} else {
Serial.println("Push error" + String(writeResult));
}
Serial.println("---");
}