In diesem Beitrag möchte ich dir zeigen, wie du das RFID Modul vom Typ RC522 am Arduino per SPI programmieren kannst.

Das Modul RFID RC522 habe ich dir bereits im Beitrag vorgestellt. Jedoch ist die dort verlinkte Bibliothek nicht mehr verfügbar und somit wurde dieses Update fällig.
Bezug des RFID Moduls RC522
Das RFID Modul vom Typ RC522 bekommst du auf ebay.de für 3,99 € inkl. kostenlosem Versand* aus Deutschland.
Solltest du neu in das Thema Arduino einsteigen, so kann ich dir das ausführliche Set „Arduino RFID Kit“* vorschlagen, in diesem Set sind diverse Sensoren & Aktoren enthalten, welche du für die ersten kleinen Projekte benötigen wirst.
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!
Technische Daten
- Chip – MFRC522
- Betriebsspannung – 3.3V
- Stromaufnahme:
- lesen – 13 mA bis 26 mA
- idle – 10 mA bis 13 mA
- Schnittstelle – SPI
- Abstand zum Lesen / Schreiben – < 10 cm
- Betriebsfrequenz – 13,56 MHz
- Abmaße – 40 mm x 60 mm
Aufbau der Schaltung am Keyestudio UNO
Das Modul habe ich am Keyestudio UNO angeschlossen. Dieser Mikrocontroller ist vom Chip her Baugleich mit dem Arduino UNO R3 jedoch bietet dieser ein paar nette zusätzliche Features, welche ich in bestimmten Fällen nicht missen möchte.
Anschluss des RFID RC522 Moduls an den Arduino
Pin | Arduino UNO |
---|---|
SDA | D10 |
SCK | D19 |
MOSI | D17 |
MISO | D18 |
IRQ | -bleibt frei- |
GND | GND |
RST | Reset |
3.3V | 3.3V |
Zusätzlich zum RFID Modul schließe ich noch 3 grüne, 5 mm LEDs an die digitalen Pins D5, D6, D7.
RFID RC522 am Arduino programmieren
Für das Programmieren dieses Moduls benötigen wir eine zusätzliche Bibliothek, welche wir im Bibliotheksverwalter finden.
Die bereits in einem früheren Beitrag benannte einfachere Bibliothek von „electro-dragon“ ist leider nicht mehr verfügbar.
Einbinden der Bibliothek von GithubCommunity
In diesem Beispiel möchte ich die Bibliothek von https://github.com/miguelbalboa/rfid verwenden. Die Weiterentwicklung ist jedoch eingestellt, d.h. es gibt keine Fixes mehr oder neue Features.

Beispiel mit 3 RFID Karten & LEDs
Als Grundlage für den folgenden Sketch habe ich das Beispiel „ReadNUID“ vom GitHub Repository verwendet.
Für die Kommunikation mit dem RFID Modul benötigen wir zwei Bibliotheken.
#include <SPI.h> #include <MFRC522.h>
Danach definieren wir die beiden Pins für SS & RESET.
#define SS_PIN 10 #define RST_PIN 9
Die 3 LEDs sind an den digitalen Pins D5, D6 und D7 angeschlossen.
#define led1 5 #define led2 6 #define led3 7
Für das Speichern des Status der LEDs legen wir uns 3 boolsche Variablen an (TRUE /FALSE).
bool led1_status = false; bool led2_status = false; bool led3_status = false;
Damit wir mit dem RFID Modul ansprechen können, müssen wir eine Instanz der Klasse MFRC522 erzeugen.
MFRC522 rfid(SS_PIN, RST_PIN);
Ich besitze 3 RFID Karten welche jeweils eine eindeutige ID haben. Dieses Array musst du auf deine RFID-UIDs anpassen.
String rfid_nuids[] = {"37fc943b", "cb72c5ae", "f73f9339"};
In der Funktion „setup“ starten wir zunächst die serielle Kommunikation mit 9600 baud. Sowie starten wir auch die kommunikation mit dem RFID Modul über SPI.
Die gewählten Pins der LEDs werden als Ausgang definiert und initial deaktiviert.
void setup() { Serial.begin(9600); SPI.begin(); rfid.PCD_Init(); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); }
Die Funktion „readHex“ liest aus einem byte Arry mit der Größe „bufferSize“ eine RFID-UID und liefert diese als String zurück.
String readHex(byte *buffer, byte bufferSize) { String result = ""; for (byte i = 0; i < bufferSize; i++) { String* hex[] = {}; result = result + String(buffer[i] < 0x10 ? " 0" : ""); result = result + String(buffer[i], HEX); } return result; }
In der Funktion „loop“ prüfen wir zunächst, ob eine Karte vor das Lesegerät gehalten wurde. Wenn dieses nicht so ist, dann verlassen wir diese Funktion an der stelle. (Es wird kein weiterer Code ausgeführt.)
void loop() { if ( !rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) { return; }
Wenn eine Karte erkannt wurde, dann soll die RFID-UID mit der Funktion „readHex“ gelesen werden. Diesen Hex Wert geben wir zusätzlich auf der seriellen Schnittstelle aus.
String nuid = readHex(rfid.uid.uidByte, rfid.uid.size); Serial.println(nuid);
Wenn die gelesene RFID-UID der an der Position 1 aus dem Array der bekannten UIDs ist, dann soll der Status der LED1 umgekehrt werden und die LED entweder aktiviert oder deaktiviert werden.
Dieses machen wir für alle 3 bekannten RFID-UIDs.
if (nuid == rfid_nuids[0]) { led1_status = !led1_status; digitalWrite(led1, led1_status ? HIGH : LOW); } else if (nuid == rfid_nuids[1]) { led2_status = !led2_status; digitalWrite(led2, led2_status ? HIGH : LOW); } else if (nuid == rfid_nuids[2]) { led3_status = !led3_status; digitalWrite(led3, led3_status ? HIGH : LOW); }
Wenn dieser Vorgang abgeschlossen ist dann beenden wir den Lesevorgang und die Funktion „loop“ startet von vorne.
rfid.PICC_HaltA(); rfid.PCD_StopCrypto1();
Hier nun der komplette Sketch zum Lesen einer RFID Karte und steuern von 3 LEDs am Arduino.
#include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 #define led1 5 #define led2 6 #define led3 7 bool led1_status = false; bool led2_status = false; bool led3_status = false; MFRC522 rfid(SS_PIN, RST_PIN); String rfid_nuids[] = {"37fc943b", "cb72c5ae", "f73f9339"}; void setup() { Serial.begin(9600); SPI.begin(); rfid.PCD_Init(); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); } void loop() { if ( !rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) { return; } String nuid = readHex(rfid.uid.uidByte, rfid.uid.size); Serial.println(nuid); if (nuid == rfid_nuids[0]) { led1_status = !led1_status; digitalWrite(led1, led1_status ? HIGH : LOW); } else if (nuid == rfid_nuids[1]) { led2_status = !led2_status; digitalWrite(led2, led2_status ? HIGH : LOW); } else if (nuid == rfid_nuids[2]) { led3_status = !led3_status; digitalWrite(led3, led3_status ? HIGH : LOW); } rfid.PICC_HaltA(); rfid.PCD_StopCrypto1(); } String readHex(byte *buffer, byte bufferSize) { String result = ""; for (byte i = 0; i < bufferSize; i++) { String* hex[] = {}; result = result + String(buffer[i] < 0x10 ? " 0" : ""); result = result + String(buffer[i], HEX); } return result; }