//#include <SPI.h>
//#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
#define SS_PIN 10
#define RST_PIN 9

//MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class

//MFRC522::MIFARE_Key mkey; 
//char d,d1,d2,d3,d10,d11,d12,d13;
//int c,cpa,tag;
//bool cp,np,ok,m;
// Init array that will store new NUID 
//byte nuidPICC[4];

//-------keypad setting-----------------
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {2,3,4,5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6,7,8}; //connect to the column pinouts of the keypad

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

//-------------lcd function declaration---------------------



void setup() { 
 // Serial.begin(9600);
  
 // pinMode(14, OUTPUT); 
  lcd.begin();
  lcd.backlight();
  lcd.print("SCAN YOUR ID TAG");
  lcd.setCursor(0, 1);

  
  //SPI.begin(); // Init SPI bus
  //rfid.PCD_Init(); // Init MFRC522 

 // for (byte i = 0; i < 6; i++) {
  // mkey.keyByte[i] = 0xFF;
  }

  //Serial.println(F("This code scan the MIFARE Classsic NUID."));
 //--set def pass
 //if(EEPROM.read(0)>1|EEPROM.read(0)<1){
  //EEPROM.update(0, 1);
  //  EEPROM.update(1, '1');
  // EEPROM.update(2, '2');
  //EEPROM.update(3, '3');
  //EEPROM.update(4, '4');
  }  
//d= EEPROM.read(1);
//d1= EEPROM.read(2);
//d2= EEPROM.read(3);
//d3= EEPROM.read(4);
 
}
 
void loop() {

//--------------------------keypad sec code----------------------
char k = keypad.getKey();
 
  if (k){
    c++;
       Serial.println(k);  
     
  lcd.print("*");
     if(c==1){
      d10=k;
      }
      if(c==2){
      d11=k;
      }
       if(c==3){
      d12=k;
      }
       if(c==4){
      d13=k;
      
      }
  }
  if (k=='#'){m=c=cp=np=tag=0;  lcd.clear();  lcd.print("SCAN YOUR ID TAG");}


  
  if(c==4&np==0){
    c=0;
   if(d10=='*'&d11=='0'&d12=='0'){
    m=1;
    lcd.clear();  lcd.print("ENTER PASSWORD   ");
    switch(d13){
        case '0':
      cp=1;
        
      break;
        case '1':
          
      tag=1;
      break;
       case '2':
      tag=2;
      break;
       case '3':
      tag=3;
      break;
       case '4':
      tag=4;
      break;
       case '5':
      tag=5;
      break;
     

      }
    d10=d11=d12=d13=0;
    } 
  if(d==d10&d1==d11&d2==d12&d3==d13){
    if(cp==0&m==0){
    lcd.setCursor(0, 1); 
    lcd.print("PASSWORD ACCEPTED");
    digitalWrite(14,HIGH);
     delay(3000);
      digitalWrite(14,LOW);
     d10=d11=d12=d13=0;
   lcd.setCursor(0, 1); 
    lcd.print("                ");
    lcd.setCursor(0, 1); 
    }if(cp==1&tag==0){
   lcd.clear(); 
   lcd.print("NEW PASSWORD");
    lcd.setCursor(0, 1);
    np=1;
    }
      if(tag>0){
        
        lcd.clear(); 
   lcd.print("SCAN ID TAG # ");
   lcd.print(tag);
     lcd.setCursor(0, 1);
        }
   m=0; }else{
   if(!m){ lcd.setCursor(0, 1);
   lcd.print("WRONG PASSWORD");delay(3000);}
      
      
     d10=d11=d12=d13=0;
  lcd.setCursor(0, 1);
   lcd.print("                ");
    lcd.setCursor(0, 1);
      
      }  

      
     
    
      
      
      }
    
    


    
if(c==4&np==1){
   m=0;
    d=d10;
    d1=d11;
    d2=d12;
    d3=d13;
    EEPROM.update(1, d);
    EEPROM.update(2, d1);
    EEPROM.update(3, d2);
    EEPROM.update(4, d3);
    np=0;
    cp=0;
    c=0;
    d10=d11=d12=d13=0;
   lcd.clear();  lcd.print("SCAN YOUR ID TAG");
lcd.setCursor(0, 1);
    }
  
//---rfid----------------------
  // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
    return;
   printDec(rfid.uid.uidByte, rfid.uid.size);
    Serial.println(); 

  if(tag>0){
      switch(tag){
        case 1:
     EEPROM.update(5, rfid.uid.uidByte[0] );
    EEPROM.update(6, rfid.uid.uidByte[1] );
    EEPROM.update(7, rfid.uid.uidByte[2] );
    EEPROM.update(8, rfid.uid.uidByte[3] );
      break;
       case 2:
       EEPROM.update(9, rfid.uid.uidByte[0] );
    EEPROM.update(10, rfid.uid.uidByte[1] );
    EEPROM.update(11, rfid.uid.uidByte[2] );
    EEPROM.update(12, rfid.uid.uidByte[3] );
      break;
       case 3:
       EEPROM.update(13, rfid.uid.uidByte[0] );
    EEPROM.update(14, rfid.uid.uidByte[1] );
    EEPROM.update(15, rfid.uid.uidByte[2] );
    EEPROM.update(16, rfid.uid.uidByte[3] );
      break;
       case 4:
       EEPROM.update(17, rfid.uid.uidByte[0] );
    EEPROM.update(18, rfid.uid.uidByte[1] );
    EEPROM.update(19, rfid.uid.uidByte[2] );
    EEPROM.update(20, rfid.uid.uidByte[3] );
      break;
       case 5:
       EEPROM.update(21, rfid.uid.uidByte[0] );
    EEPROM.update(22, rfid.uid.uidByte[1] );
    EEPROM.update(23, rfid.uid.uidByte[2] );
    EEPROM.update(24, rfid.uid.uidByte[3] );
      break;
      
     }  tag=0;d10=d11=d12=d13=0;
        lcd.setCursor(0, 1);
     lcd.print("  TAG ID SAVED  ");
 
delay(2000);
   lcd.clear(); 
  lcd.print("SCAN YOUR ID TAG");
 
     cp=0;
    c=0;
    }else for (int i = 1; i < 6; i++){ 
  if (rfid.uid.uidByte[0] == EEPROM.read((i*4)+1)&
    rfid.uid.uidByte[1] == EEPROM.read((i*4)+2) &
    rfid.uid.uidByte[2] == EEPROM.read((i*4)+3) & 
    rfid.uid.uidByte[3] == EEPROM.read((i*4)+4) ) ok=1;}
    
    if(ok==1){
      ok=0;
    Serial.println(F("A new card has been detected."));
  lcd.setCursor(0, 1);
  lcd.print("ID TAG ACCEPTED ");
digitalWrite(14,HIGH);
delay(3000);
  lcd.setCursor(0, 1); 
  lcd.print("                ");
 digitalWrite(14,LOW);  
 return;
  }else {
    lcd.setCursor(0, 1);
     lcd.print(" ACCESS DENIED ");
 
 delay(2000);
   lcd.setCursor(0, 1); 
  lcd.print("                ");

    }
  
 
 

  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();



  
}
//------------------loop end function start---------------------
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], DEC);
  }
}
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