Problemas con tarjetas rfid

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();
}

No entiendo lo que quieres hacer. Tienes 12 claves desde clave1 a clave12? Eso para empezar se maneja con un array tmb llamado arreglo
Ej.

const String clave[] = {"2083", "7852", "8319","3853","5272", "9478", "9204", "6454", "8354", "2058", "7952", "0348"];

Los valores van de 0 a 11
Y accedes a ellos de este modo clave[0] corresponde a "2083" y clave[4] = "5272"

ahora veo que en input tienes el valor leido de modo que si pones todo en un for() desde 0 a 11 puedes ir preguntando si coincide.
Cuando hagas esto no uses delay() porque retrasas toda la operación.

// si no funciona acá defínela como global antes del setup()
bool estado = false; // esta variable arranca en falso y se pone en true si hay coincidencia.
for (int i=0: i<12: i++) {
      if (input == clave[i]) {
         estado = true:
     }
}
if (estado) {
        tone(buzzer, 1000, 1000);
        digitalWrite(relay, LOW);
        digitalWrite (ledverde, HIGH);
        digitalWrite (ledazul, LOW);
        delay(3000);
      } else {
        tone(buzzer, 200, 1000); 
        digitalWrite (ledrojo, HIGH);
        digitalWrite (ledazul, LOW);
        delay(1000);
   }
   resetFunc();     // que es esta función que no esta definida?

estoy haciendo un control de acceso que funcione a traves de ese string de contraseñas y aparte que si no se sabe la contraseña de acceso con una tarjeta rfid, mi problema es con la parte del rfid

MFRC522::MIFARE_Key keyA1 = {keyByte: {0xA7, 0x8B, 0x5E, 0x00, 0xA5, 0xFF}};
MFRC522::MIFARE_Key keyA2 = {keyByte: {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}};

estas dos son las claves de las tarjetas, por ejemplo tengo 50 tarjetas con la keyA1 y otras 50 con la keyA2, mi problema creo que esta en la parte del void contraseña, ya que si coloco una tarjeta con la keyA1 si funciona, pero si lo hago con la keyA2 no funciona, segun mi logica en el codigo está que si detecta que no funciono con la keyA1 se salte el if y continue con la KeyA2.

que es resetFunc();
Ya te lo pregunté?

Lo uso como un reset para el arduino, porque me sucedia que al terminar el codigo no volvia al inicio del loop

Eso no es mala práctica es muy mala práctica. No lo uses mas.
Corrijamos eso para empezar.
No puedes resetear tu Arduino cada vez que haces algo porque lo pones a 0 y la forma de ver como funciona el código obviamente no es la que imaginas.

Lo voy a analizar y te daré una corrección.

Disculpa porque estaba en el código y no lo había visto.

no hay problema, muchas gracias

Esta es una primer prueba.
Dime como se comporta

#include <Arduino.h>
#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 clave[] = {"2083", "7852", "8319", "3853", "5272", "9478", 
                        "9204", "6454", "8354", "2058", "7952", "0348"};

String input = "";
boolean flag;

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) { 
            estado = false;
            for (int i=0: i<12: i++) {
                if (input == clave[i]) {
                    flag = true;  // si alguna coincide el flag se pone en true
                }
            }
            if (flag) {       // si flag esta en true entonces ejecuta esto
                tone(buzzer, 1000, 1000);
                digitalWrite(relay, LOW);
                digitalWrite (ledverde, HIGH);
                digitalWrite (ledazul, LOW);
                delay(3000);    // dejo el delay pero no es de mi agrado
            } else {
                tone(buzzer, 200, 1000); 
                digitalWrite (ledrojo, HIGH);
                digitalWrite (ledazul, LOW);
                delay(1000);    // dejo el delay pero no es de mi agrado
            }
        }
    }

    //---------------------------------------------------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("Esto solo funciona con tarjetas clásicas MIFARE.");
        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();
    }

    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();
    }    
    tone(buzzer, 200, 1000); 
    digitalWrite (ledrojo, HIGH);
    digitalWrite (ledazul, LOW);
    //delay(1000);
}

me da error, y la esta es la parte donde necesito ayuda, usted modifico la parte del acceso con contraseña por un teclado de matriz y en la parte del rfid esta intentado comprobar las llaves de la tarjeta con las contraseñas escritas, la parte del teclado si me funciona, solo habia subido el codigo completo porque veia que en la mayoria de posts lo colocaban completo.

 //------------------------------------------------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();
}

Te he enviado un privado por favor responde.

EDITO:
corrige esto

      flag = false; // en lugar de estado
      for (int i = 0 ; i < 12; i++) { // aca había : donde debería haber ;

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.