ESP32 RFID-Kartenleser RC522 (mit LCD)
In diesem Projekt schließen wir das MFRC522-basierte RC522-RFID-Modul über SPI an den ESP32 an und lesen die UID der Karte bzw. des Tags aus. Dies bildet die Grundlage für Anwendungen wie Türschlösser, Mitgliedersysteme und Zugangskontrollen. Wir zeigen die gelesene UID auf einem LCD-Display an; diese Version gleicht sie nicht mit einer Liste autorisierter Karten ab. **ACHTUNG:** Das RC522 arbeitet nur mit **3,3 V**; bei 5 V brennt das Modul durch!

Video
Schaltplan

Quellcode
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// ESP32 RFID-Kartenleser RC522 (mit LCD)
4// ─────────────────────────────────────────
5// Liest das RC522-RFID-Modul über SPI; die UID einer gescannten Karte
6// erscheint 3 s lang als HEX auf dem 16x2-I2C-LCD, dann kehrt der
7// Bildschirm "Karte scannen" zurück.
8//
9// Pins:
10// GPIO 5 -> RC522 SDA (SS)
11// GPIO 18 -> RC522 SCK, GPIO 19 -> RC522 MISO, GPIO 23 -> RC522 MOSI
12// GPIO 27 -> RC522 RST
13// GPIO 21 -> LCD SDA, GPIO 22 -> LCD SCL
14// RC522 3.3V -> RC522 3.3V -> 3V3, IRQ bleibt unverbunden
15// LCD VCC -> LCD VCC -> 5V (VIN), alle GNDs gemeinsam
16
17#include <Wire.h>
18#include <LiquidCrystal_I2C.h>
19#include <SPI.h>
20#include <MFRC522.h>
21
22// Pin-Definitionen
23const int RST_PIN = 27; // RC522 RST
24const int SS_PIN = 5; // RC522 SDA (SS)
25
26// Die SPI-Pins sind der VSPI-Standard
27MFRC522 rfid(SS_PIN, RST_PIN);
28LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD-Adresse 0x27 oder 0x3F
29
30unsigned long lastScan = 0; // Zeitpunkt des letzten Scans (ms)
31const unsigned long DISPLAY_HOLD = 3000; // Anzeigedauer der UID (ms)
32bool showingCard = false; // Ist eine UID auf dem Bildschirm?
33
34// Warte-Bildschirm
35void showWaitMessage() {
36 lcd.clear();
37 lcd.setCursor(0, 0);
38 lcd.print("Kart okutun");
39 lcd.setCursor(0, 1);
40 lcd.print("Scan a card");
41}
42
43void setup() {
44 Wire.begin(21, 22); // I2C: SDA=21, SCL=22
45 lcd.init();
46 lcd.backlight();
47
48 // Splashscreen 3 s
49 lcd.setCursor(3, 0);
50 lcd.print("BlueGrays");
51 lcd.setCursor(3, 1);
52 lcd.print("RFID v1.0");
53 delay(3000);
54
55 // SPI und den RC522 starten
56 SPI.begin();
57 rfid.PCD_Init();
58 delay(50);
59
60 showWaitMessage();
61}
62
63void loop() {
64 // Ist die Zeit abgelaufen, zurück zum Warte-Bildschirm
65 if (showingCard && millis() - lastScan > DISPLAY_HOLD) {
66 showWaitMessage();
67 showingCard = false;
68 }
69
70 // Verlassen, wenn keine neue Karte da ist oder sie nicht gelesen werden kann
71 if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
72 delay(50);
73 return;
74 }
75
76 // UID in HEX ausgeben, z. B. 0A:1B:2C:3D
77 lcd.clear();
78 lcd.setCursor(0, 0);
79 lcd.print("Kart UID:");
80 lcd.setCursor(0, 1);
81 for (byte i = 0; i < rfid.uid.size; i++) {
82 if (rfid.uid.uidByte[i] < 0x10) lcd.print("0");
83 lcd.print(rfid.uid.uidByte[i], HEX);
84 // Kein Trennzeichen bei 7-Byte-UID: 14 Zeichen passen in die Zeile
85 if (rfid.uid.size <= 5 && i < rfid.uid.size - 1) lcd.print(":");
86 }
87
88 lastScan = millis();
89 showingCard = true;
90
91 // Karte anhalten und Verschlüsselung stoppen
92 rfid.PICC_HaltA();
93 rfid.PCD_StopCrypto1();
94}
95
FAQ
Über welche Pins schließe ich den RC522 an den ESP32 an?▾
Es werden die Standard-SPI-Pins des ESP32 verwendet: SCK = GPIO 18, MISO = GPIO 19, MOSI = GPIO 23. Verwende für SDA (SS) und RST die im Code angegebenen Pins (z. B. 5 und 27); die Versorgungsspannung muss unbedingt 3,3 V betragen.
Funktionieren LCD und RFID gleichzeitig?▾
Ja. Da das LCD I2C (GPIO 21/22) und der RC522 den SPI-Bus nutzen, beeinflussen sie sich nicht gegenseitig; die beiden separaten Kommunikationskanäle arbeiten gleichzeitig.
Warum ist die UID bei manchen Karten 4 Byte lang und bei anderen 7 Byte?▾
MIFARE Classic-Karten verwenden in der Regel eine 4-Byte-UID, MIFARE Ultralight- und NTAG-Tags hingegen eine 7-Byte-UID. Bei einem Vergleich solltest du auch die Länge der UID überprüfen.
Kann ich Berechtigungskarten hinzufügen, ohne den Code zu ändern?▾
Ja, du kannst ein Mod schreiben, das beim Einlesen der „Administratorkarte“ die nächste Karte zur Liste hinzufügt, und die Liste über die Einstellungen im permanenten Speicher speichern.
