Im Tutorial Arduino Lektion 20 – Teil 1: RFID RC522 – Kartenleser habe ich erklärt, wie man das RFID Modul RC522 ansteuert bzw. auswertet. Nun möchte ich mit diesem Modul eine Mini Alarmanlage bauen.
Teileliste
Bezeichnung | Anzahl | Einzelpreis | Bezugsquelle |
---|---|---|---|
Arduino NANO | 1 | 3,3 € | ebay* |
Terminal Board | 1 | 3,2 € | ebay* |
RFID Modul RC522 | 1 | 5,1 € | ebay* |
1fach Relais Modul | 1 | 3 € | ebay* |
Buzzer | 1 | 1,35 € | ebay* |
Breadboard | 1 | 3,8 € | ebay* |
Breadboard Kabel 10 cm | 12 | 2,65 € | ebay* |
Breadboard Kabel 20 cm | 8 | 2,8 € | ebay* |
LED 5 mm, rot | 1 | 0,1 € | ebay* |
LED 5 mm, grün | 1 | 0,2 € | ebay* |
Kohleschichtwiderstand, 220 Ohm | 2 | 0,1 € | ebay* |
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!
Aufbau
In dem Aufbau ist zusätzlich ein kapazitiver Sensor enthalten, mit diesem Sensor löse ich zu Testzwecke den Alarm aus.
Fliegende Schaltung mit dem Breadboard
Aufbau auf dem Breadboard

