#include <Keypad.h> //Tastenfeld Bibliothek
//Reihen und Spalten des Tastenfelds definieren
const byte REIHEN = 4;
const byte SPALTEN = 4;
//Tastenfeld Aufbau
char tasten[REIHEN][SPALTEN] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
//Pins definieren
byte reihenPins[REIHEN] = {9, 8, 7, 6};
byte spaltenPins[SPALTEN] = {5, 4, 3, 2};
//LED Pins definieren
const int gruenLED = 11;
const int rotLED = 12;
//Tastaturobjekt erstellen
Keypad tastenfeld = Keypad(makeKeymap(tasten), reihenPins, spaltenPins, REIHEN, SPALTEN);
//Passwort
String passwort = "987654";
String eingabe = ""; //Speichern der Eingabe
//Eingabedauer Begrenzung
unsigned long letzteEingabe = 0; //Letzte Eingabe
const int timeout = 3000; //Dauer bis zum Abbruch der Eingabe
//Zähler der Eingaben mit falschen Passwörtern
int falsch = 0;
void setup()
{
pinMode(gruenLED, OUTPUT);
pinMode(rotLED, OUTPUT);
Serial.begin(9600);
}
void loop()
{
char taste = tastenfeld.getKey(); //Abfrage, ob eine Taste gedrückt wurde
if (taste)
{
letzteEingabe = millis(); //Zeitpunkt der letzten Eingabe speichern
if (taste == '#') //Abfrage, ob "#" gedrückt wurde
{
checkPasswort(); //Abfrage, ob das richtige Passwort eingegeben wurde
}
else if (taste >= '0' && taste <= '9') //Abfrage, ob nur zulässige Tasten gedrückt wurden
{
eingabe += taste; //Taste zur Eingabe hinzufügen
Serial.println(eingabe); //Eingabe ausgeben
}
}
//Überprüfen, ob die Eingabe zu lange gedauert hat
if (eingabe.length() > 0 && millis() - letzteEingabe > timeout)
{
Serial.println("Eingabe zurückgesetzt"); //Nachricht ausgeben
eingabe = ""; //Eingabe löschen
}
}
void checkPasswort()
{
if (eingabe == passwort) //Abgleich vom eingegebenen Passwort mit dem eingespeicherten Passwort
{
Serial.println("Korrekt!"); //Korrekt ausgeben
digitalWrite(gruenLED, HIGH);
delay(5000);
digitalWrite(gruenLED, LOW);
falsch = 0; //Zähler zurücksetzen
}
else
{
falsch++; //Zähler um 1 erhöhen
Serial.println("Falsch!"); //Falsch ausgeben
blinkzeit_rote_LED(); //Blinken der Roten LED
}
eingabe = ""; //Eingabe zurücksetzen
}
void blinkzeit_rote_LED()
{
int blinkzeit = 2000 * (1 << (falsch - 1)); //Blinkzeit ausrechnen
Serial.print("Blinkzeit: ");
Serial.println(blinkzeit / 1000); //Blinkzeit ausgeben
for (int i = 0; i < blinkzeit / 1000; i++) //LED so oft blinken lassen, wie Sekunden berechnet wurden
{
digitalWrite(rotLED, HIGH);
delay(500);
digitalWrite(rotLED, LOW);
delay(500);
}
}