// Bibliotheken
#include <Wire.h> // Bibliothek für I2C-Kommunikation
#include <LiquidCrystal_I2C.h> // Bibliothek für das LCD mit I2C
#include <Keypad.h> // Bibliothek für das Keypad
// LED und Magnet-Pin Definitionen
#define rote_LED 12 // Pin für die rote LED
#define gruene_LED 13 // Pin für die grüne LED
#define magnet 9 // Pin für das Magnetventil
// I2C LCD Konfiguration
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD-Objekt initialisieren (Adresse: 0x27, 16x2 Zeichen)
// Keypad Konfiguration
const byte keypad_reihe = 4; // Anzahl der Zeilen des Keypads
const byte keypad_spalte = 4; // Anzahl der Spalten des Keypads
char keys[keypad_reihe][keypad_spalte] = { // Zuordnung der Tasten
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte Reihe_Pins[keypad_reihe] = {5, 4, 3, 2}; // Pins für die Zeilenverbindungen
byte Spalte_Pins[keypad_spalte] = {A3, A2, A1, A0}; // Pins für die Spaltenverbindungen
Keypad keypad = Keypad(makeKeymap(keys), Reihe_Pins, Spalte_Pins, keypad_reihe, keypad_spalte); // Keypad initialisieren
// Grundeinstellungen
String aktueller_Code = ""; // Der Safe startet ohne Code
bool gesperrt = true; // Standardzustand des Safes (gesperrt)
int falsche_Versuche = 0; // Zähler für falsche Eingabeversuche
// Speichert Code
void setzeCode(String neuer_Code) { // Speichert einen neuen Code
aktueller_Code = neuer_Code; // speichert in "" den eingegebenen Code
}
// Sperrvorgang
void Sperrvorgang() { // Sperrt den Safe
gesperrt = true; // true bedeutet gesperrt
digitalWrite(magnet, HIGH); // Magnet einschalten
digitalWrite(rote_LED, HIGH); // Rote LED einschalten
digitalWrite(gruene_LED, LOW); // Grüne LED ausschalten
}
// Entsperrvorgang
void Entsperrvorgang() { // Entsperrt den Safe
gesperrt = false; // false bedeutet nicht gesperrt, also entsperrt
digitalWrite(magnet, LOW); // Magnet ausschalten
digitalWrite(rote_LED, LOW); // Rote LED ausschalten
digitalWrite(gruene_LED, HIGH); // Grüne LED einschalten
}
// Startanzeige
void Startanzeige() { // Zeigt die Startnachricht auf dem LCD
lcd.setCursor(0, 0); // Cursor auf erste Zeile setzen
lcd.print("Abschlussprufung"); // Titel ausgeben
delay(1000); // Kurze Pause
lcd.setCursor(0, 1); // Cursor auf zweite Zeile setzen
lcd.print("von Jessica Otto"); // Autorennamen ausgeben
delay(3000); // Längere Pause
}
// Code mit 4 Stellen eingeben
String Eingabe_Code() { // Eingabe Code
lcd.setCursor(5, 1); // Cursor für Eingabeanzeige setzen
lcd.print("[____]"); // Platzhalter für den Code anzeigen
lcd.setCursor(6, 1); // Cursor in die Eingabeposition setzen
String Code = ""; // Initialisierung des Ergebnis-Strings
while (Code.length() < 4) { // Eingabe, bis 4 Stellen erreicht sind
char zeichen = keypad.getKey(); // Abfrage einer Tasteneingabe
if (zeichen >= '0' && zeichen <= '9') { // damit ich nur Zahlen eingeben kann
lcd.print('*'); // Sternchen für Sicherheit anzeigen
Code += zeichen; // Taste zum Ergebnis hinzufügen
}
}
return Code; // Rückgabe des eingegebenen Codes
}
// Erstellung eines Codes
bool Erstellung_neuer_Code() { // Erstellt und bestätigt einen neuen Code
while (true) { // Wiederholung, bis Code korrekt bestätigt
lcd.clear(); // LCD löschen
lcd.setCursor(3, 0); // Cursor setzen
lcd.print("Dein Code:"); // Aufforderung zur Eingabe
String neuer_Code = Eingabe_Code(); // Eingabe des neuen Codes
lcd.clear(); // LCD löschen
lcd.setCursor(3, 0); // Cursor setzen
lcd.print("Bestatige:"); // Bestätigungsaufforderung
String Bestatigung = Eingabe_Code(); // Bestätigungscode eingeben
if (neuer_Code.equals(Bestatigung)) { // Wenn Codes übereinstimmen
setzeCode(neuer_Code); // Code speichern
lcd.clear(); // LCD löschen
lcd.setCursor(0, 0); // Cursor setzen
lcd.print("Code akzeptiert!"); // Erfolgsmeldung anzeigen
delay(3000); // Kurze Pause
return true; // Erfolgreich beendet
} else { // Wenn Codes nicht übereinstimmen
lcd.clear(); // LCD löschen
lcd.setCursor(0, 0); // Cursor setzen
lcd.print("Code passt nicht"); // Fehlermeldung
lcd.setCursor(0, 1); // Cursor in zweite Zeile setzen
lcd.print("Versuche erneut"); // Neue Eingabe fordern
delay(3000); // Kurze Pause
}
}
}
void Entsperrmeldung() { // Zeigt eine Entsperrmeldung an
lcd.clear(); // LCD löschen
lcd.setCursor(3, 0); // Cursor setzen
lcd.print("Entsperrt!"); // Erfolgsmeldung
delay(3000); // Kurze Pause
}
void Auswahl_neu_alt() { // Logik für den entsperrten Safe
lcd.clear(); // LCD löschen
lcd.setCursor(2, 0); // Cursor setzen
lcd.print("*=neuer Code"); // Option für neuen Code anzeigen
lcd.setCursor(2, 1); // Cursor in zweite Zeile setzen
lcd.print("#=alter Code"); // Option für alten Code behalten
char zeichen = keypad.getKey(); // Abfrage einer Tastenwahl
while (zeichen != '*' && zeichen != '#') { // damit ich nur * oder # eingeben kann
zeichen = keypad.getKey(); // Erneute Abfrage
}
switch(zeichen) { // Nutzung einer switch-Anweisung für Auswahl
case '*': // Neuer Code gewünscht
if (!Erstellung_neuer_Code()) return; // Neuen Code erstellen, bei Fehler abbrechen
break;
case '#': // Alter Code bleibt
lcd.clear(); // LCD löschen
lcd.setCursor(2, 0); // Cursor setzen
lcd.print("Alter Code"); // Nachricht anzeigen
lcd.setCursor(4, 1); // Nachricht fortsetzen
lcd.print("bleibt");
delay(2000); // Pause
break;
}
Sperrvorgang(); // Safe sperren
}
void safeLockedLogic() { // Logik für den gesperrten Safe
lcd.clear(); // LCD löschen
lcd.setCursor(1, 0); // Cursor setzen
lcd.print("Safe gesperrt!"); // Statusmeldung
String userCode = Eingabe_Code(); // Eingabe des Benutzer-Codes
if (userCode == aktueller_Code) { // Wenn der Code korrekt ist
falsche_Versuche = 0; // Fehlversuche zurücksetzen
Entsperrmeldung(); // Entsperrmeldung anzeigen
Entsperrvorgang(); // Safe entsperren
} else { // Wenn der Code falsch ist
falsche_Versuche++; // Fehlversuche erhöhen
lcd.clear(); // LCD löschen
lcd.setCursor(0, 0); // Cursor setzen
lcd.print("Falscher Code!"); // Fehlermeldung anzeigen
if (falsche_Versuche >= 3) { // Wenn 3 Fehlversuche erreicht sind
lcd.clear(); // LCD löschen
lcd.setCursor(1, 0); // Cursor setzen
lcd.print("5 sek gesperrt"); // Nachricht anzeigen
for (int i = 5; i > 0; i--) { // Countdown von 5 Sekunden
lcd.setCursor(7, 1); // Cursor für Countdown
lcd.print(i); // Countdown anzeigen
delay(1000); // 1 Sekunde warten
}
falsche_Versuche = 0; // Fehlversuche zurücksetzen
} else { // Wenn weniger als 3 Fehlversuche
lcd.setCursor(0, 1); // Cursor setzen
lcd.print("Erneut eingeben"); // Neue Eingabe fordern
delay(1000); // Kurze Pause
}
}
}
void setup() { // Setup-Funktion
Serial.begin(9600);
lcd.init(); // LCD initialisieren
lcd.backlight(); // Hintergrundbeleuchtung einschalten
pinMode(rote_LED, OUTPUT); // Rote LED als Ausgang
pinMode(gruene_LED, OUTPUT); // Grüne LED als Ausgang
pinMode(magnet, OUTPUT);
Startanzeige(); // Startanzeige zeigen
Erstellung_neuer_Code(); // Benutzer auffordern, einen neuen Code einzugeben
Sperrvorgang(); // Safe sperren
}
void loop() { // Hauptprogramm
if (gesperrt) { // Wenn gesperrt
safeLockedLogic(); // Gesperrte Logik ausführen
} else { // Wenn entsperrt
Auswahl_neu_alt(); // Entsperrte Logik ausführen
}
}