#include <Keypad.h>
#include<LiquidCrystal.h>
#include<EEPROM.h>
LiquidCrystal lcd(9,8,7,6,5,4);
char password[7];
char pass[7],pass1[7];
int i=0;
char customKey=0;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {A0,A1,A2,A3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {A4,A5,3,2};   //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
int led;
int buzzer = 10;
int m11;
int m12;
int output = 13;

void setup()
{
  Serial.begin(9600);


  lcd.begin(16,2);
  pinMode(led, OUTPUT);
  pinMode(output, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(m11, OUTPUT);
  pinMode(m12, OUTPUT);

  lcd.print(" Electronic ");
  Serial.print(" Electronic ");
  lcd.setCursor(0,1);
  lcd.print(" BOMB Lock ");
  Serial.print(" Bomb Lock ");
  delay(2000);
  lcd.clear();
  lcd.print("Enter Passkey:");
  Serial.println("Enter Passkey:");
  lcd.setCursor(0,1);
  for(int j=0;j<7;j++)
    EEPROM.write(j, j+49);
  for(int j=0;j<7;j++)
    pass[j]=EEPROM.read(j);
}

void loop()
{
  digitalWrite(11, HIGH);
  customKey = customKeypad.getKey();
  if(customKey=='#')
    change();
  if (customKey)
  {
    password[i++]=customKey;
    lcd.print(customKey);
    Serial.print(customKey);
    //beep();
  }
  if(i==7)
  {
    delay(200);
    for(int j=0;j<7;j++)
      pass[j]=EEPROM.read(j);
    if(!(strncmp(password, pass,7)))
    {
      digitalWrite(led, HIGH);
      digitalWrite(output, HIGH);
      //beep();
      lcd.clear();
      lcd.print("Passkey Accepted");
      Serial.println("Passkey Accepted");
      digitalWrite(11, LOW);
      delay(2000);
      //lcd.setCursor(0,1);
      //lcd.print("# Change Passkey");
      //Serial.println("#.Change Passkey");
      delay(2000);
      //lcd.clear();
      //lcd.print("Enter Passkey:");
      //Serial.println("Enter Passkey:");
      //lcd.setCursor(0,1);
      //i=0;
      //digitalWrite(led, LOW);
    }
    else
    {
      digitalWrite(11, HIGH);
      digitalWrite(buzzer, HIGH);
      lcd.clear();
      lcd.print("Access Denied...");
      Serial.println("Access Denied...");
      lcd.setCursor(0,1);
      //lcd.print("# Change Passkey");
      //Serial.println("#.Change Passkey");
      delay(2000);
      lcd.clear();
      lcd.print("Enter Passkey:");
      Serial.println("Enter Passkey:");
      lcd.setCursor(0,1);
      i=0;
      digitalWrite(buzzer, LOW);
    }
  }
}
void change()
{
  int j=0;
  lcd.clear();
  lcd.print("Current Password");
  Serial.println("Current Password");
  lcd.setCursor(0,1);
  while(j<7)
  {
    char key=customKeypad.getKey();
    if(key)
    {
      pass1[j++]=key;
      lcd.print(key);
      Serial.print(key);
      beep();
    }
    key=0;
  }
  delay(500);

  if((strncmp(pass1, pass, 7)))
  {
    lcd.clear();
    lcd.print("Wrong Passkey...");
    Serial.println("Wrong Passkey...");
    lcd.setCursor(0,1);
    lcd.print("Better Luck Again");
    Serial.println("Better Luck Again");
    delay(1000);
  }
  else
  {
    j=0;
    lcd.clear();
    lcd.print("Enter New Pass:");
    Serial.println("Enter New Pass:");
    lcd.setCursor(0,1);
    while(j<7)
    {
      char key=customKeypad.getKey();
      if(key)
      {
        pass[j]=key;
        lcd.print(key);
        Serial.print(key);
        EEPROM.write(j,key);
        j++;
        beep();
      }
    }
    lcd.print(" Done......");
    Serial.println(" Done......");
    delay(1000);
  }
  lcd.clear();
  lcd.print("Enter Password:");
  Serial.println("Enter Password:");
  lcd.setCursor(0,1);
  customKey=0;
}
void beep()
{
  digitalWrite(buzzer, HIGH);
  delay(20);
  digitalWrite(buzzer, LOW);
}
