Estoy intentando hacer un control de acceso con contraseña y rfid, la parte de las contraseñas ya me funciona, mi problema es con rfid, para evitar accidentes en caso de perder la tarjeta estoy dividiéndolas, un grupo de tarjetas tendrá la keyA1 y otro la keyA2, pienso hacer esto con otros 10 grupos mas, en el código de abajo solo me funciona con la keyA1, mi lógica decía que la variable estado iba a cambiar al momento después de ver que la keyA1 no coincidía con la contraseña de la tarjeta, y la verdad ya no estoy seguro de que hacer
#include <Keypad.h>
#include <Wire.h>
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key keyA1 = {keyByte: {0xA7, 0x8B, 0x5E, 0x00, 0xA5, 0xFF}};
MFRC522::MIFARE_Key keyA2 = {keyByte: {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}};
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28};
byte colPins[COLS] = {30, 32, 34, 36};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
byte trailerBlock=63;
byte status;
int relay=40;
int buzzer=7;
int ledrojo=10;
int ledverde=11;
int ledazul=12;
int cursor=0;
const String clave1 = "2083";
const String clave2 = "7852";
const String clave3 = "8319";
const String clave4 = "3853";
const String clave5 = "5272";
const String clave6 = "9478";
const String clave7 = "9204";
const String clave8 = "6454";
const String clave9 = "8354";
const String clave10 = "2058";
const String clave11 = "7952";
const String clave12 = "0348";
String input = "";
void(* resetFunc)(void) = 0;
void setup() {
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode (buzzer, OUTPUT);
pinMode (relay, OUTPUT);
pinMode (ledrojo, OUTPUT);
pinMode (ledverde, OUTPUT);
pinMode (ledazul, OUTPUT);
digitalWrite(relay, HIGH);
digitalWrite (ledrojo, LOW);
digitalWrite (ledverde, LOW);
digitalWrite (ledazul, LOW );
}
void loop() {
delay(200);
digitalWrite(ledrojo, LOW);
digitalWrite (ledverde, LOW);
digitalWrite(ledazul, HIGH);
char llave = keypad.getKey();
//------------------------------------------------TECLADO---------------------------------
if (llave != '\0') {
input += llave;
cursor++;
tone(buzzer,350);
delay(200);
noTone(buzzer);
if (input.length() == 4) {
if (input == clave1 || input == clave2 || input == clave3 || input == clave4 || input == clave5 || input == clave6 || input == clave7|| input == clave8|| input == clave9|| input == clave10|| input == clave11|| input == clave12) {
tone(buzzer, 1000, 1000);
digitalWrite(relay, LOW);
digitalWrite (ledverde, HIGH);
digitalWrite (ledazul, LOW);
delay(3000);
resetFunc();
} else {
tone(buzzer, 200, 1000);
digitalWrite (ledrojo, HIGH);
digitalWrite (ledazul, LOW);
delay(1000);
resetFunc();
}
}
}
//---------------------------------------------------RFID---------------------------------
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
return;
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
// Check for compatibility
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println("This sample only works with MIFARE Classic cards.");
return;
}
contrasena();
}
void contrasena(){
MFRC522::StatusCode estado;
estado = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &keyA1, &(mfrc522.uid));
if (estado == MFRC522::STATUS_OK) {
tone(buzzer, 1000, 1000);
digitalWrite(relay, LOW);
digitalWrite (ledverde, HIGH);
digitalWrite (ledazul, LOW);
delay(3000);
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
resetFunc();
}
estado = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &keyA2, &(mfrc522.uid));
if (estado == MFRC522::STATUS_OK) {
tone(buzzer, 1000, 1000);
digitalWrite(relay, LOW);
digitalWrite (ledverde, HIGH);
digitalWrite (ledazul, LOW);
delay(3000);
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
resetFunc();
}
tone(buzzer, 200, 1000);
digitalWrite (ledrojo, HIGH);
digitalWrite (ledazul, LOW);
delay(1000);
resetFunc();
}