#include <ESP32Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Servo setup
Servo myServo;
// Pins
int pirPin = 23; // PIR sensor output
int relayPin = 19; // Relay control
int servoPin = 18; // Servo motor
int pirState = LOW;
void setup() {
Serial.begin(115200);
// PIR, Relay
pinMode(pirPin, INPUT);
pinMode(relayPin, OUTPUT);
// Servo setup (with pulse width range for SG90)
myServo.attach(servoPin, 500, 2400);
// LCD setup
lcd.init();
lcd.backlight();
// Initial state
myServo.write(0); // Door unlocked
digitalWrite(relayPin, LOW); // Alarm OFF
lcd.setCursor(0, 0);
lcd.print("System Ready");
}
void loop() {
int motion = digitalRead(pirPin);
if (motion == HIGH && pirState == LOW) {
Serial.println("Motion Detected! Door Locked & Alarm ON");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motion Detected!");
lcd.setCursor(0, 1);
lcd.print("Door Locked");
myServo.write(90); // Lock door
digitalWrite(relayPin, HIGH); // Alarm ON
pirState = HIGH;
delay(3000); // Keep locked for 3s
}
else if (motion == LOW && pirState == HIGH) {
Serial.println("No Motion. Door Unlocked & Alarm OFF");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("No Motion");
lcd.setCursor(0, 1);
lcd.print("Door Unlocked");
myServo.write(0); // Unlock door
digitalWrite(relayPin, LOW); // Alarm OFF
pirState = LOW;
}
}