#include <DHTesp.h> // Library DHT
#include <ESP32Servo.h> // Servo
#include <DHT.h> // Add the DHT library
#define DHTPIN 27
#define DHTTYPE DHT22 // Type de capteur DHT utilisé
#define SEUIL_CLIMATISATION 25
#define SEUIL_CHAUFFAGE 20
#define LED_R_PIN 26
#define LED_G_PIN 27
#define LED_B_PIN 25
#define SERVO_PIN 14 // Pin du servomoteur
DHT dht(DHTPIN, DHTTYPE); // Initialize the DHT sensor
Servo servo; // Initialize the servo motor
const int potPin = 13; // Broche analogique pour le potentiomètre sur ESP32
int CO2Threshold = 0; // Seuil initial de CO2
const int LDR_PIN = 2; // Broche analogique à laquelle le LDR 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 LED1 = 21; // Broche de la première LED du bar graph
const int LED2 = 19; // Broche de la deuxième LED du bar graph
const int LED3 = 18; // Broche de la troisième LED du bar graph
const int LED4 = 5; // Broche de la quatrième LED du bar graph
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
dht.begin(); // Initialize the DHT sensor
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_G_PIN, OUTPUT);
pinMode(LED_B_PIN, OUTPUT);
}
void loop() {
delay(10); // this speeds up the simulation
// Lecture de la température et de l'humidité depuis le DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// 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 / (5.0 - voltage);
} 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");
}
// 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);
delay(1000); // Attendre une seconde avant de reprendre la boucle
}
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_G_PIN, LOW); // Éteindre la LED verte
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_G_PIN, LOW); // Éteindre la LED verte
digitalWrite(LED_B_PIN, LOW); // Éteindre la LED bleue
} else {
digitalWrite(LED_R_PIN, LOW); // Éteindre la LED rouge
digitalWrite(LED_G_PIN, LOW); // Éteindre la LED verte
digitalWrite(LED_B_PIN, LOW); // Éteindre la LED bleue
}
} else {
Serial.println("Erreur de lecture de la température !");
}
}