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

#define timeSeconds 1000

const int led = 34;
const int motionSensor = 13;
const float RL10 = 50;
unsigned long now = millis();
unsigned long lastTrigger = 0;
boolean startTimer = false;
boolean motion = false;

#define DHT22_PIN 12
#define DHTTYPE DHT22
#define LED_PIN1 25
#define LED_PIN2 33
#define LED_PIN3 14
#define LED_PIN4 32
#define LED_PIN5 15
#define MQ135_PIN 34
#define LDR_PIN 35
#define SERVO_PIN 27
#define HEATER_PIN 26



const char* ssid = "Wokwi-GUEST";
const char* password = "";
unsigned long myChannelNumber = 2533119;
const char* apiKey = "MNC5BP4TQKTDMURM";
WiFiClient  client;


unsigned long lastTime = 0;
unsigned long timerDelay = 30000;





DHT dht(DHT22_PIN, DHTTYPE);
Servo servo;

float temp, hum;

float readMQ135() {

  int mq135Value = analogRead(MQ135_PIN);


  float mq135Voltage = mq135Value * (3.3 / 4095.0);

  return mq135Voltage;
}

float readLDR() {

  int ldrValue = analogRead(LDR_PIN);


  float illuminationLux = map(ldrValue, 0, 4095, 0, 1000);

  return illuminationLux;
}


void IRAM_ATTR detectsMovement() {
  digitalWrite(led, HIGH);
  startTimer = true;
  lastTrigger = millis();
}


void controlAdditionalLEDs(float illuminationLux) {
  if (illuminationLux > 917) {
    digitalWrite(LED_PIN5, HIGH);
    digitalWrite(LED_PIN4, HIGH);
    digitalWrite(LED_PIN3, HIGH);
  } else if (illuminationLux > 500) {
    digitalWrite(LED_PIN5, LOW);
    digitalWrite(LED_PIN4, HIGH);
    digitalWrite(LED_PIN3, HIGH);
  } else if (illuminationLux > 94) {
    digitalWrite(LED_PIN5, LOW);
    digitalWrite(LED_PIN4, LOW);
    digitalWrite(LED_PIN3, HIGH);
  } else {
    digitalWrite(LED_PIN5, LOW);
    digitalWrite(LED_PIN4, LOW);
    digitalWrite(LED_PIN3, LOW);
  }
}

void setup() {
  Serial.begin(9600);
  dht.begin();
  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
  pinMode(LED_PIN3, OUTPUT);
  pinMode(LED_PIN4, OUTPUT);
  pinMode(LED_PIN5, OUTPUT);
  servo.attach(SERVO_PIN);
  servo.write(0);
  pinMode(HEATER_PIN, OUTPUT);

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

  ThingSpeak.begin(client);
  pinMode(motionSensor, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, CHANGE);
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);


}

void loop() {
  temp = dht.readTemperature();
  hum = dht.readHumidity();

  int y = ThingSpeak.writeField(myChannelNumber, 2, hum, apiKey);
  if (y == 200) {
    Serial.println("Coordonnée de température envoyée avec succès à ThingSpeak !");
  } else {
    Serial.println("Erreur lors de l'envoi des données à ThingSpeak.");
  }
  int x = ThingSpeak.writeField(myChannelNumber, 1, temp, apiKey);
  if (x == 200) {
    Serial.println("Coordonnée de température envoyée avec succès à ThingSpeak !");
  } else {
    Serial.println("Erreur lors de l'envoi des données à ThingSpeak.");
  }

  Serial.print("Temperature: ");
  Serial.print(temp);
  Serial.println(" °C");

  Serial.print("Humidity: ");
  Serial.print(hum);
  Serial.println(" %");

  float airQuality = readMQ135();

  Serial.print("Air Quality: ");
  Serial.print(airQuality);
  Serial.println(" V");

  float illuminationLux = readLDR();

  Serial.print("Illumination (Lux): ");
  Serial.print(illuminationLux);
  Serial.println(" Lux");

  controlAdditionalLEDs(illuminationLux);

  if (temp <= 25 && temp >= 20) {
    Serial.println("Temperature is Normal. Turning on green LED.");
    digitalWrite(LED_PIN2, HIGH);
    digitalWrite(LED_PIN1, LOW);
    digitalWrite(HEATER_PIN, LOW);
    servo.write(90);
  } else if (temp > 25) {
    Serial.println("Temperature is High. Turning on red LED and Servo.");
    digitalWrite(LED_PIN2, LOW);
    digitalWrite(LED_PIN1, HIGH);

    // Rotate servo from 0 to 180 degrees
    for (int angle = 0; angle <= 180; angle += 10) {
      servo.write(angle);
      delay(10);
    }
  }
  else if (temp < 20) {
    Serial.println("Temperature is Low. Turning on red LED and Heater.");
    digitalWrite(LED_PIN2, LOW);
    digitalWrite(LED_PIN1, HIGH);

    digitalWrite(HEATER_PIN, HIGH);
    servo.write(90);
  }

  now = millis();
  if ((digitalRead(led) == HIGH) && (motion == false)) {
    Serial.println("MOTION DETECTED!!!");
    motion = true;
  }

  if (startTimer && (now - lastTrigger > timeSeconds)) {
    Serial.println("Motion stopped...");
    digitalWrite(led, LOW);
    startTimer = false;
    motion = false;

    attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, CHANGE);
  }



  delay(10000);
}
mq-135Breakout
NOCOMNCVCCGNDINLED1PWRRelay Module