#include<Keypad.h> // KEYPAD LIBRARY FOR KEYPAD INTERFACING 
#include<LiquidCrystal.h>   // LIBRARY FOR LCD INTERFACING
#include<Servo.h>// LIBRARY FOR SERVO MOTOR
//#include<String.h>
#define   buzzer 20 // DEFINING PIN FOR BUZZER.

LiquidCrystal lcd(14,15,16,17,18,19);   // PINS FOR LCD

char keys[4][4]={ // LAYOUT OF KEYPAD
 {'1','2','3','A'},
   {'4','5','6', 'B'},
 {'7','8','9', 'C'},
 {'*','0','#', 'D'}};
 
byte   rowPin[4]={4,5,6,7}; // ROW PINS OF KEYPAD
byte colPin[4]={8,9,10,11}; // COLUMN   PINS OF KEYPAD

Servo servo_Motor; 
String password = "159";  // SETTING   DEFAULT PASSWORD.
int position = 0; // VARIABLE FOR DETERMINING THE POSITION.

int   wrong = 0; // VARIABLE FOR CALCULATING THE WRONG INPUT.

int redPin = 9; //   DEFINING PIN FOR RED LED
int greenPin = 8; // DEFINING PIN FOR GREEN LED
   
Keypad keypad=Keypad(makeKeymap(keys),rowPin,colPin,4,4);
// MAPPING THE   KEYPAD.


int total = 0; // VARIABLE TO DETERMINE THE NUMBER OF WRONG ATTEMPTS.

void   setup()
{
 pinMode(redPin,OUTPUT);
 pinMode(greenPin,OUTPUT);
 
lcd.begin(16,2);
lcd.print("DOOR   LOCK SYSTEM");
lcd.setCursor(0,2);
lcd.print("       BY:");
delay(2000);
lcd.clear();
lcd.print("Creative");
lcd.setCursor(0,2);
lcd.print("     Engineer");
delay(2000);
lcd.clear();
servo_Motor.attach(3);
setLocked(true);
delay(1000);

pinMode(buzzer,   OUTPUT);
}

void loop()
{
  
  lcd.clear();
  lcd.print("Enter   Password:");
  delay(100);
  
 char pressed=keypad.getKey();// TAKING   THE INPUT FROM KEYPAD
 String key[3];
  
 if(pressed) // IF THE KEY IS   PRESSED
 {
  lcd.clear();
  lcd.print("Enter Password:");
  lcd.setCursor(position,2);
   lcd.print(pressed);
  delay(500);
    if(pressed == '*' || pressed == '#')
      {
          position = 0;
          setLocked(true);
          lcd.clear();
       }

    else if(pressed == password[position])
      {
          key[position]=pressed;
           position++;
      }
 
    else if (pressed != password[position]   )
      {// IN CASE OF WRONG INPUT INCREMENT BOTH WRONG AND POSITION.
          wrong++;
           position ++;
      }

    if(position == 3)
      {// WHEN   POSITION == 3 THEN CHECK THE FOLLOWING
          if( wrong >0) // IF ANY WRONG   INPUT IF GIVEN THEN INCREMENT TOTAL AND
          // SET WRONG AND POSITION TO   ZERO.
            {
                total++;
                wrong = 0;
              position = 0;
                lcd.clear();
                lcd.print("WRONG");
                 lcd.setCursor(5,2);
                lcd.print("PASSWORD");
                 delay(1000);
                setLocked(true);
            }

           else if(position == 3 && wrong == 0)
            {// IF NO WRONG VALUE   IS GIVEN THEN DISPLAY THE ACCEPTED PASSWORD AND
              // MOVE THE SERVO   MOTOR.
                position = 0;
                wrong = 0;
                lcd.clear();
                lcd.print("PASSWORD");
                lcd.setCursor(6,2);
                 lcd.print("ACCEPTED");
                delay(2000);
                lcd.clear();
                 lcd.print("Door Open");
                delay(2000);
                setLocked(false);
             }

         if(total ==3)// IF TOTAL OF 3 ATTEMPTS ARE DONE BY   ENTERING WRONG PASS
         //WORD THEN SOUND A BUZZER AND SET TOTAL TO 0.
             {
                total=0;
                buzzer_beep();
                 delay(500);
            }

        }

   }

    
}

void setLocked(int locked)// FUNCTION TO CHANGE STATUS OF SERVO   MOTOR.
  {
    if (locked)
     {
         digitalWrite(redPin, HIGH);
         digitalWrite(greenPin, LOW);
        delay(1000);
         servo_Motor.attach(3);
          servo_Motor.write(10);
          delay(1000);
         servo_Motor.detach();
       }
    else
      {
         digitalWrite(redPin, LOW);
          digitalWrite(greenPin,   HIGH);
          delay(1000);
         servo_Motor.attach(3);
          servo_Motor.write(90);
           delay(1000);
         servo_Motor.detach();
      }
 }
void   buzzer_beep()// FUNCTION TO BEEP THE BUZZER.
{
   digitalWrite(buzzer,HIGH);
    delay(1000);
   digitalWrite(buzzer,LOW);
   delay(1000);
   lcd.clear();
    lcd.setCursor(16,0);
   lcd.print("Subscribe Channel");
   lcd.setCursor(16,1);
    lcd.print("For More Videos");
  delay(2000);
   while(1)
   {
    lcd.scrollDisplayLeft();
   delay(200);
   }
}

mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
servo1:GND
servo1:V+
servo1:PWM