alternar salidas con rfid

Hola me llamo Daniel necesito ayuda con un código…
Estoy trabajando con un arduino uno y un mrfc 522 con 4 llaveros.
La idea es que al pasar cualquiera de los tag por el lector se active un relay por dos segundos y se apague…y al pasarlo otra ves (cualquiera de los 4) se active un segundo relay tambien por dos segundos y se apague. los tengo en las salidas 5 y6 la idea es que se alternen uno despues del otro…
El problema es que no se alternan…encienden en un orden aleatorio por ej: 5 5 6 5 5 6 6 5…
El orden tendria que ser…5 6 5 6 5 6 5 6…infinitamente cada ves que pase cualquiera de los 4 tag
es la primera ves que escribo asi que espero pueda adjuntar bien el codigo…
Yo baje uno de internet y lo modifique todo en base a lo que yo necesito.
Muchas gracias!

  #include <SPI.h>
#include <MFRC522.h>

#define RST_PIN  9    //Pin 9 para el reset del RC522
#define SS_PIN  10   //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); ///Creamos el objeto para el RC522

void setup() {
  pinMode (5,OUTPUT);
  pinMode (6,OUTPUT);
  pinMode (7,OUTPUT);
  Serial.begin(9600); //Iniciamos La comunicacion serial
  SPI.begin();        //Iniciamos el Bus SPI
  mfrc522.PCD_Init(); // Iniciamos el MFRC522
  Serial.println("Control de acceso:");
 #define r5(void) {digitalWrite(5,HIGH); delay(2000); digitalWrite(5,LOW);}
 #define r6(void) {digitalWrite(6,HIGH); delay(2000); digitalWrite(6,LOW);}
}

byte ActualUID[4]; //almacenará el código del Tag leído
byte Usuario1[4]= {0x6A, 0x85, 0x69, 0x25} ; //código del usuario 1
byte Usuario2[4]= {0x8C, 0x14, 0x66, 0x03} ; //código del usuario 2
byte Usuario3[4]= {0xAC, 0x8E, 0x68, 0x03} ; //3
byte Usuario4[4]= {0x0C, 0xDA, 0x6A, 0x03} ; //4


void loop() {
  // 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[i] < 0x10 ? " 0" : " ");
                          Serial.print(mfrc522.uid.uidByte[i], HEX);   
                          ActualUID[i]=mfrc522.uid.uidByte[i];          
                  } 
                  Serial.print("     ");                 
                  //comparamos los UID para determinar si es uno de nuestros usuarios  
                  if(compareArray(ActualUID,Usuario1))
                   { Serial.println("Acceso concedido...");
                  r5 (void) ;}
                  else if(compareArray(ActualUID,Usuario2))
                    {Serial.println("Acceso concedido...");
                  r5 (void) ;}
                  else if(compareArray(ActualUID,Usuario3))
                    {Serial.println("Acceso concedido...");
                  r5 (void) ;}
                  else if(compareArray(ActualUID,Usuario4))
                    {Serial.println("Acceso concedido...");
                  r5 (void) ;}
                  else
                    Serial.println("Acceso denegado...");
                  
                  // Terminamos la lectura de la tarjeta tarjeta  actual
                  mfrc522.PICC_HaltA();
          
            }
      
  }
 {
           if ( mfrc522.PICC_IsNewCardPresent())
           { 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[i] < 0x10 ? " 0" : " ");
                          Serial.print(mfrc522.uid.uidByte[i], HEX);   
                          ActualUID[i]=mfrc522.uid.uidByte[i];          
                  } 
                  Serial.print("     ");                 
                  //comparamos los UID para determinar si es uno de nuestros usuarios  
                  if(compareArray(ActualUID,Usuario1))
                   { Serial.println("Acceso concedido...");
                  r6 (void);}
                  else if(compareArray(ActualUID,Usuario2))
                    {Serial.println("Acceso concedido...");
                  r6 (void);}
                  else if(compareArray(ActualUID,Usuario3))
                    {Serial.println("Acceso concedido...");
                  r6 (void);}
                  else if(compareArray(ActualUID,Usuario4))
                    {Serial.println("Acceso concedido...");
                  r6 (void);}
                  else
                    Serial.println("Acceso denegado...");
                  
                  // Terminamos la lectura de la tarjeta tarjeta  actual
                  mfrc522.PICC_HaltA();}}
                  
                                    
}
}
 

