#include <DHT.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include "ThingSpeak.h"

const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASS = "";

const int myChannelNumber =  2550208;
const char* write_API_Key = "9DP0SSAY2SG7Y2MC";
const char* server = "api.thingspeak.com";


#define RED_PIN 14
#define GREEN_PIN 33
#define BLUE_PIN 27
#define DHTPIN 15       
#define DHTTYPE DHT22
#define ldrPin 35
#define CO2Pin  34 
#define servoPin 25

const int ledPins[] = {23, 22, 21, 19, 18, 5, 4, 2, 12, 13};
int ledLevel = 0;

int CO2Value = 0; 
float temperature=0.0;
float hum=0;
int ldrValue = 0;
bool fenetresOuvertes = false;

const int seuilDark = 100;      
const int seuilLight = 500;     
const int seuilBright = 800;    
const int seuilVerybright = 1000;

DHT dht(DHTPIN, DHTTYPE);
Servo myServo;
WiFiClient Client;

void setup() {
  
  Serial.begin(9600);
  dht.begin();
  myServo.attach(servoPin); 

  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
  pinMode(CO2Pin, INPUT);
  pinMode(ldrPin, INPUT);

   for (int i = 0; i < 10; i++) {
    pinMode(ledPins[i], OUTPUT); 
  }

  WiFi.begin(WIFI_NAME, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  ThingSpeak.begin(Client);

}

void loop() {

  CO2Value = analogRead(CO2Pin);

   Serial.print("Valeur Potentiomètre: ");
   Serial.println(CO2Value);

  temperature = dht.readTemperature();

   Serial.print("Valeur Temperateur: ");
   Serial.println(temperature);

  hum = dht.readHumidity(); 

   Serial.print("Humidité: ");
   Serial.print(hum);

  ldrValue = analogRead(ldrPin); 

   Serial.print("Valeur LDR: ");
   Serial.println(ldrValue);

  if (temperature > 25) {
    activerClimatisation();

  } else if (temperature < 18) {
    activerChauffage();

  } else {
    eteindreClimatisationChauffage();
  }

  if(!fenetresOuvertes && CO2Value>1000){
      ouvrirFenetres();
      fenetresOuvertes = true;
      delay(20000);
  }

  else if (fenetresOuvertes && CO2Value <= 1000){
     fermerFenetres(); 
      fenetresOuvertes = false;
     delay(20000);
  }


if (   ldrValue <seuilDark) {
    Serial.println("Niveau: Sombre");
    activerLEDs(1);
    delay(1000);
  } else if (ldrValue < seuilLight) {
    Serial.println("Niveau: Lumiere");
    activerLEDs(1);
    activerLEDs(2);
    delay(1000);
  } else if (ldrValue < seuilBright) {
    Serial.println("Niveau: Brillant");
    activerLEDs(1);
    activerLEDs(2);
    activerLEDs(3);
    delay(1000);
  } else if (ldrValue < seuilVerybright) {
    Serial.println("Niveau: Tres Brillant");
    activerLEDs(1);
    activerLEDs(2);
    activerLEDs(3);
    activerLEDs(4);
    delay(1000);
  } else {
    Serial.println("Niveau: Tres Tres Brillant");
    delay(1000);

}
   sendDataToThingSpeak();
}

void sendDataToThingSpeak() {
  ThingSpeak.setField(1, temperature);
  ThingSpeak.setField(2, hum);
  ThingSpeak.setField(3, CO2Value);
  ThingSpeak.setField(4, ldrValue);

  int indicatorColor = 0; // Couleur par défaut
  if (ldrValue < seuilDark) {
    indicatorColor = 1; // Code pour la couleur rouge
  } else if (ldrValue >= seuilDark && ldrValue < seuilLight) {
    indicatorColor = 2; // Code pour la couleur jaune
  } else {
    indicatorColor = 3; // Code pour la couleur verte
  }

  // Utilisez un champ numérique pour représenter la couleur de l'indicateur
 

  int writeResult = ThingSpeak.writeField(myChannelNumber, 4, indicatorColor , write_API_Key);

  if (writeResult == 200) {
    Serial.println("Data pushed successfully");
  } else {
    Serial.println("Push error: " + String(writeResult));
  }
  Serial.println("---");
}









void ouvrirFenetres() {
  for (int POS = 0; POS<= 90; POS++) {
    myServo.write(POS);
    delay(10);
  }
}

void fermerFenetres() {
  for (int POS= 90; POS >= 0; POS--) {
    myServo.write(POS);
    delay(10);
  }
}

void activerClimatisation() {
  digitalWrite(RED_PIN, LOW);  
  digitalWrite(GREEN_PIN, LOW);  
  digitalWrite(BLUE_PIN, HIGH); 
}

void activerChauffage() {
  digitalWrite(RED_PIN, HIGH); 
  digitalWrite(GREEN_PIN, LOW);  
  digitalWrite(BLUE_PIN, LOW);  
}

void eteindreClimatisationChauffage() {
  digitalWrite(RED_PIN, LOW);  
  digitalWrite(GREEN_PIN, HIGH); 
  digitalWrite(BLUE_PIN, LOW);  
}

void activerLEDs(int numLEDs) {
  for (int i = 0; i < 10; i++) {
    if (i < numLEDs) {
      digitalWrite(ledPins[i], HIGH);
    } else {
      digitalWrite(ledPins[i], LOW);
    }
  }
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
rgb1:R
rgb1:COM
rgb1:G
rgb1:B
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND
ldr1:VCC
ldr1:GND
ldr1:DO
ldr1:AO
pot1:VCC
pot1:SIG
pot1:GND
bargraph1:A1
bargraph1:A2
bargraph1:A3
bargraph1:A4
bargraph1:A5
bargraph1:A6
bargraph1:A7
bargraph1:A8
bargraph1:A9
bargraph1:A10
bargraph1:C1
bargraph1:C2
bargraph1:C3
bargraph1:C4
bargraph1:C5
bargraph1:C6
bargraph1:C7
bargraph1:C8
bargraph1:C9
bargraph1:C10
gnd1:GND
servo1:GND
servo1:V+
servo1:PWM