#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);
}