Hallo,
ich würde gerne ein Tür mit einem Rfid chip "öffnen" ! Zuvor probiere ich es erstmal mit einer LED, die grün leuchtet wenn die richtige RFID Karte drangehalten wurde und rot wenn eine falsche Rfid Karte erkannt wurde.
Dazu habe ich mir erstmal dieses RFID modul besorgt http://www.seeedstudio.com/depot/-p-171.html.
Anschließend habe ich erstmal so ein paar Tutorials gemacht:
http://www.instructables.com/id/Arduino-and-RFID-from-seeedstudio/ (das hat mir an sich gut gefallen, nur funktioniert der Sketch bei mir nicht so wie er sollte. Es wurde nicht der "fertige" RFID Tag in eine Zeile in den Seriellen Monitor geschrieben, sondern jede Zeile kam eine neue Zahl dazu ?!)
RFID Button - 16mm (125KHz) - Proto-PIC
Da ist ja weiter unten, unter dem Punkt Documents ein Bespiel für den Arduino mit einer Anwendung für VB. Ich habe mich natürlich nur auf den "Arduino Teil" konzentriert.
Erstmal der Sketch von der Website:
// Interfacing the 125Khz RFID module - UART(PPRFR101A1M-X)
// Created 20 May 2011 www.proto-pic.co.uk
#include <SoftwareSerial.h>
String msg;
char inChar;
int x;
SoftwareSerial Rfid(2, 3); // RX as pin 2
void setup()
{
Serial.begin(115200);
Rfid.begin(9600);
}
void loop()
{
while (inChar = Rfid.read() != 2) // Wait for start byte from Rfid reader when tag is swiped
{
}
msg = "";
for (x = 0; x < 12; x++)
{
delay(10);
inChar = Rfid.read();
msg += inChar;
}
Serial.print(msg); // Sends the ID plus the checksum byte (12 bytes)
}
Da dieser Sketch erstmal nur die Tags lesen konnte, und auch vernünftig dem Seriellen Monitor die Tags übergeben konnte, habe ich diesen Sketch mal etwas abgeändert !
#include <SoftwareSerial.h>
#define RICHTIG "05003E22627B"
String msg;
char inChar;
int x;
SoftwareSerial Rfid(2, 3); // RX as pin 2
int rot = 5;
int gruen = 6;
int rgbblinkhigh[] = {250, 250, 2000};
int rgbblinklow[] = {250, 250, 100};
boolean var = true;
void setup()
{
pinMode(rot, OUTPUT);
pinMode(gruen, OUTPUT);
Serial.begin(9600);
Rfid.begin(9600);
}
void loop()
{
digitalWrite(rot, HIGH);
digitalWrite(gruen, HIGH);
if(var == true) //dieses soll bewirken das der Rfid reader nur einmal liest, wenn er einen Tag erkennt ! also nicht mehrmals in den Seriellen monitor schreiben. (Das ist das Problem)
{
var = false;
while (inChar = Rfid.read() != 2) // Wait for start byte from Rfid reader when tag is swiped
{
}
msg = "";
for (x = 0; x < 12; x++)
{
delay(10);
inChar = Rfid.read();
msg += inChar;
}
}
Serial.println(msg);
// Sends the ID plus the checksum byte (12 bytes)
if(msg.indexOf(RICHTIG)>=0)
{
Serial.println("Zutritt erlaubt");
for(int i = 0; i < 3; i++)
{
digitalWrite(gruen, LOW);
delay( rgbblinkhigh [i]);
digitalWrite(gruen, HIGH);
delay( rgbblinklow [i]);
}
}
else
{
Serial.println("Zutritt verboten");
for(int i = 0; i < 3; i++)
{
digitalWrite(rot, LOW);
delay( rgbblinkhigh [i]);
digitalWrite(rot, HIGH);
delay( rgbblinklow [i]);
}
}
var = true; //wieder auf true, damit wieder ein Tag gelesen werden kann
}
Ich hoffe jeder versteht was da so in dem Sketch "vor sich geht" ! Sonst fragt !
Bisher liest das RFID module die Tags ja ununterbrochen (d.h. der Tag wird immer weiter an den Monitor gesendet), natürlich nur wenn er einen erkennen kann, sprich wenn jemand einen vor die Antenne hält. Ich würde es gerne schaffen, dass, wenn der RFID reader ein Chip erkennt, diesen nur einmal liest, und danach eine "blink" - Folge der LED nur einmal startet. Zur Zeit ist es noch so, dass wenn ich den Chip mal etwas zu lang gegen die Antenne gehalten habe, dann wurde die blink Folge zweimal oder dreimal, je nach dem wie lange man den Chip vor die Antenne hält , abgespielt. Dazu wurde natürlich auch der Tag mehrmals in den Seriellen Monitor geschrieben.
Ich würde es nun gerne hinbekommen, dass das RFID module sozusagen nur einmal liest...sodass nur einmal die LED blinkfolge abläuft und auch nur einmal der Tag in den Seriellen Monitor geschrieben wird....ich finde das gerade echt schwer, dass hier alles so zu beschreiben !
Dazu habe ich mir erstmal gedacht, einfach eine If bedingung aufzustellen, wie man in dem Sketch sieht (var). Also solange var = true ist, soll das Module lesen und wenn false halt nicht. Direkt nach der Bedingung wird var auf false gesetzt, sodass dieser Abschnitt erstmal nicht nochmal durchlaufen kann (habe ich mir so vorgestellt), und wenn die LED fertig mit ihrer Blinkfolge sind, dann wird var wieder auf true gesetzt, wodurch der Abschnitt, also der rfid reader, wieder lesen kann. Da man den Chip wieder wegnimmt, sobald die LED anfängt so blinken, müsste es ja eigentlich passen. Aber irgendwie bekomme ich das nicht so hin, wie ich das gerne haben möchte !
Also ich hoffe mich kann da jemand etwas helfen....entweder ist es mega einfach und ich bin einfach zu doof das mal wieder zu finden oder es ist aus irgendeinem Grund nicht so einfach wie ich mir gedacht habe...
Falls ihr das nicht so versteht, was ich jetzt so genau meine, dann fragt nochmal ! Wird wahrscheinlich so sein, habe mir leider nicht so viel Mühe gegeben, ist aber auch nicht immer einfach hier so alles im Detaill zu beschreiben !
Hoffe auf hilfreiche Antworten/Fragen !
Grüße Lorenz