#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#define SERVO_PIN 13
#define BUZZER_PIN 12
#define GREEN_LED 14
#define RED_LED 27
#define LOCKED_POS 0
#define UNLOCKED_POS 90
const String correctPin = "1234";
String enteredPin = "";
int wrongAttempts = 0;
const int maxAttempts = 3;
const unsigned long lockoutTime = 10000;
bool systemLocked = false;
unsigned long lockStartTime = 0;
Servo lockServo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
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] = {19, 18, 5, 17};
byte colPins[COLS] = {16, 4, 2, 15};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
lockServo.attach(SERVO_PIN);
lockServo.write(LOCKED_POS);
lcd.init();
lcd.backlight();
showWelcomeScreen();
}
void loop() {
if (systemLocked) {
checkLockout();
return;
}
char key = keypad.getKey();
if (key) {
handleKey(key);
}
}
void showWelcomeScreen() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Safe Locker");
lcd.setCursor(0, 1);
lcd.print("Enter PIN:");
}
void handleKey(char key) {
if (key >= '0' && key <= '9') {
if (enteredPin.length() < 8) {
enteredPin += key;
displayStars();
}
}
else if (key == '*') {
enteredPin = "";
showWelcomeScreen();
}
else if (key == '#') {
checkPin();
}
}
void displayStars() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PIN:");
lcd.setCursor(0, 1);
for (int i = 0; i < enteredPin.length(); i++) {
lcd.print("*");
}
}
void checkPin() {
if (enteredPin == correctPin) {
accessGranted();
} else {
accessDenied();
}
enteredPin = "";
}
void accessGranted() {
wrongAttempts = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Access granted");
lcd.setCursor(0, 1);
lcd.print("Unlocked");
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
tone(BUZZER_PIN, 1000, 200);
lockServo.write(UNLOCKED_POS);
delay(5000);
lockServo.write(LOCKED_POS);
digitalWrite(GREEN_LED, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Locked again");
delay(1500);
showWelcomeScreen();
}
void accessDenied() {
wrongAttempts++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wrong PIN");
lcd.setCursor(0, 1);
lcd.print("Attempts: ");
lcd.print(wrongAttempts);
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
tone(BUZZER_PIN, 300, 500);
delay(1000);
digitalWrite(RED_LED, LOW);
if (wrongAttempts >= maxAttempts) {
lockSystem();
} else {
showWelcomeScreen();
}
}
void lockSystem() {
systemLocked = true;
lockStartTime = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("System locked");
lcd.setCursor(0, 1);
lcd.print("Wait 10 sec");
tone(BUZZER_PIN, 150, 1000);
}
void checkLockout() {
unsigned long currentTime = millis();
if (currentTime - lockStartTime >= lockoutTime) {
systemLocked = false;
wrongAttempts = 0;
enteredPin = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Try again");
delay(1500);
showWelcomeScreen();
}
}