#include <Keypad.h>
//*********************************************************************
//keypad_4X4
//Specified pins are for the Arduino UNO R3
//This code is in the public domain.
//*********************************************************************

// Variables del programa

#define TAM 11
#define STR_NULL ""

String claves[] = {
                    "12A4",
                    "79BC",
                    "3A4D",
                    "5086",
                    STR_NULL
                  };

char clave_ingresada[TAM];
int i;
char tecla;

// Estados
#define SOLICITUD_CLAVE 0
#define INGRESO_CLAVE 1
#define VALIDACION 2
#define ACCESO 30
#define NO_ACCESO 40

int estado; 

// ----------------------------------------

bool validar_clave(String clave_ingresada, String claves_sistema[]);

//-----------------------------------------

#define row1 11
#define row2 10
#define row3 9
#define row4 8

#define col1 7
#define col2 6
#define col3 5
#define col4 4

const byte ROWS = 4; /* four rows */
const byte COLS = 4; /* four columns */

/* define the symbols on the buttons of the keypads */
char keyMap[ROWS][COLS] = {
  {'1','2','4','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = {row1, row2, row3, row4}; /* connect to the row pinouts of the keypad */
byte colPins[COLS] = {col1, col2, col3, col4}; /* connect to the column pinouts of the keypad */

/* initialize an instance of class NewKeypad */
Keypad teclado = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS); 


void setup() {
  Serial.begin(9600);
  Serial.println("Prueba teclado");
  // Inicializar variables
  i = 0;
  estado = SOLICITUD_CLAVE;
  char X[] = "hola";
  String Xs(X);
  String Y = "holx";
  Serial.println(Xs == Y);
}


void loop() {
  
  switch(estado) {
    case ACCESO:
      Serial.println("Estado: Acceso");
      Serial.println("Acceso consedido");
      //delay(3000);
      estado = SOLICITUD_CLAVE;
      break;
    case SOLICITUD_CLAVE:
      Serial.print("Digite la clave de acceso: ");
      estado = INGRESO_CLAVE;
      break;
    case INGRESO_CLAVE:
      // Serial.println("Estado: Ingreso clave");
      tecla = teclado.getKey();
      // Clave
      if(tecla){
        if(tecla != '#') {
          Serial.print(tecla);
          clave_ingresada[i] = tecla;
          i++;
        }
        else {
          clave_ingresada[i] = '\0';
          // Serial.println(clave_ingresada);
          i = 0;
          estado = VALIDACION;
        }
      }
      break;
    case VALIDACION:
      Serial.println("Estado: Validacion");
      // Clave
      String clave_str(clave_ingresada);
      if(validar_clave(clave_str, claves)) {
        Serial.println("Acceso consedido");
        estado = ACCESO;
      }
      else {
        Serial.println("Acceso no consedido");
        estado = NO_ACCESO;
      }
      Serial.println(estado);
      // estado = SOLICITUD_CLAVE;
      break;
    case NO_ACCESO:
      Serial.println("Rechazo");
      Serial.println("Acceso rechazado");
      //delay(3000);
      estado = INGRESO_CLAVE;
      break;
  }
}

bool validar_clave(String clave_ingresada, String claves_sistema[]) {
  int i = 0;
  // Serial.println(clave_ingresada);
  bool resultado = false;
  while(claves_sistema[i] != NULL) {
    // Serial.println(claves_sistema[i]);
    if(clave_ingresada == claves_sistema[i]) {
      resultado = true;
      break;
    }
    i++;
  }
  // Serial.println(resultado);
  return resultado;
} 
$abcdeabcde151015202530354045505560fghijfghij