RFID gebundener Türöffner
Kurzinformationen: Nach unserem Hauskauf wollten wir eine Lösung bei der wir nicht jedes mal den Haustürschlüssel suchen mussten. Ich wollte zudem meine Implantate zum öffnen benutzen. In der ersten Version hatten wir nur eine einfache 12V Türfalle. Später folgte mit dem Umbau der Haustüre dann eine elektrifizierte Haustüre mit eingebautem Motor wofür ich die Schaltung über ein 12V Netzteil und einer Stromstoßschaltung als Auslöser laufen lassen musste.
Für diese Situation habe ich einen Arduino-Nano verbaut da ich draußen nicht so viel Platz hatte um alles zu verbauen. Zuerst wollte ich alles in die Klingelanlage bauen leider war diese bereits perfekt Platzsparend ausgearbeitet. Jetzt habe ich einen passenden Platz gefunden der gut erreichbar ist und versteckt ist. Hinter einem kleinen Werbeschild befindet sich eine passende Schalung die ich mit dem 3D-Drucker gedruckt habe in der alles montiert ist.
Für die Abfrage der Chipkennung nutze ich einen MFRC522. Dieser wird an PIN9 und 10 angeschlossen. Der Transistor (IRFZ44N) kommt mit dem Gate an PIN 8.
Am Anfang inkludiere ich die beiden Bibliotheken SPI als Datenschnittstelle und die MFRC522 für die Ansteuerung des RFID Lesers über den Serial Data Anschluss (Pin10). Nach dem ich die 3 PIN´s entsprechend definiert habe erstelle ich den RFID-Empfänger unter dem gleichnamigen Objekt „mfrc522“ (Kleingeschrieben). Dieser Name wird im gesamten Script benutzt. Jedes Mal wenn ich den Namen aufrufe wird der Leser damit angesprochen. Der Name ist frei wählbar. Im Script kann man dann einfach jedes kleingeschriebene „mfrc522“ gegen was X-beliebiges ersetzen.
#include <SPI.h> // SPI-Bibiothek hinzufügen
#include <MFRC522.h> // RFID-Bibiothek hinzufügen
#define SDA_PIN 10 // SDA an Pin 10
#define RST_PIN 9 // RST an Pin 9
#define PIN_Tuermotor 8 // Türöffner an PIN 8
MFRC522 mfrc522(SDA_PIN, RST_PIN); // RFID-Empfänger benennenDer Setup
Zum Beginn des Setups starte ich zum Monitoren der Funktionen eine Serielle Verbindung mit einer Baudrate von 9600bps. Ebenfalls starte ich die SPI-Verbindung und initialisieren mit PCD_Init(); das Objekt. Dann wird noch der Türmotor als OUTPUT definiert und auf LOW gesetzt.
void setup(){
Serial.begin(9600); // Serielle Verbindung starten (Monitor)
SPI.begin(); // SPI-Verbindung aufbauen
mfrc522.PCD_Init(); // Initialisierung des RFID-Empfängers
pinMode(PIN_Tuermotor,OUTPUT);
//digitalWrite(PIN_Tuermotor, HIGH);
//delay(5000);
digitalWrite(PIN_Tuermotor, LOW);
Serial.println("Beginn des Scripts");
}Die Loop
Am Anfang der Main-Schleife definiere ich 2 Strings. Einen Namens „Token_ID“ der die gesamte ID des Tokens beinhalten soll und einen String namens „Token_Byte“ der beim lesen das gelesene Byte aufnehmen soll damit es an die ID angehangen werden soll.
Es gibt für den MFRC522 zwei Zustände.
- Karte vorhanden == mach etwas
oder - Keine Karte == fang von vorne an.
void loop(){
String Token_ID;
String Token_Byte;
if ( ! mfrc522.PICC_IsNewCardPresent()) // Wenn keine Karte in Reichweite ist...
{
return; // ...springt das Programm zurück vor die if-Schleife, womit sich die Abfrage wiederholt.
}
if ( ! mfrc522.PICC_ReadCardSerial()) // Wenn kein RFID-Sender ausgewählt wurde
{
return; // ...springt das Programm zurück vor die if-Schleife, womit sich die Abfrage wiederholt.
}
Serial.print("Die ID des RFID-TAGS lautet:");
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Token_Byte=(mfrc522.uid.uidByte[i]);
Serial.print(mfrc522.uid.uidByte[i]); // Dann wird die UID ausgelesen, die aus vier einzelnen Blöcken besteht und der Reihe nach an den Serial Monitor gesendet.
Serial.print(" ");
Token_ID=Token_ID+Token_Byte;
}
Serial.println();
delay(1000);
HIER FEHLT NOCH DIE ABSCHLIEßENDE GESCHWEIFTE KLAMMER!!!
DIESE FOLGT IM NACHVOLGENDEN CODEBLOCKWenn eine Karte erkannt wird, liest der Empfänger die UID der Karte aus. Diese besteht aus 4 Bytes. Diese werden einzeln gelesen und aneinander gereiht. Sowohl im seriellen Monitor werden die ausgegeben als auch in den String „Token_ID“ geschrieben. Diesen benötigt man jetzt noch zum Abgleich.
Man kann die Bytes auch als Hex ausgeben lassen. Hierzu hängt man dann noch nach einem Komma das Argument HEX mit an.
Serial.print(mfrc522.uid.uidByte[i]); // Dann wird die UID ausgelesen, die aus vier einzelnen Blöcken besteht und der Reihe nach an den Serial Monitor gesendet.
Serial.print(mfrc522.uid.uidByte[i], HEX); // Dann wird die UID ausgelesen, die aus vier einzelnen Blöcken besteht und der Reihe nach an den Serial Monitor gesendet. Die Endung Hex bedeutet, dass die vier Blöcke der UID als HEX-Zahl (also auch mit Buchstaben) ausgegeben wirdDie Auswertung
Die Auswertung erfolgt Hardcoded mit einer IF-Abfrage. Passt die ID zu einer fest codierten wird der PIN des Motors für X-Sekunden betätigt (frei wählbar) und danach wieder geschlossen.
if(Token_ID == "XXXXXXXXXXXXXXXX"){
Serial.println("Token ist registriert. Tür wird geöffnet");
digitalWrite(PIN_Tuermotor, HIGH);
delay(1000);
digitalWrite(PIN_Tuermotor, LOW);
Serial.println("Tür wieder geschlossen");
}
if(Token_ID == "XXXXXXXXXXXXXXXX"){ //Token Fabian
Serial.println("Token ist registriert. Tür wird geöffnet");
digitalWrite(PIN_Tuermotor, HIGH);
delay(1000);
digitalWrite(PIN_Tuermotor, LOW);
Serial.println("Tür wieder geschlossen");
}
if(Token_ID == "XXXXXXXXXXXXXXXX"){ //Smartwatch Christian
Serial.println("Token ist registriert. Tür wird geöffnet");
digitalWrite(PIN_Tuermotor, HIGH);
delay(1000);
digitalWrite(PIN_Tuermotor, LOW);
Serial.println("Tür wieder geschlossen");
}
if(Token_ID == "XXXXXXXXXXXXXXXX"){
Serial.println("Token ist registriert. Tür wird geöffnet");
digitalWrite(PIN_Tuermotor, HIGH);
delay(1000);
digitalWrite(PIN_Tuermotor, LOW);
Serial.println("Tür wieder geschlossen");
}
if(Token_ID == "XXXXXXXXXXXXXXXX"){ //Smartwatch Fabian
Serial.println("Token ist registriert. Tür wird geöffnet");
digitalWrite(PIN_Tuermotor, HIGH);
delay(1000);
digitalWrite(PIN_Tuermotor, LOW);
Serial.println("Tür wieder geschlossen");
}
}Zur Orientierung habe ich hinter die ID´s noch als Kommentar geschrieben welches Gerät/Token das ist.
Damals wusste ich es nicht besser, heute würde ich mit Sicherheit einen Switch…Case benutzen um die ID´s zu vergleichen oder den Inhalt der IF-Zweige in eine Funktion packen und aufrufen aber soweit war ich damals noch nicht und da waren es nur 2 Token. Das es mal so viele werden wusste ich nicht Aber fest steht: Wenn ich noch etwas ändere werde ich das hier dazu schreiben.
Denn! Code verkürzen und verschönern hilft (fast) immer.