Saludos
Tienes en tu Sketch varias cosas que son molestas, por ejemplo el uso de delay
Segundo, para que funcione bien debes reiniciar los password (ambos) en cada comparación, así te eliminas dos problemas, el que tienes que solo funciona a veces, y otra que no te adivinen la clave al ir presionando una por una.
Le hice unas modificaciones a tu sketch para que corra de una forma que mas me gusta a mi. y para adaptarlo a una tarjeta Mega.
/*
2 claves
password_lcd.pde
Basado en artículos de la red.
Modificado y adaptado el 07.11.2011 por V. Garcia.
Para hispavila.com
Utilizamos las librerías: [Password.h LiquidCrystal.h Keypad.h]
que puede encontrar en: http://hispavila.com/3ds/atmega/clavenum.html
Usando el actual ejemplo de hardware se pueden activa algo o desactivar
mediante el teclado - emulando lo que se puede encontrar en algunos
sistemas de alarma y así sucesivamente. Nuestro objetivo con este ejemplo
es muy simple. Un sistema de espera para obtener un PIN que se especifique
previamente. Si el PIN es correcto, hacer algo. Si el PIN es incorrecto,
hacer otra cosa. Lo que las acciones pueden llegar a hacer. Con el proyecto
vamos a activar o desactivar una salida digital. Este ejemplo es para
darle un concepto y un marco para adaptar o construir ideas propias.
Usa 7718 bytes con el IDE v. 00013
*/
/*
Control de acceso.
Programacion modificada del original, el 14 de agosto del 2014.
*/
// Librerias:
#include <Password.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
Password password1 = Password( "8230553" ); // pasword.
Password password2 = Password( "14497039" );
const byte ROWS = 4; // Cuatro rows
const byte COLS = 4; // Tres columns
// Define el Keymap del teclado
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
// pines del teclado:
byte rowPins[ROWS] = { 30,32,34,36 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 22,24,26,28 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
// Variables:
int buttonState = 0;
//int i;
// Crear el Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
// asigna los pines:
#define relepuerta1 A9
#define relepuerta2 A10
#define ledVerde A11
#define ledRojo A12
#define luz A13
#define puerta A14
#define luzteclado A15
#define luzlcd 10
unsigned long tiempo;
void setup(){
pinMode(A8, OUTPUT);
digitalWrite(A8,LOW);
// define los tipos de pines:
pinMode(relepuerta1, OUTPUT);
pinMode(relepuerta2, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledRojo, OUTPUT);
pinMode(luzlcd, OUTPUT);
pinMode(luzteclado, OUTPUT);
digitalWrite(luzlcd, HIGH);
lcd.begin(16, 2);
// define los pines en el arranque:
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, LOW);
digitalWrite(luzteclado, LOW);
digitalWrite(relepuerta1, LOW);
digitalWrite(relepuerta2, LOW);
Serial.begin(9600);
keypad.addEventListener(keypadEvent); // añad. evento listener al keypad
keypad.setDebounceTime(250);
lcd.clear(); // borra el lcd.
lcd.setCursor(2,0); // posicion donde empieza a escribir.
lcd.print("Pulse Codigo");
lcd.setCursor(0,1);
}
void loop(){
keypad.getKey();
}
// atender algunos eventos especiales
void keypadEvent(KeypadEvent eKey){
switch (keypad.getState()){
case PRESSED:
switch (eKey){
case '#': guessPassword();
break;
default:
lcd.print('*');
password1.append(eKey);
password2.append(eKey);
digitalWrite(luzlcd, HIGH);
digitalWrite(luzteclado, HIGH);
tiempo= millis();
}
}
}
void guessPassword(){
if (password1.evaluate()){
digitalWrite(relepuerta1, HIGH); // desactiva relé2 de la puerta
delay(500);
digitalWrite(relepuerta1, LOW); // desactiva relé2 de la puerta
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CODIGO CORRECTO"); //
reset_password(); //resets password after INCORRECT entry
delay(1000);
lcd.setCursor(0,1);
lcd.print("PASE, POR FAVOR");
// delay(1000);
// for (int positionCounter = 0; positionCounter < 22; positionCounter++)
delay(2000); // espera 35 segundos antes de volver añ inicio
// digitalWrite(ledVerde,LOW); // desactiva LED de la puerta
setup(); // al inicio
}
else if (password2.evaluate()){
digitalWrite(relepuerta2, HIGH); // desactiva relé2 de la puerta
delay(500);
digitalWrite(relepuerta2, LOW); // desactiva relé2 de la puerta
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CODIGO CORRECTO"); //
reset_password(); //resets password after INCORRECT entry
delay(1000);
lcd.setCursor(0,1);
lcd.print("PASE, POR FAVOR");
// delay(1000);
// for (int positionCounter = 0; positionCounter < 22; positionCounter++)
delay(2000); // espera 35 segundos antes de volver añ inicio
// digitalWrite(ledVerde,LOW); // desactiva LED de la puerta
setup(); // al inicio
}
else{
// i = i++;
digitalWrite(ledRojo,HIGH);
lcd.clear();
lcd.print("CODIGO INVALIDO");
reset_password(); //resets password after INCORRECT entry
//delay(3000); // tiempo de retardo
//lcd.clear();
lcd.setCursor(0,1);
lcd.print("Pruebe de nuevo");
delay(5000);
digitalWrite(ledRojo, LOW);
setup(); // al inicio
}
if (millis() -tiempo > 2000){
digitalWrite(luzlcd, LOW);
digitalWrite(luzteclado, LOW);
}
}
void reset_password(){
password1.reset(); // resetea password despues de entrada correcta
password2.reset(); // resetea password despues de entrada correcta
}