Hola a todos. Llevo días buscando información para resolver el problema que tengo con mi proyecto de Arduino UNO pero no soy capaz de dar con ello.
El objetivo es que cuando se coloque la tarjeta A en el lector rfid A y la B en el lector B, se active un relé (que desactiva una cerradura electromagnética). En un principio iban a ser tres, pero a veces uno de los sensores dejaba de funcionar (unas veces uno y otras otro...), otras se congelaba, etc.
Resumiendo: al cabo de un rato el programa se reinicia (por el watchdog, antes de este simplemente se quedaba pillado) y no entiendo el porqué. Si alguien sabe qué pasa o se le ocurre alguna solución, agradezco cualquier comentario.
Por cierto, la idea es que se desactive el electroimán unos segundos y después se bloquee de nuevo, pero las tarjetas se quedan en los lectores, de ahí la variable "unavez". Y no adjunto el esquema porque no creo que sea el problema ya que en un primer momento funciona, es al cabo de unos 30-40 minutos cuando empieza a bloquearse.
#include <SPI.h> //Incluye las librerías
#include <MFRC522.h>
#include <avr/wdt.h>
#define RST_PIN 9 //Define el pin que va a RST
#define PIN_A 10 //Define el pin que va a SDA del lector A
#define PIN_B 8 //Define el pin que va a SDA del lector B
#define Rele 2 //Rele normalmente cerrado conectado al pin 2 que activa(LOW)/desactiva(HIGH) un electroimán
byte TARJETA_A[4] = {0x37, 0x01, 0x11, 0x3C}; //Código de la TARJETA_A
byte TARJETA_B[4] = {0x8B, 0x7C, 0xD7, 0x10}; //Código de la TARJETA_B
byte Lectura_A[4];
byte Lectura_B[4];
bool verifica_A = false; //Verifica si la tarjeta A es la correcta
bool verifica_B = false; //Verifica si la tarjeta B es la correcta
bool unavez = false; //Solo permite ejecutarlo una vez (a menos que se intercambien las tarjetas y se vuelvan a colocar correctamente)
byte ssPins[] = {PIN_A, PIN_B};
MFRC522 mfrc522[2];
void setup()
{
wdt_disable(); //Desactiva el watchdog mientras se configura, para que no se resetee
wdt_enable(WDTO_8S); //Configura el watchdog en 8 segundos
Serial.begin(9600);
SPI.begin();
for (uint8_t reader = 0; reader < 2; reader++) {
mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN);
Serial.print(F("Lector "));
Serial.print(reader);
Serial.print(F(": "));
mfrc522[reader].PCD_DumpVersionToSerial();
}
pinMode(Rele, OUTPUT);
digitalWrite(Rele, LOW);
}
void loop()
{
wdt_reset(); //Actualiza el watchdog para que no produzca un reinicio
if (mfrc522[0].PICC_IsNewCardPresent()){ //Se activa cuando una nueva tarjeta es puesta en el lector A (el 0)
Serial.println("Lector A: ");
if(mfrc522[0].PICC_ReadCardSerial()){ //Selecciona una tarjeta nueva
for(byte i=0; i<mfrc522[0].uid.size;i++){ //Bucle recorre todo el UID,
if(mfrc522[0].uid.uidByte[i]<0x10){ //si el byte leído es menor a 0x10
Serial.print(" 0"); //imprime espacio en blanco y numero cero,
}else{ //si no,
Serial.print(" "); //imprime espacio en blanco
}
Serial.print(mfrc522[0].uid.uidByte[i], HEX); //Imprime el byte del UID leído hexadecimal
Lectura_A[i]=mfrc522[0].uid.uidByte[i]; //Almacena en array el byte del UID leido
if(Lectura_A[i] != TARJETA_A[i]){ //Si el valor que se ha guardado al leer la tarjeta de A es distinto a la clave para A,
verifica_A=false; //la variable que verifica A vuelve a ser falsa
unavez=false; //y devuelve la variable unavez a falsa para que se pueda ejecutar el verificable
}else{verifica_A=true;} //Si no hay diferencias en la comprobación, la verificación de A es correcta y continúa
}
Serial.println("\t");
mfrc522[0].PICC_HaltA(); //Detiene la comunicación con la tarjeta
}
}
if (mfrc522[1].PICC_IsNewCardPresent()){ //Se activa cuando una nueva tarjeta es puesta en el lector B (el 1)
Serial.println("Lector B: ");
if(mfrc522[1].PICC_ReadCardSerial()){ //Selecciona una tarjeta nueva
for(byte i=0; i<mfrc522[1].uid.size;i++){ //Bucle recorre todo el UID,
if(mfrc522[1].uid.uidByte[i]<0x10){ //si el byte leído es menor a 0x10
Serial.print(" 0"); //imprime espacio en blanco y numero cero,
}else{ //si no,
Serial.print(" "); //imprime espacio en blanco
}
Serial.print(mfrc522[1].uid.uidByte[i], HEX); //Imprime el byte del UID leído hexadecimal
Lectura_B[i]=mfrc522[1].uid.uidByte[i]; //Almacena en array el byte del UID leido
if(Lectura_B[i] != TARJETA_B[i]){ //Si el valor que se ha guardado al leer la tarjeta de B es distinto a la clave para B,
verifica_B=false; //la variable que verifica B vuelve a ser falsa
unavez=false; //y devuelve la variable unavez a falsa para que se pueda ejecutar el verificable
}else{verifica_B=true;} //Si no hay diferencias en la comprobación, la verificación de B es correcta y continúa
}
Serial.println("\t");
mfrc522[1].PICC_HaltA(); //Detiene la comunicación con la tarjeta
}
}
if(verifica_A==true && verifica_B==true && unavez==false){ //Si verifica que A y B son correctas y unavez es falsa (no se ha dado por correcto el código aún),
Serial.println("CÓDIGO CORRECTO");
digitalWrite(Rele, HIGH); //Activa el relé para que se desactive el electroimán
for(int x=0; x<200; x++){ //bucle de espera para que el watchdog no reinicie
wdt_reset(); //Actualiza el watchdog para que no produzca un reinicio
delay(100);
}
digitalWrite(Rele, LOW); //Desactiva el relé para que se active el electroimán
unavez=true; //Cambia unavez a verdadero puesto que ya ha mostrado el código una vez (se resetea cambiando tarjetas de sitio)
}
}