#include <DHT.h>
#include <ESP32Servo.h>
#include "ThingSpeak.h"
#include <WiFi.h>
#define DHTPIN 27 // Broche de données du capteur DHT22
#define DHTTYPE DHT22 // Type de capteur DHT utilisé
const int channelID = 2550951;
const char* apiKey = "LKA79WJ0ABGWCV65";
const char* wifiname = "Wokwi-GUEST";
const char* passwifi = "";
const char* server = "api.thingspeak.com";
// Définition des broches des LED bar graph
const int ledBarPins[] = {23, 22, 19, 18, 5, 17, 16, 4, 0, 2};
#define sensorPin 33
#define RGB_R 15 // Broche pour la LED rouge de l'RGB
#define RGB_G 13 // Broche pour la LED verte de l'RGB
#define RGB_B 14 // Broche pour la LED bleue de l'RGB
#define SERVO_PIN 12 // Broche de contrôle du servomoteur
#define POTENTIOMETER_PIN 34 // Broche de lecture du potentiomètre
const float CO2_THRESHOLD = 800; // Seuil de CO2
const float TEMPERATURE_THRESHOLD = 27.0; // Seuil de température
const float HUMIDITY_THRESHOLD = 50; // Seuil d'humidité
const int darkThreshold = 100; // Dark luminosity threshold
const int lightThreshold = 500; // Light luminosity threshold
const int brightThreshold = 1000;
WiFiClient client; // créer un objet client pour la connexion ESP32 et WiFi
DHT dht(DHTPIN, DHTTYPE);
Servo servo;
void setup() {
Serial.begin(9600);
pinMode(RGB_R, OUTPUT);
pinMode(RGB_G, OUTPUT);
pinMode(RGB_B, OUTPUT);
servo.attach(SERVO_PIN);
for (int i = 0; i < 10; i++) {
pinMode(ledBarPins[i], OUTPUT);
}
for (int i = 0; i < 10; i++) {
digitalWrite(ledBarPins[i], LOW);
}
servo.attach(SERVO_PIN);
WiFi.begin(wifiname, passwifi);
while (WiFi.status() != WL_CONNECTED){ // le code ne sera exécuté jusqu'à ce que la connexion est établie
delay(1000);
Serial.println("Trying to connect with wifi.....");
}
Serial.println("Wifi connected !");
WiFi.mode(WIFI_STA); // mode de fonctionnement du module Wi-Fi de l'ESP32 en mode Station (STA) : connexion a wifi existant
ThingSpeak.begin(client);// initialiser la bibliothèque ThingSpeak sur l'ESP32 avec le client Wi-Fi spécifié
}
void loop() {
delay(2000); // Attendre 2 secondes pour la stabilité des capteurs
// Lire la valeur du potentiomètre pour ajuster dynamiquement le seuil de CO2
int potentiometerValue = analogRead(POTENTIOMETER_PIN);
float co2Threshold = map(potentiometerValue, 0, 1023, 0, 1000); // Seuil de CO2 ajusté par le potentiomètre
float temperatureThreshold = 27.0; // Seuil de température pour le chauffage/climatisation
// Lecture de la température et de l'humidité
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int co2Level = analogRead(34); // Lecture du niveau de CO2
int lightLevel = analogRead(sensorPin); // Lecture du level de luminosité
// Affichage des valeurs dans le terminal
Serial.print("CO2 Level: ");
Serial.println(co2Threshold);
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Light: ");
Serial.println(lightLevel);
// Envoi des données à ThingSpeak
ThingSpeak.setField(1, co2Level); // Champ 1 : Niveau de CO2
ThingSpeak.setField(2, temperature); // Champ 2 : Temperature
ThingSpeak.setField(3, humidity); // Champ 3 : humidité
ThingSpeak.setField(4, lightLevel); // Champ 4 pour la luminosité
// Check if conditions meet to open windows
if (co2Level > CO2_THRESHOLD && temperature > TEMPERATURE_THRESHOLD && humidity > HUMIDITY_THRESHOLD) {
servo.write(0);
}else{
servo.write(90);
}
// Scenario 2: Température
if (temperature > TEMPERATURE_THRESHOLD) {
// Activer la climatisation (LED RGB devient bleue)
digitalWrite(RGB_R, LOW);//voltage on that pin is raised
digitalWrite(RGB_G, LOW);
digitalWrite(RGB_B, HIGH);
Serial.print("Activation du climatiseur ... \n");
} else if (temperature < TEMPERATURE_THRESHOLD) {
// Activer le chauffage (LED RGB devient rouge)
digitalWrite(RGB_R, HIGH);
digitalWrite(RGB_G, LOW);
digitalWrite(RGB_B, LOW);
Serial.print("Activation du chauffage ... \n");
}
if (lightLevel < 1000) {
// Dark luminosity
for (int i = 0; i < 10; i++) {
digitalWrite(ledBarPins[i], LOW);
}
} else if (lightLevel >= 1000 && lightLevel < 2000) {
// Light luminosity
for (int i = 0; i < 4; i++) {
digitalWrite(ledBarPins[i], HIGH);
}
for (int i = 4; i < 10; i++) {
digitalWrite(ledBarPins[i], LOW);
}
} else if (lightLevel >= 2000 && lightLevel < 3200) {
// Bright luminosity
for (int i = 0; i < 7; i++) {
digitalWrite(ledBarPins[i], HIGH);
}
for (int i = 7; i < 10; i++) {
digitalWrite(ledBarPins[i], LOW);
}
} else {
// Very bright luminosity
for (int i = 0; i < 10; i++) {
digitalWrite(ledBarPins[i], HIGH);
}
}
int status = ThingSpeak.writeFields(channelID, apiKey);
//vérifier si la requête d'envoi des données à ThingSpeak a réussi
if (status != 200) { // en protocole http, code 200 : traitement avec succès
Serial.println("Erreur lors de l'envoi des données sur ThingSpeak !");
} else {
Serial.println("Données envoyées avec succès sur ThingSpeak !");
}
delay(1000); // Attendre une seconde avant de lire à nouveau la luminosité
}