// Inclure les bibliothèques nécessaires
#include <DHT.h> // Capteur d'humidité et de température
#include <Adafruit_Sensor.h>
#include <Adafruit_CCS811.h> // Capteur de CO2
#include <Wire.h> // Communication I2C
#include <SimpleTimer.h> // Bibliothèque pour créer des temporisations

#define DHTPIN 2     // Broche de données du capteur DHT (Connecter le capteur DHT au pin 2 de l'Arduino)
#define DHTTYPE DHT11   // Type du capteur DHT

#define RELAY_HUMIDIFIER 3 // Relais de l'humidificateur (220V) (Connecter le relais de l'humidificateur au pin 3 de l'Arduino)
#define RELAY_HEATER 4     // Relais du chauffage (220V) (Connecter le relais du chauffage au pin 4 de l'Arduino)
#define RELAY_FAN 5        // Relais du ventilateur (220V) (Connecter le relais du ventilateur au pin 5 de l'Arduino)

#define CCS811_ADDR 0x5B // Adresse du capteur de CO2

// Initialisation des capteurs
DHT dht(DHTPIN, DHTTYPE);
Adafruit_CCS811 ccs;

SimpleTimer timer;

void setup() {
  Serial.begin(9600);
  pinMode(RELAY_HUMIDIFIER, OUTPUT);
  pinMode(RELAY_HEATER, OUTPUT);
  pinMode(RELAY_FAN, OUTPUT);
  
  dht.begin();
  
  if(!ccs.begin()){
    Serial.println("Failed to start CCS811 sensor! Please check your wiring.");
    while(1);
  }

  // Calibrer le capteur de CO2
  while(ccs.available()){
    ccs.readData();
  }
  ccs.setTempOffset(25.0); // Calibration de la température
  
  // Définir les temporisations pour la lecture des capteurs
  timer.setInterval(10000, readSensors); // Lecture des capteurs toutes les 10 secondes
}

void loop() {
  timer.run();
}

void readSensors() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C");

  if (ccs.available()) {
    if (!ccs.readData()) {
      Serial.println("Failed to read CCS811 sensor!");
      return;
    }
    if(ccs.geteCO2() > 1000){ // Si le niveau de CO2 est élevé, déclencher le ventilateur
      digitalWrite(RELAY_FAN, HIGH);
    } else {
      digitalWrite(RELAY_FAN, LOW);
    }
  }

  if (h < 60) { // Si l'humidité est trop basse, activer l'humidificateur
    digitalWrite(RELAY_HUMIDIFIER, HIGH);
  } else {
    digitalWrite(RELAY_HUMIDIFIER, LOW);
  }

  if (t < 20) { // Si la température est trop basse, activer le chauffage
    digitalWrite(RELAY_HEATER, HIGH);
  } else {
    digitalWrite(RELAY_HEATER, LOW);
  }
}