//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);
} [code]

A ver como funciona esta versión de tu código, algo mas reducido de lo que tu has hecho y con un simple control de donde se resuelve que rele debe activarse.

 #include <SPI.h>
#include <MFRC522.h>

#define RST_PIN  9    //Pin 9 para el reset del RC522
#define SS_PIN  10   //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); ///Creamos el objeto para el RC522
#define r5(void) {digitalWrite(5,HIGH); delay(2000); digitalWrite(5,LOW);}
#define r6(void) {digitalWrite(6,HIGH); delay(2000); digitalWrite(6,LOW);}
bool activarReles = false;
bool releSecuencia = false; // 0 rele 5, 1 rele 6

void setup() {
  pinMode (5,OUTPUT);
  pinMode (6,OUTPUT);
  pinMode (7,OUTPUT);
  Serial.begin(9600); //Iniciamos La comunicacion serial
  SPI.begin();        //Iniciamos el Bus SPI
  mfrc522.PCD_Init(); // Iniciamos el MFRC522
  Serial.println("Control de acceso:"); 
}

byte ActualUID[4]; //almacenará el código del Tag leído
byte Usuario[][4] = {{0x6A, 0x85, 0x69, 0x25},
                     {0x8C, 0x14, 0x66, 0x03},
                     {0xAC, 0x8E, 0x68, 0x03},
                     {0x0C, 0xDA, 0x6A, 0x03}
                    };

void loop() {
  // 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[i] < 0x10 ? " 0" : " ");
                  Serial.print(mfrc522.uid.uidByte[i], HEX);   
                  ActualUID[i]=mfrc522.uid.uidByte[i];         
          }
          Serial.print("     ");                 
          //comparamos los UID para determinar si es uno de nuestros usuarios 
          
          if (compareArray(ActualUID,Usuario)) { 
              Serial.println("Acceso concedido...");
              activarReles = true;
          } 
          else
              Serial.println("Acceso denegado...");
         
          // Terminamos la lectura de la tarjeta tarjeta  actual
          mfrc522.PICC_HaltA();
      }  
  }
  if (activarReles) {
      activarReles = false; 
      releSecuencia = !releSecuencia;  // invierto la secuenca
      if (releSecuencia) {
          r5 (void);
      }
      else { 
          r6 (void);
      }
  }
}
//Función para comparar 1 vector con las 4 vectores
boolean compareArray(byte array1[],byte array2[][4]) {
  for (byte i = 0; i < 4; i++) {
      if (array1[0] != array2[i][0])
          return(false);
      if (array1[1] != array2[i][1])
          return(false);
      if (array1[2] != array2[i][2])
          return(false);
      if (array1[3] != array2[i][3])
          return(false);
  }
  return(true);
}

Hola muchas gracias por la ayuda!!!! Cargue el código y lo probé.....me dice acceso denegado a los cuatro tag.

Lee el privado que te envié

Solucionado! La verdad sin palabras!!! Con un acceso remoto a mi pc el amigo surbyte analizo el programa.... lo modifico... y lo que creo mas importante en un foro ME EXPLICO cual era el problema... ademas de darme unos buenos consejos.
De verdad muchas gracias!

