Go Down

Topic: RFID Byte Array für 10 Karten oder mehr (Read 137 times) previous topic - next topic

freddy64

Hallo Leute
Ich habe mir mal ein Beispiel für den MFRC522 Sensor installiert.
Funktioniert perfekt.
Wie könnte ich jetzt die Erkennung auf x Karten erweitern?
Hier die Arrays für die jeweiligen Karten
Code: [Select]

//////// ID der RFID-Tags //////////////
byte card1[] = {0x6B, 0x9A, 0x3B, 0x0B};
byte card2[] = {0x89, 0xFC, 0x4F, 0x47};
byte card3[] = {0x99, 0x41, 0x40, 0x56};


und hier die Überprüfung auf Gültigkeit der Karten
Code: [Select]

//////////////////////////////////////////////////
//
// acceptedRFID()
//   Stimmt gelesene RFID
//   mit der voreingestellten ID ueberein?
//
//////////////////////////////////////////////////
bool acceptedRFID(byte uid[4]) {
  return
      ((rfidReader.uid.uidByte[0] == card1[0]) &&
      (rfidReader.uid.uidByte[1] == card1[1]) &&
      (rfidReader.uid.uidByte[2] == card1[2]) &&
      (rfidReader.uid.uidByte[3] == card1[3]))
      ||
      ((rfidReader.uid.uidByte[0] == card2[0]) &&
      (rfidReader.uid.uidByte[1] == card2[1]) &&
      (rfidReader.uid.uidByte[2] == card2[2]) &&
      (rfidReader.uid.uidByte[3] == card2[3]))
      ||
      ((rfidReader.uid.uidByte[0] == card3[0]) &&
      (rfidReader.uid.uidByte[1] == card3[1]) &&
      (rfidReader.uid.uidByte[2] == card3[2]) &&
      (rfidReader.uid.uidByte[3] == card3[3]));
}

Lässt sich die Funktion acceptedRFID nicht etwas komfortabler gestalten, damit ich bei einer neuen Karte diesen Rattenschwanz nicht noch mehr verlängern muss?

Schon mal besten Dank im Voraus


Tommy56

Schau Dir mal mehrdimensionale Arrays an.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

freddy64

so?

byte cards[][4] = { {0x6B, 0x9A, 0x3B, 0x0B}, {0x89, 0xFC, 0x4F, 0x47}, {0x99, 0x41, 0x40, 0x56} };
uint8_t sizeOfCards = sizeof(cards[0]);

bool acceptedRFID(byte uid[4]) {
  for (uint8_t i = 0; i < sizeOfCards; i++) {
    return (
      (rfidReader.uid.uidByte[0] == cards
  • ) &&

      (rfidReader.uid.uidByte[1] == cards[1]) &&
      (rfidReader.uid.uidByte[2] == cards[2]) &&
      (rfidReader.uid.uidByte[3] == cards[3])
      );
   }
}

geht aber nur für die erste Karte im Array.
Alle anderen werden nicht erkannt.

freddy64

#3
Jan 18, 2019, 01:47 pm Last Edit: Jan 18, 2019, 02:43 pm by freddy64
So muss das aussehen, dann klappt's auch mit dem Nachbarn.
Code: [Select]

bool acceptedRFID(byte uid[4]) {
  bool result = false;
  for (uint8_t i = 0; i < sizeOfCards; i++) {
    byte detected[] = {
      rfidReader.uid.uidByte[0], rfidReader.uid.uidByte[1], rfidReader.uid.uidByte[2],   rfidReader.uid.uidByte[3]};

    if (memcmp(detected, cards[i], sizeof(detected)) == 0) {
      result = true;
      break;
    }
  }
  return result;
}

Vorher wurde das Array nicht bis zu Ende durchsucht sondern die for Schleife schon nach dem ersten Check verlassen.

StackExchange hat wieder mal geholfen.

Go Up