Arduino Projekt: Alarmanlage mit RFID Steuerung

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 € conrad.de
LED 5 mm, grün 1 0,2 € conrad.de
Kohleschichtwiderstand, 220 Ohm 2 0,1 € conrad.de

Die Einzelpreise wurde kaufmännisch aufgerundet.

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 der Alarmanlage mit dem RFID Modul.
Aufbau der Alarmanlage.

Aufbau auf dem Breadboard

Aufbau "Alarmanlage mit RFID Modul am Arduino Nano"
Aufbau „Alarmanlage mit RFID Modul am Arduino Nano“

 Funktionsweise

Die Alarmanlage wird mit einem registrierten RFID Chip aktiviert und deaktiviert. Beim Deaktivieren der Alarmanlage wird auch ein bestehender Alarm deaktiviert

aktivieren

Alarmanlage aktivieren

deaktivieren

Alarmanlage deaktivieren

auslösen eines Alarmes

Alarmanlage Alarm auslösen

deaktivieren mit falschem RFID Chip

Alarmanlage deaktivieren mit falscher RFID Karte

aktivieren mit falschem RFID Chip

Alarmanlage aktivieren mit falscher RFID Karte

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.

dose
Abzweigdose, als Gehäuse für die Alarmanlage

18 Kommentare

  1. 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 ?

    1. 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

      1. 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]‘

        1. 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.

      2. 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

        1. 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

  2. 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….

  3. 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

  4. 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

  5. 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

  6. Ganz tolles Projekt! Wie kann man die Alarmzeit auf 1min begrenzen, bei trotzdem weiterer Scharfschaltung nach Beendigung des Alarm.

    Grüße, Thomas

    1. 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

  7. 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

  8. 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

  9. 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;
    }

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert