#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h> // For ESP32 Servo library
#include <DHT.h>
#include <OneWire.h>
// Pin Definitions
#define DHTPIN 14 // Pin for DHT22
#define DHTTYPE DHT22 // DHT 22 sensor type
#define DS18B20_PIN 32 // Pin for DS18B20 Temperature Sensor
#define PIR_PIN 25 // Pin for PIR Sensor
#define RELAY_PIN 27 // Pin for Relay
#define LDR_PIN 34 // Pin for LDR Sensor (Analog)
#define TRIG_PIN 13 // Pin for Ultrasonic Sensor (Trig)
#define ECHO_PIN 12 // Pin for Ultrasonic Sensor (Echo)
#define SERVO_PIN 16 // Pin for Servo Motor
// Objects for components
RTC_DS1307 rtc;
DHT dht(DHTPIN, DHTTYPE);
Servo myServo; // ESP32Servo object for controlling the servo motor
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD I2C address: 0x27
// OneWire for DS18B20
OneWire oneWire(DS18B20_PIN);
void setup() {
Serial.begin(115200);
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.clear();
// Initialize DHT22
dht.begin();
// Initialize RTC
if (!rtc.begin()) {
lcd.setCursor(0, 0);
lcd.print("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Initialize Pins
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LDR_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Initialize Servo with ESP32Servo
myServo.attach(SERVO_PIN);
// Initial state
digitalWrite(RELAY_PIN, LOW);
lcd.setCursor(0, 0);
lcd.print("Smart home automation");
delay(2000);
lcd.clear();
}
void loop() {
// Read temperature and humidity from DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
lcd.setCursor(0, 0);
lcd.print("DHT Err");
} else {
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println("°C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println("%");
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print("%");
}
// Read temperature from DS18B20 using OneWire
oneWire.reset();
oneWire.write(0x44); // Start temperature conversion
delay(1000); // Wait for conversion to complete
oneWire.reset();
oneWire.write(0xBE); // Read temperature command
byte data[9];
for (int i = 0; i < 9; i++) {
data[i] = oneWire.read();
}
int16_t rawTemp = (data[1] << 8) | data[0];
float ds18b20Temperature = (float)rawTemp / 16.0;
Serial.print("DS18B20 Temp: ");
Serial.print(ds18b20Temperature);
Serial.println("°C");
lcd.setCursor(0, 0);
lcd.print("DS18B20: ");
lcd.print(ds18b20Temperature);
lcd.print(" C");
delay(2000);
lcd.clear();
// PIR Sensor for Motion Detection
int pirState = digitalRead(PIR_PIN);
if (pirState == HIGH) {
Serial.println("Motion Detected!");
digitalWrite(RELAY_PIN, HIGH); // Turn on relay (e.g., appliance)
lcd.setCursor(0, 0);
lcd.print("Motion Detected");
} else {
digitalWrite(RELAY_PIN, LOW); // Turn off relay
lcd.setCursor(0, 0);
lcd.print("No Motion");
}
delay(2000);
lcd.clear();
// Ultrasonic Sensor Reading
long duration, distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
if (distance < 10) {
Serial.println("Object Detected by Ultrasonic");
myServo.write(90); // Move servo to 90 degrees (open)
lcd.setCursor(0, 0);
lcd.print("Obj Detected:");
lcd.print(distance);
lcd.print("cm");
} else {
myServo.write(0); // Move servo to 0 degrees (close)
lcd.setCursor(0, 0);
lcd.print("No Object:");
lcd.print(distance);
lcd.print("cm");
}
delay(2000);
lcd.clear();
// LDR Sensor Reading
int ldrValue = analogRead(LDR_PIN);
if (ldrValue < 1000) { // Adjust threshold for light levels
Serial.println("Low Light Detected!");
digitalWrite(RELAY_PIN, HIGH); // Turn on relay if it's dark
lcd.setCursor(0, 0);
lcd.print("Low Light");
} else {
digitalWrite(RELAY_PIN, LOW); // Turn off relay
lcd.setCursor(0, 0);
lcd.print("Light OK");
}
delay(2000);
lcd.clear();
// Time from RTC
DateTime now = rtc.now();
Serial.print("Current time: ");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
delay(2000);
lcd.clear();
}