ESP32 mit RFID-RC522 (MFRC522) Modul

In diesem Beitrag möchte ich dir zeigen, wie du ein RFID Modul vom Typ MFRC522 am ESP32 per SPI programmierst.

Programmieren & Anschluss eines RFID-Moduls am ESP32
Programmieren & Anschluss eines RFID-Moduls am ESP32

Das RFID Modul habe ich dir bereits für die Mikrocontroller der Arduino-Familie in folgenden Beiträgen gezeigt:

Benötigte Ressourcen für dieses Projekt

Wenn du das nachfolgende Beispiel nachbauen möchtest, dann benötigst du:

* Leider hat nicht jeder ESP32 alle Pins nach außen geführt und somit empfehle ich dir den ESP32-WROOM-32 von

Für die optische Signalisierung einer gültigen RFID Karte nutze ich zwei 5 mm LEDs (rot & grün). Diese beiden LEDs benötigen noch zusätzlich einen 220 Ohm Vorwiderstand und natürlich Breadboardkabel.

ESP32 auf einem Breadboard

Normalerweise verwende ich für die Schaltungen immer ein Breadboard (400 Pin oder 720 Pin), jedoch ist der ESP32 für das „normale“ 400 Pin Breadboard zu breit und man kann lediglich nur eine Pinleiste mit Breadboardkabel abgreifen. Aus dem Conrad Adventskalender sowie einem Franzis Bausatz habe ich zwei 270 Pin Breadboards welche zusammengesteckt werden können und der ESP32 sehr gut darauf passt.

Alternativ kannst du auch mit Breadboardkabel (männlich – weiblich) direkt an die Pins des ESPs gehen.

RFID-RC522 Modul als Set

Das in diesem Beitrag verwendete RFID-RC522 Modul erhältst du als Set mit einer Karte sowie einem Schlüsselanhänger.

RFID-RC522 Modul mit Karte & Schlüsselanhänger
RFID-RC522 Modul mit Karte & Schlüsselanhänger

Aufbau der Schaltung

Das RFID Modul wird per SPI angeschlossen und die Schaltung sieht wie folgt aus:

Schaltung - RFID Modul am ESP32 (inkl. LEDs)
Schaltung – RFID Modul am ESP32 (inkl. LEDs)

Wie bereits erwähnt habe ich den ESP32 auf zwei 270 Pin Breadboards gesteckt und kann die LEDs sowie das RFID Modul auf den freien Platz des Breadboard stecken.

Aufbau der Schaltung "ESP32 mit RFID-Modul Typ MFRC522 & LEDs"
Aufbau der Schaltung „ESP32 mit RFID-Modul Typ MFRC522 & LEDs“

Programmieren

Für die Programmierung des RFID Moduls verwende ich die Bibliothek „MFRC522 by GithubCommunity“ welche du im Bibliotheksverwalter der Arduino IDE herunterladen kannst.

Im Bibliotheksverwalter suchst du zunächst nach „rc522“ und betätigst dann die Schaltfläche „Installieren“ im Suchergebnis „MFRC522 by GithubCommunity“.

Wenn die Installation abgeschlossen wurde, kann das Fenster über die Schaltfläche „Schließen“ geschlossen werden und mit der Programmierung begonnen werden.

In den folgenden Schritten werde ich dir zeigen, wie du ein kleines Programm erstellst, welches eine RFID-ID zulässt und eine nicht.

Schritt 1 – auslesen der RFID Karten

Damit wir eine RFID Karte einen Zugang gewähren können, müssen wir die IDs zunächst auslesen. Dazu können wir entweder das Beispielprogramm „Beispiele“ > „MFRC522“ > „DumpInfo“ oder das nachfolgende kleine Programm.

//einbinden der Bibliotheken für das
//ansteuern des MFRC522 Moduls
#include <SPI.h>
#include <MFRC522.h>

//definieren der Pins  RST & SDA für den ESP32
#define RST_PIN     22
#define SS_PIN      21

//erzeugen einer Objektinstanz
MFRC522 mfrc522(SS_PIN, RST_PIN);

//Variable zum speichern der bereits gelesenen RFID-ID
String lastRfid = "";

void setup() {
  //beginn der seriellen Kommunikation mit 115200 Baud
  Serial.begin(115200);
  //eine kleine Pause von 50ms.
  delay(50);
  //begin der SPI Kommunikation
  SPI.begin();
  //initialisieren der Kommunikation mit dem RFID Modul
  mfrc522.PCD_Init();
}

void loop() {
  //Wenn keine neue Karte vorgehalten wurde oder die serielle Kommunikation
  //nicht gegeben ist, dann...
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  String newRfidId = "";
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    // !! Achtung es wird ein Leerzeichen vor der ID gesetzt !!
    newRfidId.concat(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    newRfidId.concat(String(mfrc522.uid.uidByte[i], HEX));
  }

  //alle Buchstaben in Großbuchstaben umwandeln
  newRfidId.toUpperCase();

  //Wenn die neue gelesene RFID-ID ungleich der bereits zuvor gelesenen ist,
  //dann soll diese auf der seriellen Schnittstelle ausgegeben werden.
  if (!newRfidId.equals(lastRfid)) {
    //überschreiben der alten ID mit der neuen
    lastRfid = newRfidId;
    Serial.print(" gelesene RFID-ID :");
    Serial.println(newRfidId);
    Serial.println();
  }
}