Aca esta la solucion del codigo…Disculpas por no subirlo antes…estaba sin electricidad en mi casa y solo podia entrar del cel
Otra vez muchas gracias!!!

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN  9    //Pin 9 para el reset del RC522
#define SS_PIN  10   //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); ///Creamos el objeto para el RC522
#define r5(void) {digitalWrite(5,HIGH); delay(2000); digitalWrite(5,LOW);}
#define r6(void) {digitalWrite(6,HIGH); delay(2000); digitalWrite(6,LOW);}
bool activarReles = false;
bool releSecuencia = false; // 0 rele 5, 1 rele 6

void setup() {
  pinMode (5,OUTPUT);
  pinMode (6,OUTPUT);
  pinMode (7,OUTPUT);
  Serial.begin(9600); //Iniciamos La comunicacion serial
  SPI.begin();        //Iniciamos el Bus SPI
  mfrc522.PCD_Init(); // Iniciamos el MFRC522
  Serial.println("Control de acceso:");
}

byte ActualUID[4]; //almacenará el código del Tag leído
byte Usuario[][4] = {{0x6A, 0x85, 0x69, 0x25},
                     {0x8C, 0x14, 0x66, 0x03},
                     {0xAC, 0x8E, 0x68, 0x03},
                     {0x0C, 0xDA, 0x6A, 0x03}
};

void loop() {
  // 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[i] < 0x10 ? " 0" : " ");
                  Serial.print(mfrc522.uid.uidByte[i], HEX);   
                  ActualUID[i]=mfrc522.uid.uidByte[i];         
          }
          Serial.print("     ");                 
          //comparamos los UID para determinar si es uno de nuestros usuarios
         
          if (compareArray(ActualUID,Usuario)) {
              Serial.println("Acceso concedido...");
              activarReles = true;
          }
          else
              Serial.println("Acceso denegado...");
         
          // Terminamos la lectura de la tarjeta tarjeta  actual
          mfrc522.PICC_HaltA();
      } 
  }
  if (activarReles) {
      activarReles = false;
      releSecuencia = !releSecuencia;  // invierto la secuenca
      if (releSecuencia) {
          r5 (void);
          Serial.println("Rele pin 5");
      }
      else {
          r6 (void);
          Serial.println("Rele pin 6");
      }
  }
}
//Función para comparar 1 vector con las 4 vectores
boolean compareArray(byte array1[],byte array2[][4]) {
  bool tarjetaValida = false;

  for (byte i = 0; i < 4; i++) {
      if (array1[0] == array2[i][0] && array1[1] == array2[i][1] && array1[2] == array2[i][2] && array1[3] == array2[i][3]) {
          tarjetaValida = true;
          return true;
      }
      else 
          tarjetaValida = false;
  }

  return false;
}

Voy a terminar esta parte porque la hicimos rápido y ahora veo que es redundante la creancion de una variable que no tiene razón de ser en la rutina de comparación

boolean compareArray(byte array1[],byte array2[][4]) {
  
  for (byte i = 0; i < 4; i++) {
      if (array1[0] == array2[i][0] && array1[1] == array2[i][1] && array1[2] == array2[i][2] && array1[3] == array2[i][3]) {
            return true;
      }
  }

  return false;  
}

No existe la situación alternativa, o se identifica la tarjeta o no hay coincidencia.
Entonces la variable tarjetaValida no se usa como incialmente pensé.
Asi que un ahorro leve pero ahorro.

Si y en realidad podria ser mucho mas chico todo el codigo xq la parte de imprimir en el p.serie no la necesito. La use solo xq me servia como practica y para ver como se comportaban interpretaba los tag.

Seguro... por eso cuando programas es bueno crear una etiqueta al comienzo que puede llamar DEBUG

#define DEBUG 1  // 0 para que no funcione

En tu código simplemente pones

#ifdef DEBUG
       Serial.print("Tus presentaciones x puerto Serie");
       // Aca puede ir mas código de debugging
#endif

Si lo quieres usas DEBUG 1
Si no lo quieres DEBUG 0

A buenaso! Otra cosa que no sabia lo voy a probar!