Arduino+RFID+Display16x2+teclado4x4 control de acceso

Buen dia. Tengo un proyecto que me ha costado mucho puesto que soy principiante. Ojala alguien pudiera ayudarme.
Tengo que validar primero el tag y si es valido se debe teclear la contraseña para poder activar el relevador. Si el tag es valido pero la contraseña no, no se activa y cuenta como intento fallido, a los 3 intentos debe salir para validar de nuevo un tag.

#include <SPI.h>
#include <MFRC522.h>
#include <Password.h> //Incluimos la libreria Password
#include <Keypad.h> //Incluimos la libreria Keypad
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define RST_PIN 9 //Pin 9 para el reset del RC522
#define SS_PIN 53 //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); ///Creamos el objeto para el RC522

Password password = Password("1A2B3"); //Definimos el Password
int dlugosc = 5; //Largo del Password

LiquidCrystal_I2C lcd(0x3F,16,2); //Definimos los pines del LCD
//Creamos las Variables de salida
int buzzer = 10; //Buzzer para clicks
int chicharra =11; //Chicharra de Alarma
int ledVerde = 12; //Led para indicar que es incorrecto
int ledRojo = 13; //Led para indicar que es correcto

int ilosc; //Numero de Clicks
int intento=0;//Numero de intentos

const byte ROWS = 4; // Cuatro Filas
const byte COLS = 4; // Cuatro Columnas

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

byte rowPins[ROWS] = { 29,28,27,26 };// Conectar los keypads ROW1, ROW2, ROW3 y ROW4 a esos Pines de Arduino.
byte colPins[COLS] = { 25,24,23,22 };// Conectar los keypads COL1, COL2, COL3 y COL4 a esos Pines de Arduino.

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

void setup() {
Serial.begin(9600); //Iniciamos La comunicacion serial
SPI.begin(); //Iniciamos el Bus SPI
mfrc522.PCD_Init(); // Iniciamos el MFRC522
Serial.println("Control de acceso:");

keypad.addEventListener(keypadEvent); //Variable con listener con teclado

//Variables de Salida
pinMode(ledVerde, OUTPUT);
pinMode(ledRojo, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(chicharra,OUTPUT);

digitalWrite(ledRojo, HIGH);
digitalWrite(ledVerde, LOW);

lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Esperando");
lcd.setCursor(0,1);
lcd.print("TAG");
}

byte ActualUID[4]; //almacenará el código del Tag leído
byte Usuario1[4]= {0x93, 0x18, 0x7D, 0x9B} ; //código del usuario 1
byte Usuario2[4]= {0x65, 0x0A, 0x9A, 0xC5} ; //código del usuario 2

void loop() {
int a=0;
if(a==0){
keypad.getKey(); //Variable para obtener tecla que se ha presionado
a++;
}

// Revisamos si hay nuevas tarjetas presentes
if ( mfrc522.PICC_IsNewCardPresent())
{
//Seleccionamos una tarjeta
if ( mfrc522.PICC_ReadCardSerial())
{
// Enviamos serialemente su UID
Serial.print(F("Card UID:"));
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte < 0x10 ? " 0" : " ");
_ Serial.print(mfrc522.uid.uidByte*, HEX); _
ActualUID_=mfrc522.uid.uidByte;
}
Serial.print(" ");
//comparamos los UID para determinar si es uno de nuestros usuarios
if(compareArray(ActualUID,Usuario1)){
Serial.println("Teclea Pass");
a++;
checkPassword();
return;
}
else if(compareArray(ActualUID,Usuario2))
Serial.println("Acceso concedido...");
else*

* Serial.println("Acceso denegado...");*_

* // Terminamos la lectura de la tarjeta tarjeta actual*
* mfrc522.PICC_HaltA();*

* }*
* }*
}
void keypadEvent(KeypadEvent eKey)//Se almacenan las teclas presionadas
{

* switch (keypad.getState())*
* {*
* case PRESSED:*

* int i;*
* for( i = 1; i <= 1; i++ )*
* {*
* digitalWrite(buzzer, HIGH); //Cada que se presiona un tecla suena buzzer*
* delay(200); *
* digitalWrite(buzzer, LOW); *
* delay(100); *
* } *
* switch (eKey)*
* {*
* //Simula esconder el numero presionado*
* default:*
* ilosc=ilosc+1;//Incrementa el numero de digitos*
* password.append(eKey);*
* }*
* //Serial.println(ilosc);*
* if(ilosc == 1)*
* {*
* lcd.clear();*
* lcd.setCursor(1,0);*
* lcd.print(" < NIP >");*
* lcd.setCursor(0,1);*
lcd.print("");
}
if(ilosc == 2)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print(" < NIP >");
lcd.setCursor(0,1);
lcd.print("**");

_ }
if(ilosc == 3)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print(" < NIP >");
lcd.setCursor(0,1);_

lcd.print("");
}

* if(ilosc == 4)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print(" < NIP >");
lcd.setCursor(0,1);_

lcd.print("");
}

if(ilosc == 5)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print(" < NIP >");
lcd.setCursor(0,1);
lcd.print("*****");