Wenn man nun eine RFID-Karte vor das RFID-Modul hält, dann wird diese ID auf der seriellen Schnittstelle ausgegeben. Da im Programm die letzte, erfolgreich, gelesene ID zwischengespeichert wird, erfolgt bei erneutem Vorlegen der Karte keine neue Ausgabe.

Ausgabe des Programmes zum lesen einer RFID-ID am ESP32
Ausgabe des Programmes zum lesen einer RFID-ID am ESP32

Schritt 2 – erzeugen eines Arrays mit zulässigen RFID-IDs

Wie erwähnt liegen dem Set des RFID Moduls bereits zwei RFID Karten, bei welche wir im ersten Schritt ausgelesen haben.

//Anzahl der zulässigen RFID-IDs im Array
const int NUM_RFIDS = 1;
//Array mit RFID-IDs welche zulässig sind
String rfids[NUM_RFIDS] = {"39 42 FF 97"};

void loop() {
 ...
 bool zugangOk = false;
  for (int i = 0; i < NUM_RFIDS; i++) {
    if (rfids[i].equals(newRfidId)) {
      zugangOk = true;
      break;
    }
  }

Schritt 3 – LEDs zum optischen Signalisieren einer zulässigen RFID-ID

Im nächsten Schritt wollen wir nun die rote LED blinken lassen, wenn der Zugang nicht gewährt wird, bzw. die RFID-ID nicht im Array vorhanden ist und die grüne LED soll blinken, wenn der Zugang gewährt werden soll.

Des Weiteren soll auf der seriellen Schnittstelle eine entsprechende Ausgabe erfolgen.

//einbinden der Bibliotheken für das
//ansteuern des MFRC522 Moduls
#include <SPI.h>
#include <MFRC522.h>

//definieren der Pins  RST & SDA für den ESP32
#define RST_PIN     22
#define SS_PIN      21

#define ledRot 32
#define ledGruen 33

//erzeugen einer Objektinstanz
MFRC522 mfrc522(SS_PIN, RST_PIN);

//Variable zum speichern der bereits gelesenen RFID-ID
String lastRfid = "";

//Anzahl der zulässigen RFID-IDs im Array
const int NUM_RFIDS = 1;
//Array mit RFID-IDs welche zulässig sind
String rfids[NUM_RFIDS] = {" 39 42 FF 97"};

void setup() {
  //beginn der seriellen Kommunikation mit 115200 Baud
  Serial.begin(115200);
  //eine kleine Pause von 50ms.
  delay(50);

  pinMode(ledRot, OUTPUT);
  pinMode(ledGruen, OUTPUT);

  //begin der SPI Kommunikation
  SPI.begin();
  //initialisieren der Kommunikation mit dem RFID Modul
  mfrc522.PCD_Init();
}

void loop() {
  //Wenn keine neue Karte vorgehalten wurde oder die serielle Kommunikation
  //nicht gegeben ist, dann...
  if ( !mfrc522.PICC_IsNewCardPresent()) {
    //Serial.println("!PICC_IsNewCardPresent");
    return;
  }

  if (!mfrc522.PICC_ReadCardSerial()) {
    //Serial.println("!PICC_ReadCardSerial");
    return;
  }


  String newRfidId = "";
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    newRfidId.concat(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    newRfidId.concat(String(mfrc522.uid.uidByte[i], HEX));
  }

  //alle Buchstaben in Großbuchstaben umwandeln
  newRfidId.toUpperCase();

  //Wenn die neue gelesene RFID-ID ungleich der bereits zuvor gelesenen ist,
  //dann soll diese auf der seriellen Schnittstelle ausgegeben werden.
  if (!newRfidId.equals(lastRfid)) {
    //überschreiben der alten ID mit der neuen
    lastRfid = newRfidId;
  }


  bool zugangOk = false;
  //prüfen ob die gelesene RFID-ID im Array mit bereits gespeicherten IDs vorhanden ist
  for (int i = 0; i < NUM_RFIDS; i++) {
    //wenn die ID an der Stelle "i" im Array "rfids" mit dem gelesenen übereinstimmt, dann
    if (rfids[i].equals(newRfidId)) {
      zugangOk = true;
      //Schleife verlassen
      break;
    }
  }

  //Wenn die Variable "zugangOk" auf True ist, dann...
  if (zugangOk) {
    blinkLed(ledGruen);
    Serial.println("RFID-ID [" + newRfidId + "] OK!, Zugang wird gewährt");
  } else {
    //Wenn nicht dann...
    blinkLed(ledRot);
    Serial.println("RFID-ID [" + newRfidId + "] nicht OK!, Zugang wird nicht gewährt");
  }

  Serial.println();
}

//Blinken einer LED am Pin "pin"
void blinkLed(int pin) {
  //Schleife von 0 bis 5
  for (int a = 0; a < 5; a++) {
    //LED aktivieren
    digitalWrite(pin, HIGH);
    //eine Pause von 125 ms.
    delay(125);
    //LED deaktivieren
    digitalWrite(pin, LOW);
    //eine Pause von 125 ms.
    delay(125);
  }
}

Download des fertigen Programmes

Hier nun ein Link zum Herunterladen des fertigen Programmes.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht.