#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>
/* --------- LCD --------- */
LiquidCrystal_I2C lcd(0x27, 16, 2);
/* --------- KEYPAD --------- */
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {32, 33, 25, 26}; // Connect to ROW0-ROW3
byte colPins[COLS] = {27, 14, 12, 13}; // Connect to COL0-COL3
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
/* --------- SERVO --------- */
Servo doorServo;
#define SERVO_PIN 23
/* --------- LED & BUZZER --------- */
#define GREEN_LED 2
#define RED_LED 15
#define BUZZER 4
/* --------- PASSWORD --------- */
String password = "1234";
String inputPassword = "";
void setup() {
Serial.begin(115200);
// LCD init
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Door Lock System");
// Pins
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
// Servo init
doorServo.attach(SERVO_PIN);
doorServo.write(0); // Locked
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key == '#') { // Enter
checkPassword();
inputPassword = ""; // reset
} else if (key == '*') { // Clear
inputPassword = "";
lcd.setCursor(0,1);
lcd.print(" "); // clear line
} else {
inputPassword += key;
lcd.setCursor(0,1);
lcd.print(inputPassword);
}
}
}
void checkPassword() {
if (inputPassword == password) {
lcd.setCursor(0,1);
lcd.print("ACCESS GRANTED");
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
tone(BUZZER, 1000, 200); // beep
doorServo.write(90); // unlock door
delay(3000);
doorServo.write(0); // lock door
digitalWrite(GREEN_LED, LOW);
lcd.setCursor(0,1);
lcd.print(" ");
} else {
lcd.setCursor(0,1);
lcd.print("ACCESS DENIED ");
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
tone(BUZZER, 500, 500); // long beep
delay(2000);
digitalWrite(RED_LED, LOW);
lcd.setCursor(0,1);
lcd.print(" ");
}
}