#include <ESP32Servo.h>
#include <DHT.h>
#define TRIG 5
#define ECHO 18
#define DHTPIN 15
#define DHTTYPE DHT22
#define GAS 34
#define PIR 23
#define LED 2
#define BUZZER 4
#define SERVO_PIN 19
Servo myServo;
DHT dht(DHTPIN, DHTTYPE);
long duration;
int distance;
int gasValue;
int pirState;
float temp;
void setup() {
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
Serial.begin(115200);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(PIR, INPUT);
pinMode(LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
myServo.setPeriodHertz(50);
myServo.attach(SERVO_PIN, 500, 2400);
dht.begin();
}
void loop() {
// Ultrasonic
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH);
distance = duration * 0.034 / 2;
// Other sensors
temp = dht.readTemperature();
gasValue = analogRead(GAS);
pirState = digitalRead(PIR);
Serial.println("Checking sensors...");
// WHILE CONDITION
while (distance < 20 || temp > 30 || gasValue > 2000 || pirState == HIGH) {
myServo.write(90);
digitalWrite(LED, HIGH);
digitalWrite(BUZZER, HIGH);
delay(1000);
// Update sensor values inside loop
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH);
distance = duration * 0.034 / 2;
temp = dht.readTemperature();
gasValue = analogRead(GAS);
pirState = digitalRead(PIR);
}
// Normal condition
digitalWrite(LED, LOW);
digitalWrite(BUZZER, LOW);
myServo.write(0);
delay(1000);
}