#include <SoftwareSerial.h> // nutzen virtuellen seriellen Port
#include <LiquidCrystal.h>
#define LED 13 // the pin for the LED
#define BUTTON 9 // the input pin where the pushbutton is connected
#define RELAY 8
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
const int signalPin1 = 7;
const int signalPin2 = 6;
const int signalPin3 = 5;
const int startZeichen = 02; // Chip-Kennung beginnt mit 02
const int endeZeichen = 03; // ASCII CR bendet Code
const int kennungLaenge = 14; // Laenge Chip-Code 10 ASCII-Zeichen
const int gesamtKennungLaenge = 14; // Code-Laenge + Start- und Ende-Bytes
char code[kennungLaenge + 1]; // fuer den Code und abschliessende Null
int bytesGelesen = 0;
int zaehlerFehlerCode = 0;
int Zugangzu = 0;
int val=0; // val will be used to store the state
// of the input pin
int old_val=0; // this variable stores the previous
// value of "val"
int state=0; //0=LED off and 1 = LED on
String zugang0 = "000000000000"; // ungueltiger Zugangscode, Standard
String zugang1 = "030030B2E667"; // Zugangscode Chip 1
String zugang2 = "030030BC74FB"; // Zugangscode Chip 1
void setup()
{
Serial.begin(9600); // initialisiere serielle Konsole
Serial.println("RFID-Leser bereit ... ");
pinMode(signalPin1, OUTPUT);
digitalWrite(signalPin1, LOW);
pinMode(signalPin2, OUTPUT);
digitalWrite(signalPin2, LOW);
pinMode(LED, OUTPUT); // tell arduino LED is an output
pinMode(BUTTON, INPUT); // and BUTTON is an input
pinMode(RELAY, OUTPUT); // tells arduino RELAY is an output
}
void loop()
{
if(Zugangzu == 1)
{
val=digitalRead(BUTTON);
if (val == 0)
{
digitalWrite(LED,HIGH); // turn LED ON
digitalWrite(RELAY,HIGH); // turn RELAY ON
}
else
{
digitalWrite(LED,LOW); // turn LED OFF
digitalWrite(RELAY,LOW); // turn RELAY OFF
}
}
Serial.flush();
if (Serial.available() >= gesamtKennungLaenge) // wenn genug Zeichen eingegangen ...
{
if(Serial.read() == startZeichen) // und das Startzeichen erkannt wurde ...
{
Serial.print("Start-Byte erkannt ... ");
bytesGelesen = 0; // starten Lesen, also Zaehler auf 0
while(bytesGelesen < kennungLaenge) // lese 10-stelligen Code
{
char zeichen = Serial.read(); // lesen Zeichen
Serial.print(zeichen); // zur Kontrolle
Serial.print(" ");
if(zeichen == endeZeichen) // suche nach Ende-Befehl
{
Serial.println("CR erkannt ...");
break;
}
code[bytesGelesen] = zeichen; // speicher Zeichen im Puffer
bytesGelesen = bytesGelesen + 1; // ein Zeichen weiter
}
code[bytesGelesen] = 0; // beende Zeichenkette
Serial.print("RFID-Code lautet: ");
Serial.println(code);
zugang0 = code; // Umwandlung Code in String
if (zugang0 == zugang1)
{
zaehlerFehlerCode = 0;
}
else if (zugang0 == zugang2)
{
zaehlerFehlerCode = 0;
}
else
{
zaehlerFehlerCode = zaehlerFehlerCode + 1;
}
zugang0 = 0;
Serial.println(zaehlerFehlerCode);
signal();
}
}
}
void signal()
{
if (zaehlerFehlerCode == 0)
{
if (Zugangzu >= 1)
{
Serial.println("Zugang gesperrt!");
digitalWrite(signalPin1, LOW); // Signal aus
digitalWrite(LED,LOW); // turn LED OFF
digitalWrite(RELAY,LOW);
Zugangzu = 0;
}
else
{
Serial.println("Zugang freigeschaltet!");
digitalWrite(signalPin1, HIGH); // Signal an
digitalWrite(signalPin3, HIGH); // Signal anelay(5000);
Zugangzu = Zugangzu +1;
digitalWrite(RELAY,HIGH);
delay(5000);
digitalWrite(RELAY,LOW);
digitalWrite(signalPin3, LOW);
}
}
else if (zaehlerFehlerCode <= 9) // bei bis zu 4 fehlerhaften Versuchen
{
Serial.println("Zugang verweigert!");
digitalWrite(signalPin2, HIGH); // Signal an
digitalWrite(signalPin1, LOW); // Signal aus
digitalWrite(LED,LOW); // turn LED OFF
digitalWrite(RELAY,LOW); // turn RELAY OFF
Zugangzu = 0;
delay(10000); // Verzoegerung 10 Sekunden
digitalWrite(signalPin2, LOW); // Signal aus
}
else
{
Serial.println("Zugang verweigert");
digitalWrite(signalPin2, HIGH); // Signal an
digitalWrite(signalPin1, LOW); // Signal aus
digitalWrite(LED,LOW); // turn LED OFF
digitalWrite(RELAY,LOW); // turn RELAY OFF
Zugangzu = 0;
delay(60000); // Verzoegerung 1 Minute
digitalWrite(signalPin2, LOW); // Signal aus
}
}