// Door Lock System using Arduino

#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Password.h>

#define buzzer 11
#define ledGREEN 12
#define ledRED 13

Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2);

String newPasswordString; // hold the new password
char newPassword[6]; // character string of newPasswordString
byte a = 5;
bool value = true;

Password password = Password("1234"); // Enter your password

byte maxPasswordLength = 6;
byte currentPasswordLength = 0;
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns

char keys[ROWS][COLS] = {
  {'D', 'C', 'B', 'A'},
  {'#', '9', '6', '3'},
  {'0', '8', '5', '2'},
  {'*', '7', '4', '1'},
};

byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8, 9};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup() {
  Serial.begin(9600);
  pinMode(buzzer, OUTPUT);
  pinMode(ledGREEN, OUTPUT);
  pinMode(ledRED, OUTPUT);
  
  servo.attach(10);
  servo.write(50);

  digitalWrite(buzzer, HIGH);
  tone(buzzer, 523, 150);
  delay(150);
  digitalWrite(buzzer, HIGH);
  tone(buzzer, 1047, 400);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(3, 0);
  lcd.print("WELCOME TO");
  lcd.setCursor(0, 1);
  lcd.print("DOOR LOCK SYSTEM");
  delay(3000);
  lcd.clear();
}

void loop() {
  lcd.setCursor(1, 0);
  lcd.print("ENTER PASSWORD");

  char key = keypad.getKey();
  if (key != NO_KEY) {
    delay(60);
    if (key == '*') {
      resetPassword();
    } else if (key == '#') {
      if (value) {
        doorlocked();
        value = false;
      } else {
        dooropen();
        value = true;
      }
    } else {
      if (currentPasswordLength < maxPasswordLength) {
        processNumberKey(key);
      } else {
        digitalWrite(buzzer, HIGH);
        tone(buzzer, 110, 300);
      }
    }
  }
}

void processNumberKey(char key) {
  lcd.setCursor(a, 1);
  lcd.print("*");
  a++;
  if (a == 11) {
    a = 5;
  }
  currentPasswordLength++;
  password.append(key);
}

void dooropen() {
  if (password.evaluate()) {
    digitalWrite(buzzer, HIGH);
    tone(buzzer, 880, 150);
    digitalWrite(ledGREEN, HIGH);
    delay(150);
    digitalWrite(buzzer, HIGH);
    tone(buzzer, 1175, 400);
    servo.write(50);
    delay(1000);
    lcd.setCursor(0, 0);
    lcd.print("CORRECT PASSWORD");
    lcd.setCursor(0, 1);
    lcd.print("DOOR OPENED");
    delay(2000);
    digitalWrite(ledGREEN, LOW);
    lcd.clear();
    a = 5;
  } else {
    digitalWrite(buzzer, HIGH);
    tone(buzzer, 110, 1000);
    digitalWrite(ledRED, HIGH);
    delay(1600);
    digitalWrite(buzzer, LOW); // Turn off buzzer
    lcd.setCursor(0, 0);
    lcd.print("WRONG PASSWORD!");
    lcd.setCursor(0, 1);
    lcd.print("PLEASE TRY AGAIN");
    delay(2000);
    digitalWrite(ledRED, LOW);
    lcd.clear();
    a = 5;
  }
  resetPassword();
}

void resetPassword() {
  password.reset();
  currentPasswordLength = 0;
  lcd.clear();
  a = 5;
}

void doorlocked() {
  if (password.evaluate()) {
    digitalWrite(buzzer, HIGH);
    tone(buzzer, 880, 150);
    digitalWrite(ledGREEN, HIGH);
    delay(150);
    digitalWrite(buzzer, HIGH);
    tone(buzzer, 1175, 400);
    servo.write(110);
    delay(1000);
    lcd.setCursor(0, 0);
    lcd.print("CORRECT PASSWORD");
    lcd.setCursor(2, 1);
    lcd.print("DOOR LOCKED");
    delay(2000);
    digitalWrite(ledGREEN, LOW);
    lcd.clear();
    a = 5;
  } else {
    digitalWrite(buzzer, HIGH);
    tone(buzzer, 110, 1000);
    digitalWrite(ledRED, HIGH);
    delay(1600);
    digitalWrite(buzzer, LOW); // Turn off buzzer
    lcd.setCursor(0, 0);
    lcd.print("WRONG PASSWORD!");
    lcd.setCursor(0, 1);
    lcd.print("PLEASE TRY AGAIN");
    delay(2000);
    digitalWrite(ledRED, LOW);
    lcd.clear();
    a = 5;
  }
  resetPassword();
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
servo1:GND
servo1:V+
servo1:PWM
bz1:1
bz1:2
led1:A
led1:C
led2:A
led2:C