_ }
if(ilosc == dlugosc)
{
delay(250);
checkPassword();
ilosc = 0;
}
}
}
void checkPassword()
{
if(intento>=3)
{//Si alcanza los 3 intentos fallidos*

* digitalWrite(chicharra,HIGH);
lcd.clear();
lcd.setCursor(0,1);
lcd.print("<>");
lcd.setCursor(1,0);
lcd.print("ACCESO DENEGADO");
delay(20000);
intento=0;
}*_

* if (password.evaluate())//Si el password es correcto*
* {*
* int i;*
* for( i = 1; i <= 3; i++ )//Suena 3 veces el buzzer*
* {*
* digitalWrite(buzzer, HIGH); *
* delay(120); *
* digitalWrite(buzzer, LOW); *
* delay(70); *
* } *
* ilosc = 0;*
* password.reset();*

* digitalWrite(ledRojo, LOW);//Led verde enciende indicando que es correcto el password*
* digitalWrite(ledVerde, HIGH);*
* lcd.clear();*
* lcd.setCursor(0,0);*
* lcd.print("<>");*
* lcd.setCursor(0,1);*
* lcd.print("PUEDE INGRESAR");*
* digitalWrite(chicharra, LOW); *
* delay(20000);*
* digitalWrite(ledVerde, LOW);*
* digitalWrite(ledRojo, HIGH); *

* lcd.clear();*
* lcd.setCursor(0,0);*
_ lcd.print(" *");
lcd.setCursor(0,1);
lcd.print("Ingrese NIP");
intento=0;
}
else
{
int i;
for( i = 1; i <= 1; i++ )
{
digitalWrite(buzzer, HIGH);
delay(300);
digitalWrite(buzzer, LOW);
delay(100);
}
ilosc = 0;
password.reset();
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, HIGH); *_

* lcd.clear();*
* lcd.setCursor(0,1);*
* lcd.print("<>");*
* lcd.setCursor(1,0);*
* lcd.print("ACCESO DENEGADO");*
* intento++;*
* delay(2000);*

* lcd.clear();*
* lcd.setCursor(0,0);*
_ lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Ingrese NIP");
}
}
//Función para comparar dos vectores

boolean compareArray(byte array1[],byte array2[])
{
* if(array1[0] != array2[0])return(false);
if(array1[1] != array2[1])return(false);
if(array1[2] != array2[2])return(false);
if(array1[3] != array2[3])return(false);
return(true);
}*_

Pero no estas informando cual es tu problema, solo dijiste lo que debe hacer tu proyecto pero no has dicho en que te estas estancando o que problemas tienes.

Tengo que validar primero el tag y si es valido se debe teclear la contraseña para poder activar el relevador. Si el tag es valido pero la contraseña no, no se activa y cuenta como intento fallido, a los 3 intentos debe salir para validar de nuevo un tag.
En el codigo que publique, tiene los sketch del RFID y el Password con el teclado 4x4 pero no logro convinarlos para que me haga lo que al principio especifique.

Según trato de entender tu código: Esta es la parte esencial..

    //Seleccionamos una tarjeta
           if ( mfrc522.PICC_ReadCardSerial()) 
           {
                 // Enviamos serialemente su UID
                 Serial.print(F("Card UID:"));
                 for (byte i = 0; i < mfrc522.uid.size; i++) {
                         Serial.print(mfrc522.uid.uidByte < 0x10 ? " 0" : " ");
                         Serial.print(mfrc522.uid.uidByte, HEX);   
                         ActualUID=mfrc522.uid.uidByte;          
                 } 
                 Serial.print("     ");                 
                 //comparamos los UID para determinar si es uno de nuestros usuarios  
                 if(compareArray(ActualUID,Usuario1)){

Ahora bien, si te fijas, la ID de la tarjeta se almacena en la variable ActualUID... Lo que debes hacer es comparar con un if de la siguiente manera:

     //Seleccionamos una tarjeta
           if ( mfrc522.PICC_ReadCardSerial()) 
           {
                 // Enviamos serialemente su UID
                 Serial.print(F("Card UID:"));
                 for (byte i = 0; i < mfrc522.uid.size; i++) {
                         Serial.print(mfrc522.uid.uidByte < 0x10 ? " 0" : " ");
                         Serial.print(mfrc522.uid.uidByte, HEX);   
                         ActualUID=mfrc522.uid.uidByte;          
                 } 
                 Serial.print("     ");                 
                 //comparamos los UID para determinar si es uno de nuestros usuarios  
                 if(compareArray(ActualUID,Usuario1)){
                          checkPassword();
  
                 }
                 if(compareArray(ActualUID,Usuario2)){
                          checkPassword();
  
                 }

Ahora, asi has logrado comparar la ID de la tarjeta con lo almacenado y si una de ellas coincide entonces ejecutas la funcion checkPassword();

En esta función tu debes verificar que el password introducido sea el correcto y si no es entonces al tercer intento debe de pedir nuevamente el tag.

No estoy seguro de si será necesario pero creo que en la función checkpassword(); debe enviarte a traves de un salto al inicio del loop para pedir nuevamente la ID una vez alcanzado el tercer intento fallido pero no recuerdo como hacer eso. Si mis compañeros me apoyan no me vendría mal..

Modifica con lo sugerido y me comentas...