#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
const uint8_t REIHEN = 4;
const uint8_t SPALTEN = 4;
#define I2C_ADDR 0x27
#define LCD_SPALTEN 16
#define LCD_ZEILEN 2
#define SERVO_VERSPERREN_POS 20
#define SERVO_ENTSPERREN_POS 90
#define rot 13
#define gruen 12
// Erstelle Servo-Objekt
Servo servo;
// Definiere Tasten des Keypads
char tasten[REIHEN][SPALTEN] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Definiere Pins für das Keypad
uint8_t spaltenPins[SPALTEN] = {5, 4, 3, 2};
uint8_t reihenPins[REIHEN] = {9, 8, 7, 6};
// Erstelle Keypad-Objekt
Keypad keypad = Keypad(makeKeymap(tasten), reihenPins, spaltenPins, REIHEN, SPALTEN);
// Erstelle LiquidCrystal_I2C-Objekt
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_SPALTEN, LCD_ZEILEN);
// Definiere Verzögerungen für Codeüberprüfung und Nachrichtenanzeige
const int CODE_PRUEF_VERZOEGERUNG = 500; // Verzögerung anpassen basierend auf Schreibgeschwindigkeit
const int NACHRICHT_VERZOEGERUNG = 2000; // Verzögerung für Nachrichtenanzeige anpassen
const int START_SPERR_ZEIT = 10000; // Anfangswert für die Sperrzeit für Passwort bei dreimaligem Fehlversuch
int PASSWORT_SPERR_ZEIT = START_SPERR_ZEIT; // Aktuelle Sperrzeit für Passwort bei dreimaligem Fehlversuch
// Zeichenfolgen zum Speichern des eingegebenen Codes und der Nachricht
String phrase = "";
String nachricht = "";
// Benutzercodes
const String adminCode = "1234";
const String userCode = "0000";
// Benutzernamen
const String adminName = "Admin";
const String userName = "Benutzer";
// Zähler für falsche Passworteingaben
int falscheEingaben = 0;
// Funktion zum Entsperren des Servos
void entsperren() {
servo.write(SERVO_VERSPERREN_POS);
}
// Funktion zum Verriegeln des Servos
void verriegeln() {
servo.write(SERVO_ENTSPERREN_POS);
}
// Funktion zum Anzeigen von "Codeeingabe" auf dem LCD
void showCodeInput() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CODE EINGEBEN");
}
void setup() {
// Initialisiere den LCD-Bildschirm und schalte die Hintergrundbeleuchtung ein
lcd.init();
lcd.backlight();
// Befestige den Servo an Pin 10
servo.attach(10);
// Initialisiere die serielle Kommunikation
Serial.begin(115200);
// Konfiguriere Pins für LEDs (rot und grün)
pinMode(rot, OUTPUT);
pinMode(gruen , OUTPUT);
// Anzeige von "Codeeingabe" beim Setup
showCodeInput();
}
void loop() {
// Erfasse die gedrückte Taste auf dem Keypad
char taste = keypad.getKey();
// Wenn eine Taste gedrückt wurde
if (taste != NO_KEY) {
// Füge die Taste der Zeichenfolge hinzu
phrase += taste;
// Lösche den LCD-Bildschirm
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(phrase);
// Wenn die Länge der Zeichenfolge die erste Zeile des LCD-Bildschirms überschreitet
if (phrase.length() > LCD_SPALTEN) {
lcd.setCursor(0, 1);
lcd.print(phrase.substring(LCD_SPALTEN, 2 * LCD_SPALTEN));
}
// Wenn die Länge der Zeichenfolge 4 Zeichen erreicht
if (phrase.length() == 4) {
// Einführung einer Verzögerung für die Codeüberprüfung
delay(CODE_PRUEF_VERZOEGERUNG);
// Überprüfe den eingegebenen Code
if (phrase == adminCode) {
// Wenn der Code für den Admin korrekt ist, zeige eine Begrüßungsnachricht mit dem Namen des Admins an, entsperre den Servo und schalte die grüne LED ein
nachricht = "Hallo, " + adminName + "!";
entsperren();
digitalWrite(gruen, HIGH);
digitalWrite(rot, LOW);
// Zeige die Nachricht auf dem LCD-Bildschirm an
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(nachricht);
// Schließe die Tür nach einer Verzögerung
delay(NACHRICHT_VERZOEGERUNG);
verriegeln();
digitalWrite(gruen, LOW);
digitalWrite(rot, HIGH); // Schalte das rote LED ein, da die Tür geschlossen ist
// Setze die Sperrzeit zurück
PASSWORT_SPERR_ZEIT = START_SPERR_ZEIT;
} else if (phrase == userCode) {
// Wenn der Code für den Benutzer korrekt ist, zeige eine Begrüßungsnachricht mit dem Namen des Benutzers an, entsperre den Servo und schalte die grüne LED ein
nachricht = "Hallo, " + userName + "!";
entsperren();
digitalWrite(gruen, HIGH);
digitalWrite(rot, LOW);
// Zeige die Nachricht auf dem LCD-Bildschirm an
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(nachricht);
// Schließe die Tür nach einer Verzögerung
delay(NACHRICHT_VERZOEGERUNG);
verriegeln();
digitalWrite(gruen, LOW);
digitalWrite(rot, HIGH); // Schalte das rote LED ein, da die Tür geschlossen ist
// Setze die Sperrzeit zurück
PASSWORT_SPERR_ZEIT = START_SPERR_ZEIT;
} else {
// Wenn der Code inkorrekt ist, erhöhe den Zähler für falsche Eingaben
falscheEingaben++;
// Wenn das Passwort dreimal falsch eingegeben wurde
if (falscheEingaben >= 3) {
// Zeige "GESPERRT" auf dem LCD-Bildschirm an
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("GESPERRT");
// Warte für die Sperrzeit
delay(PASSWORT_SPERR_ZEIT);
// Erhöhe die Sperrzeit um 10 Sekunden
PASSWORT_SPERR_ZEIT += 10000;
// Setze den Zähler für falsche Eingaben zurück
falscheEingaben = 0;
// Anzeige von "Codeeingabe" nach dem Entsperren
showCodeInput();
} else {
// Zeige eine Fehlermeldung an, verriegle den Servo und schalte die rote LED ein
nachricht = "Falscher Code";
verriegeln();
digitalWrite(gruen, LOW);
digitalWrite(rot, HIGH);
// Zeige die Nachricht auf dem LCD-Bildschirm an
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(nachricht);
}
}
// Lösche die Zeichenfolge
phrase = "";
// Anzeige von "Codeeingabe" nach dem Löschen der Nachricht
if (falscheEingaben < 3) {
showCodeInput();
}
}
}
}