#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Initialize the LCD with I2C address 0x27 and size 16x2
LiquidCrystal_I2C lcd_i2c(0x27, 16, 2);
Servo myservo;
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] = {8, 7, 6, 5};
byte colPins[COLS] = {4, 3, 2, 11};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const char* password = "4567";
int currentPosition = 0;
int invalidCount = 0;
const int redLed = 10;
const int greenLed = 11;
const int buzzer = 12;
void setup() {
lcd_i2c.init();
lcd_i2c.backlight();
Serial.begin(9600);
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(buzzer, OUTPUT);
myservo.attach(9);
displayScreen("ENTER CODE");
}
void loop() {
char key = keypad.getKey();
if (key) {
lcd_i2c.clear();
lcd_i2c.setCursor(0, 0);
lcd_i2c.print("PASSWORD:");
lcd_i2c.setCursor(7, 1);
for (int i = 0; i <= currentPosition; i++) {
lcd_i2c.print("*");
}
keypress();
if (key == password[currentPosition]) {
currentPosition++;
if (currentPosition == strlen(password)) {
unlockDoor();
currentPosition = 0;
invalidCount = 0; // Reset invalid count after successful unlock
}
} else {
invalidCount++;
incorrect();
currentPosition = 0;
}
if (invalidCount == 5) {
torture1();
} else if (invalidCount == 8) {
torture2();
}
}
}
void unlockDoor() {
lcd_i2c.clear();
lcd_i2c.setCursor(0, 0);
lcd_i2c.print("Access Granted");
lcd_i2c.setCursor(0, 1);
lcd_i2c.print("WELCOME!!");
unlockBuzz();
for (int pos = 180; pos >= 0; pos -= 5) {
myservo.write(pos);
delay(15);
}
delay(2000);
counterBeep();
for (int pos = 0; pos <= 180; pos += 5) {
myservo.write(pos);
delay(15);
}
displayScreen("ENTER CODE");
}
void incorrect() {
lcd_i2c.clear();
lcd_i2c.setCursor(1, 0);
lcd_i2c.print("CODE");
lcd_i2c.setCursor(6, 0);
lcd_i2c.print("INCORRECT");
digitalWrite(redLed, HIGH);
digitalWrite(buzzer, HIGH);
delay(3000);
lcd_i2c.clear();
digitalWrite(redLed, LOW);
digitalWrite(buzzer, LOW);
displayScreen("ENTER CODE");
}
void displayScreen(const char* message) {
lcd_i2c.clear();
lcd_i2c.setCursor(0, 0);
lcd_i2c.print(message);
}
void keypress() {
digitalWrite(buzzer, HIGH);
delay(50);
digitalWrite(buzzer, LOW);
}
void unlockBuzz() {
for (int i = 0; i < 3; i++) {
digitalWrite(buzzer, HIGH);
delay(80);
digitalWrite(buzzer, LOW);
delay(80);
}
}
void counterBeep() {
lcd_i2c.clear();
lcd_i2c.setCursor(2, 0);
lcd_i2c.print("GET IN WITHIN:");
for (int i = 5; i > 0; --i) {
lcd_i2c.setCursor(4, 1);
lcd_i2c.print(i);
delay(1000);
lcd_i2c.clear();
lcd_i2c.setCursor(2, 0);
lcd_i2c.print("GET IN WITHIN:");
}
lcd_i2c.clear();
lcd_i2c.setCursor(2, 0);
lcd_i2c.print("RE-LOCKING");
for (int i = 0; i < 3; ++i) {
lcd_i2c.setCursor(12 + i, 0);
lcd_i2c.print(".");
delay(500);
}
lcd_i2c.clear();
lcd_i2c.setCursor(4, 0);
lcd_i2c.print("LOCKED!");
delay(440);
}
void torture1() {
displayScreen("WAIT 15 SECONDS");
digitalWrite(buzzer, HIGH);
delay(15000);
digitalWrite(buzzer, LOW);
displayScreen("LOL.. HOW WAS THAT?");
delay(3500);
}
void torture2() {
displayScreen("EAR DRUMS ARE PRECIOUS");
delay(1500);
displayScreen("WAIT 1 MINUTE");
digitalWrite(buzzer, HIGH);
delay(55000);
counterBeep();
displayScreen("WANT ME TO RIDICULE MORE?");
delay(2500);
displayScreen("Ha Ha Ha Ha");
delay(1700);
}