#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <ESP32Servo.h>
// --------- DHT22 ----------
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// --------- SERVO ----------
Servo tempServo;
// --------- Ultrasonic ----------
#define TRIG 18
#define ECHO 19
#define ULTRASONIC_LED 23
// --------- LDR ----------
#define LDRPIN 34
#define LDR_LED 22
// --------- Gas Sensor ----------
#define GASPIN 35
#define GAS_BUZZER 21
#define GAS_THRESHOLD 400
// --------- PIR ----------
#define PIRPIN 32
#define PIR_RELAY 33
// --------- LCD I2C ----------
#define SDA_PIN 25
#define SCL_PIN 26
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
// ---------------- SERVO SETUP ----------------
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
tempServo.setPeriodHertz(50);
tempServo.attach(5, 500, 2400);
// ---------------- DHT ----------------
dht.begin();
// ---------------- Ultrasonic ----------------
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(ULTRASONIC_LED, OUTPUT);
// ---------------- LDR ----------------
pinMode(LDR_LED, OUTPUT);
// ---------------- Gas ----------------
pinMode(GAS_BUZZER, OUTPUT);
// ---------------- PIR ----------------
pinMode(PIRPIN, INPUT);
pinMode(PIR_RELAY, OUTPUT);
// ---------------- LCD ----------------
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init();
lcd.backlight();
}
void loop() {
// ---------- DHT22 + Servo ----------
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (!isnan(temp)) {
int angle = map(temp, 20, 40, 0, 180);
angle = constrain(angle, 0, 180);
tempServo.write(angle);
}
// ---------- Ultrasonic ----------
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duration = pulseIn(ECHO, HIGH);
float distance = duration * 0.034 / 2;
if (distance < 20) digitalWrite(ULTRASONIC_LED, HIGH);
else digitalWrite(ULTRASONIC_LED, LOW);
// ---------- LDR ----------
int light = analogRead(LDRPIN);
if (light < 2000) digitalWrite(LDR_LED, HIGH);
else digitalWrite(LDR_LED, LOW);
// ---------- Gas Sensor ----------
int gas = analogRead(GASPIN);
if (gas > GAS_THRESHOLD) digitalWrite(GAS_BUZZER, HIGH);
else digitalWrite(GAS_BUZZER, LOW);
// ---------- PIR ----------
int motion = digitalRead(PIRPIN);
if (motion == HIGH) digitalWrite(PIR_RELAY, HIGH);
else digitalWrite(PIR_RELAY, LOW);
// ---------- LCD DISPLAY ----------
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print(" H:");
lcd.print(hum, 0);
lcd.setCursor(0, 1);
lcd.print("L:");
lcd.print(light);
lcd.print(" D:");
lcd.print(distance, 0);
lcd.print("cm");
// ---------- Serial Monitor ----------
Serial.print("Temp: "); Serial.print(temp);
Serial.print("C Hum: "); Serial.print(hum);
Serial.print("% Light: "); Serial.print(light);
Serial.print(" Dist: "); Serial.print(distance);
Serial.print(" cm Gas: "); Serial.print(gas);
Serial.print(" Motion: "); Serial.println(motion);
delay(2000);
}
Temp