#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é


}