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);
}*_