Bauteil | Arduino Nano V3 |
---|---|
RFID-Kartenleser | |
SDA | D10 |
SCK | D13 |
MOSI | D11 |
MISO | D12 |
IRQ | – |
GND | GND |
RST | D9 |
3v3 | 3.3V |
Relais | |
S | D5 |
+ | 5V |
– | GND |
LED, grün | |
Kathode | GND |
Anode | D2 |
LED, rot | |
Kathode | GND |
Anode | D3 |
Piezo Buzzer | |
rot (+) | D4 |
schwarz (-) | GND |
Funktionsweise
Die Alarmanlage wird mit einem registrierten RFID Chip aktiviert und deaktiviert. Beim Deaktivieren der Alarmanlage wird auch ein bestehender Alarm deaktiviert
aktivieren
deaktivieren
auslösen eines Alarmes
deaktivieren mit falschem RFID Chip
aktivieren mit falschem RFID Chip
Quellcode
#include <SPI.h> #include <RFID.h> #define SS_PIN 10 #define RST_PIN 9 int ledStatusPin = 2; // Status LED Gruen an digitalen PIN 2 int ledAktivPin = 3; // Aktiv LED Rot an digitalen PIN 3 int buzzerPin = 4; // Buzzer an digitalen PIN 4 int relaisPin = 5; // Relais an digitalen PIN 5 (HIGH == deaktiviert & LOW == aktiviert) int alarmPin = 6; // Schalter fuer Alarm an digitalen PIN 6 boolean isActive = false; boolean isAlarm = false; RFID rfid(SS_PIN, RST_PIN); String ids[2] = {"453B56D16", "8C3B3924AA1"}; //Zugelassene ID's void setup() { pinMode(ledStatusPin, OUTPUT); pinMode(ledAktivPin, OUTPUT); pinMode(buzzerPin, OUTPUT); pinMode(relaisPin, OUTPUT); pinMode(alarmPin, INPUT); digitalWrite(alarmPin, HIGH); Serial.begin(9600); SPI.begin(); rfid.init(); } void loop() { if (isActive) { //Wenn die Alarmanlage aktiviert ist dann soll die rote LED aufleuchten. digitalWrite(ledAktivPin, HIGH); //Wenn kein Alarm aktiviert ist, so soll der Status des Alarmpins ausgewertet werden. if (isAlarm == false) { isAlarm = digitalRead(alarmPin) == HIGH; } } else { //Wenn die Alarmanlage deaktiviert ist, dann soll die rote LED aus sein und das Relais soll abgefallen sein. digitalWrite(ledAktivPin, LOW); digitalWrite(relaisPin, HIGH); } //Wenn die Alarmanlage an ist und es besteht ein Alarm so soll das Relais angezogen werden. if ((isActive == true) && (isAlarm == true)) { digitalWrite(relaisPin, LOW); } else { digitalWrite(relaisPin, HIGH); } //Wird vor das RFID Modul ein Chip gehalten so wird diese ID ausgelesen. if (rfid.isCard() && rfid.readCardSerial()) { String serial = parseId(rfid); //Ausgabe der ID auf dem Seriellen Monitor Serial.println("RFID Nummer: " + serial); //Schleife zum pruefen der erkannten RFID. int counter = 0; boolean foundId = false; for (counter = 0; counter < sizeof(ids) - 1; counter++) { //Wenn die RFID bekannt ist so soll die Alarmanlage aktiviert bzw. deaktiviert werden. if (serial == ids[counter]) { isActive = !isActive; foundId = true; flashLED(ledStatusPin, 250); break; } } //Wurde die RFID nicht in den registrierten ID's gefunden, //so soll dieses durch das blinken der roten Aktiv LED und //dem Buzzer bestätgit werden. if (!foundId) { flashLED(ledAktivPin, 550); } else if (foundId && isAlarm) { Serial.println("!!! RFID Nummer wurde gefunden !!!"); isAlarm = false; digitalWrite(relaisPin, HIGH); } } rfid.halt(); delay(750); //Pause von 750ms } //Laesst eine LED am PIN aufblinken, //der Intervall wird im Parameter milliseconds uebergeben. void flashLED(int pin, int milliseconds) { int i = 0; for (i = 0; i < 2; i++) { digitalWrite(pin, HIGH); tone(buzzerPin, 1050, 350); delay(milliseconds); digitalWrite(pin, LOW); tone(buzzerPin, 1050, 350); delay(milliseconds); } } //Liesst eine ID aus dem Modul //und gibt diese als String zurueck. String parseId(RFID rfid) { String result = ""; int position = 0; for (position = 0; position <= 4; position++) { String pos = getNumPosAsHEX(rfid, position); result = result + pos; } result.toUpperCase(); return result; } //Liefert aus dem Wert des RFID Moduls und einer bestimmten //Position einen HEXADEZIMAL Codierten Wert zurueck. String getNumPosAsHEX(RFID rfid, int position) { return String(rfid.serNum[position], HEX); }
Download des Quellcodes
Ausblick auf die nächste Ausbaustufe
Als nächste Stufe wird diese fliegende Schaltung nun in eine Dose verbaut.
Moin,
ein echt geiles Arduino Projekt! Genau das gleiche wollte ich auch machen, aber ich habe merkt das ich nur zwei Transponder bzw. RFID Nummern einspeichern kann! Meine Frage ist jetzt wie Speicher ich mehr als zwei RFID Nummern ?
Hallo,
danke. Es kommt darauf an wie du diese erweitern möchtest.
1. Programatisch
So musst du nur die Zeile 18 um die neuen IDs erweitern (eine Komma separierte Liste)
2. Über ein Modul
Wenn du jedoch das ganze dynamisch machen möchtest so könntest du einen kleinen Taster anbringen und wenn du diesen drückst und die Alarmanlage aus ist und eine unbekannte RFID Karte vorgehalten wird, so wird diese Registriert. Dazu musst du dir ein neues Array aufbauen mit den schon bekannten und der neuen ID und das alte dann überschreiben.
Ich kann ja gerne mal ein Beispiel posten, wenn bedarf besteht.
Gruß,
Stefan Draeger
Ich wollte es mit dem Programmatisch erweitern! Doch sobald ich eine weitere RFID-Nummer hinzufüge, bekomme ich eine Fehlermeldung! Ich bin leider noch ein Anfänger und kann mit dieser Fehlermeldung nichts anfangen!
Fehlermeldung:
Alarmanlage_1:18: error: too many initializers for ‚String [2]‘
String ids[2] = {„F66AE7D54D“, „B5A3365774“, „444B56D16“}; //Zugelassene ID’s
exit status 1
too many initializers for ‚String [2]‘
Hi,
ja das Array ist nur mit 2 Stellen zu befüllen wenn noch eine dritte hinzukommen soll so muss „String [2]“ in „String [3]“ geändert werden. Man reserviert somit immer Speicherplatz für mögliche Werte.
Hi
Erstmal herzlichen Dank für das kleine, aber geniale Projekt!
Es würde mich brennend interessieren, wie man eine neue neue Karte in diesem Projekt mit Hilfe eines Tasters registrieren kaönnte. Ebenso wäre das Sperren von Karten interessant. Über ein Beispiel würde ich mich sehr freuen. Danke!
Gruss Hagi
Hi, das sperren von Karten würde relativ einfach sein indem man die „KartenId“ aus dem Array entfernt. Bzw. sollte man hier vieleicht die Daten auf einer SD Karte im CSV Format speichern und diese dann beim Starten des Arduinos einlesen somit kannst du dann bequem am Rechner Ids hinzufügen und entfernen.
Gruß,
Stefan
Servus.
Super tut. Bis jetzt habe ich mir damit auch alle meine Wünsche erfüllt nun hänge ich aber dabei :
Ich möchte auf einem Lcd mit i2c einen bestimmten Text beim aktivieren und deaktiviert der Nutzer aus geben bekomme es aber einfach nicht hin die ID, S mit dem Text zu verbinden….
Hallo,
ein sehr geiles Projekt. Nachdem Abus mich echt enttäuscht hat, kam ich mit etwas Recherche auf diese Seite. Arduino ist Neuland für mich. Habe mir diesen Quellcode geladen und stehe jetzt vor dem Problem, dass ich die RFID Bibliothek nicht habe. Eine die ich mir für das RFID Modul besorgt habe passt nicht gänzlich. In dieser wird auf eine include „application.h“ verwiesen, und die fehlt mir auch. Kannst die RFID.h zur Verfügung stellen? Gibt es noch weitere Dinge daneben die ich brauche?
LG,
Kai
Hallo Kai,
hast du die Bibliothek von http://www.electrodragon.com/w/File:Rfid-master.zip versucht?
Diese habe ich für das Tutorial verwendet.
Gruß,
Stefan
Hallo Stefan,
vielen Dank für die Info. Hatte schon länger nicht mehr geguckt, sind gerade mit dem Kauf des Hauses und der Renovierung beschäftigt. Prüfe es die Tage mal.
Viele Grüße,
Kai
Bonjour , ton projet est très intéressant , mais comment puis – je ajouter un capteur PIR pour l’alarme ,je suis débutant;Bien cordialement
Hello,
thanks for your comment.
You can add a simple PIR sensor like this https://draeger-it.blog/arduino-lektion-39-pir-bewegungsmelder-hc-sr505/
Best regards,
Stefan Draeger
Ganz tolles Projekt! Wie kann man die Alarmzeit auf 1min begrenzen, bei trotzdem weiterer Scharfschaltung nach Beendigung des Alarm.
Grüße, Thomas
Hi Thomas,
der einfachste Weg wäre wenn du in der Schleife
void flashLED(int pin, int milliseconds) { int i = 0; for (i = 0; i < 2; i++) {.... den Wert "2" durch "110" ersetzt, nun sollte der Alarm ca. 1 min dauern. Jedoch kann in dieser Zeit kein weiterer Lesevorgang gestartet werden was wirklich unschön wäre. Daher sollte noch zusätzlich eine Brücke mit hinein das während der Schleife noch weitere RFIDs gelesen und ausgewertet werden können und bei Erfolg der Alarm unterbrochen wird. Gruß, Stefan Draeger
Hallo Stefan!
Vorweg erstmal, eine tolle Geschichte die Du hier machst.
Dennoch habe ich ein kleines Problem mit den RFID Karten, ich habe deinen Sketch übernommen und alles soweit verkabelt.
Die Schaltung lässt sich aber mit jeder ID aktivieren und deaktivieren, auch wenn ich acht mal die null in den String schreibe.
Kannst Du mir an dieser Stelle helfen?
Gruß
Dirk
Hallo Dirk, ich habe heute die Alramanlage nachgebaut und erhalte den selben Fehler wie du ihn beschrieben hats. Es werden alle Transponder akzeptiert. Konntest Du eine Lösung für das Problem finden? Danke und Gruß Markus
Hi,
ich habe das Projekt einmal nachgebaut und kann diesen Fehler nicht finden.
Magst du mir bitte einmal deinen Sourcecode senden?
Des Weiteren kann es helfen ein paar ausgaben der RFID-IDs einzubauen, d.h. einmal, wenn die erfolgt, Variable serial,
und einmal innerhalb der If-Bedingung, wenn serial mit id[counter] geprüft wird.
Serial.print("serial:");
Serial.println(serial);
if (serial == ids[counter]) {
Serial.print("inside:");
Serial.println(ids[counter]);
Gruß
Stefan
Hallo Stefan,
deine Alarmanlage mit RFID Steuerung ist genau dass was ich suche.
Leider stelle ich mich etwas praselig an. Ich kann den Schalt/Verdrahtungsplan nicht finden.
kannst du mir helfen?
Gruß, Thomas
Der Artikel hat mir echt bei meinem Alarmprojekt geholfen.
Vielen Dank.
Jetzt stehe ich auch vor dem oben schon erwähntem Problem mit der Alarmzeitbegrenzung.
Der Tip mit 2 auf 120 scheint bei mir gar nicht zu funktionieren.
Habe es mit millis probiert. Alarm geht auch kurz aus dann wieder an.
Dann „isActive auf false“, machmal scheint es zu gehen, dann wird der chip nicht mehr erkannt.. ich habe jetzt einen Knoten im Kopf und komme nicht mehr weiter.
Hat da nicht jemand einen neuen Ansatz für mich?
//Wenn die Alarmanlage an ist und es besteht ein Alarm so soll das Relais angezogen werden.
if ((isActive == true) && (isAlarm == true)) {
digitalWrite(relaisPin, HIGH);
unsigned long currentMillis = millis();
if (currentMillis – previousMillis >= interval)
{
previousMillis = currentMillis;
digitalWrite(relaisPin,LOW);
(digitalWrite(ledAktivPin, LOW);
isActive = false;
}