In diesem Beitrag möchte ich dir zeigen, wie du ein RFID Modul vom Typ MFRC522 am ESP32 per SPI programmierst.
Das RFID Modul habe ich dir bereits für die Mikrocontroller der Arduino-Familie in folgenden Beiträgen gezeigt:
- Arduino Lektion 20 – Teil 1: RFID RC522 – Kartenleser
- RFID Kartenleser RC522 am Arduino betreiben (Update 29.07.2021)
- Arduino Projekt: PIR & RFID Alarmanlage
Benötigte Ressourcen für dieses Projekt
Wenn du das nachfolgende Beispiel nachbauen möchtest, dann benötigst du:
- einen ESP32 zbsp. ESP32-WROOM-32*,
- ein Micro-USB Datenkabel*,
- ein RFID Modul Typ MFRC522*,
- ein paar Breadboardkabel*,
- ein 170 Pin Breadboard*
* Leider hat nicht jeder ESP32 alle Pins nach außen geführt und somit empfehle ich dir den ESP32-WROOM-32 von
- LILYGO® TTGO T-Call V1.4 ESP32 Wireless Module SIM Antenna SIM Card SIM800L Module
- ESP32-WROOM-32*, DevKit C4 WROOM32*
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
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.
Aufbau der Schaltung
Das RFID Modul wird per SPI angeschlossen und die Schaltung sieht wie folgt aus:
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.
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.
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.
Obligatorischer Sicherheitshinweis: das System ist nicht(!) sicher. Die UID lässt sich leicht kopieren oder emulieren. Also gerne gleich versuchen das System zu “hacken” 😉
Hallo,
Sobald eine ID nicht erkannt wurde, bzw. diese nicht im Array hinterlegt ist, leuchtet zwar meine LED rot aber ich kann im Anschluss keine weitere Überprüfung machen. das Programm scheint nach einer fehlgeschlagenen (zutrittOK=false) Verifizierung aufzuhören.
woran kann das liegen?
Bin noch relativ neu in der Materie, hoffe mein Problem ist verständlich.
Vielen Dank schonmal!
Denke mal das du ein Programmierfehler erzeugt hast. Es hört sich so an als wenn du aus der Schleife nicht mehr rauskommst. Kann das vielleicht so gewollt sein?
Achso ich kenne deinen Code nicht.