Hola a todos.
Estoy intentando desde hace semanas hacer que un Arduino UNO encienda un led verde cuando la tarjeta A esté en el lector A y la tarjeta B esté en el lector B o un led rojo en caso de que alguna tarjeta no sea la correcta. Funciona durante un rato, a veces durante horas o días y otras durante unos minutos; pero tarde o temprano se bloquea y deja de leer tarjetas.
He probado todo lo que se me ha ocurrido, como probar distintas maneras de hacer funcionar los lectores. He empezando el código desde 0 por si había algún error que por lo que sea no veía, pero siempre acaba bloqueándose. También lo he instalado en 4 Arduinos diferentes (entre ellos NANO y MEGA) con lectores diferentes y siempre obtengo el mismo resultado.
¿Alguien sabe qué puede estar mal en el código para que se bloquee?
Gracias de antemano.
#include <SPI.h> //Incluye esta librería
#include <MFRC522.h> //Incluye esta librería
#define RST_PIN 9 //Define el pin que va a RST
#define pinA 10 //Define el pin que va a SDA del lector A
#define pinB 6 //Define el pin que va a SDA del lector B
#define ledVerde 3 //Define el pin al que va el led verde
#define ledRojo 4 //Define el pin al que va el led verde
byte codigo[2][4] = { //Código de las tarjetas. Se pone 0x (para indicar que es hexadecimal) seguido de la clave de las tarjetas en los cuatro números (en este caso: 01:EB:25:1C)
{0x01, 0xEB, 0x25, 0x1C},
{0x01, 0xDE, 0x2C, 0x1C}
};
byte lectura [2][4]; //Crea el array para almacenar el UID del lector correspondiente
byte ssPins[] = {PIN_A, PIN_B}; //Escribe el nombre de todos los pines que van a cada lector (al SDA). Están nombrados arriba
byte nLectores = 2; //Indica cuántos lectores tenemos.
bool verifica [2] = {false, false}; //La verificación de A es falsa porque no se ha puesto la tarjeta correcta en el lector A. El último verifica impide que el programa entre en bucle cuando se ejecuta el código correcto
bool correcto = false; //Será true cuando cada tarjeta esté en su lector
MFRC522 mfrc522[2];
void setup(){
Serial.begin(9600); //Inicia el puerto para poder leerla con el monitor serial
SPI.begin(); //Inicia el Bus SPI
for (byte x=0; x<nLectores; x++) { //Bucle para activar y comprobar que todos los lectores son correctos
mfrc522[x].PCD_Init(ssPins[x], RST_PIN); //Inicia el lector
Serial.print(F("Lector ")); //Imprime "Lector "
Serial.print(x); //Imprime el número del lector
Serial.print(F(": ")); //Imprime ": "
mfrc522[x].PCD_DumpVersionToSerial(); //Imprime la versión del lector
}
} //Fin de setup
void loop(){
for(byte x=0; x<nLectores; x++){ //Bucle para activar los lectores uno por uno
if (mfrc522[x].PICC_IsNewCardPresent() && mfrc522[x].PICC_ReadCardSerial()){ //Se activa cuando una nueva tarjeta es puesta en el lector x
Serial.print("Lector "); //Imprime "Lector "
Serial.print(x); //Imprime el número del lector
Serial.print(": "); //Imprime ": "
for(byte i=0; i<mfrc522[x].uid.size; i++){ //Bucle recorre todo el UID para leer la tarjeta y almacenar su valor en la variable lectura:
if(mfrc522[x].uid.uidByte[i]<0x10){ //si el byte leído es menor a 0x10
Serial.print(" 0"); //imprime espacio en blanco y numero cero,
}else{ Serial.print(" ");} //si no, imprime espacio en blanco
Serial.print(mfrc522[x].uid.uidByte[i], HEX); //Imprime el byte del UID leído hexadecimal
lectura[x][i]=mfrc522[x].uid.uidByte[i]; //Almacena el dato que lee en el lector x, posición i en la variable Lectura posición xi.
} //Bucle recorre todo el UID para leer la tarjeta y almacenar su valor en la variable lectura
Serial.println("\t"); //Imprime tabulación
mfrc522[x].PICC_HaltA(); //Detiene la comunicación con la tarjeta
mfrc522[x].PCD_StopCrypto1(); //Detiene el cifrado de PCD
for(byte i=0; i<mfrc522[x].uid.size; i++){ //Bucle que recorre todo el UID para comprobar si la tarjeta está en la posición correcta:
if(lectura[x][i] != codigo[x][i]){ //Si el valor que se ha guardado al leer la tarjeta x en la posición i es distinto al código x en la posición i:
verifica[x]=false; //la variable verifica en la posición x vuelve a ser falsa
i=mfrc522[x].uid.size; //y sale del loop
}else{ //Si el valor es correcto:
verifica[x]=true; //la variable verifica en la posición x vuelve a ser verdadera
} //y continúa
} //Bucle que recorre todo el UID para comprobar si la tarjeta está en la posición correcta
} //Se activa cuando una nueva tarjeta es puesta en el lector x
} //Bucle para activar los lectores uno por uno
for(uint8_t x=0; x<nLectores; x++){ //Bucle para comprobar uno a uno si cada verifica de cada tarjeta es correcto:
if(verifica[x]){ //Si la variable verifica en la posición x es correcta:
correcto=true; //Convierte la variable correcto en verdadera y continúa
}else{ //Si la variable verifica en la posición x es incorrecta:
correcto=false; //la variable correcto vuelve a ser falsa
x=nLectores; //y sale del bucle.
}
}
if(correcto){ //Función que se ejecuta cuando todas las tarjetas están en los lectores correctos.
digitalWrite(ledVerde, HIGH); //Enciende el led verde
digitalWrite(ledRojo, LOW); //Apaga el led rojo
}else{ //Alguna tarjeta no está en su lector
digitalWrite(ledVerde, LOW); //Apaga el led verde
digitalWrite(ledRojo, HIGH); //Enciende el led rojo
}
} //Fin de loop()