/*
Forum: https://forum.arduino.cc/t/eingegebene-daten-loschen/1159588/17
Wokwi: https://wokwi.com/projects/373526630482012161
Original: my_xy_projekt
Anpassung: ec2021
*/
#include <Keypad.h>
#include <Servo.h>
constexpr char oeffner[] {'1', '2', '3', 'A'};
constexpr uint8_t oeffnerSize {sizeof(oeffner)};
char buf[oeffnerSize] {};
uint8_t idx;
constexpr byte roteLedPin {12};
constexpr byte grueneLedPin {13};
constexpr byte col {4}; //4 Spalten
constexpr byte row {4}; //4 Zeilen
char hexaKeys[row][col] =
{
{'D', '#', '0', '*'},
{'C', '9', '8', '7'},
{'B', '6', '5', '4'},
{'A', '3', '2', '1'}
};
byte colPins[col] = {2, 3, 4, 5}; //Definition der Pins für die 3 Spalten
byte rowPins[row] = {6, 7, 8, 9}; //Definition der Pins für die 4 Zeilen
Keypad Tastenfeld = Keypad(makeKeymap(hexaKeys), rowPins, colPins, row, col); //Das Keypad kann absofort mit "Tastenfeld" angesprochen werden
Servo servoblau; //Servo wird ab jetzt mit „servoblau“ angesprochen
constexpr byte servoPin {11};
boolean safeIstGeschlossen = true;
void setup()
{
Serial.begin(115200);
pinMode(roteLedPin, OUTPUT); //Die LEDs werden als Ausgang festgelegt
pinMode(grueneLedPin, OUTPUT);
servoblau.attach(servoPin); //Der Servo ist an Pin 11 angeschlossen
clearAll(); // Setzt die Eingaben zurück und fordert zur Code-Eingabe auf
}
void loop()
{
char inChar = Tastenfeld.getKey();
{
if (inChar)
{
Serial.print(F("Taste: "));
Serial.print(inChar);
Serial.println(F(" gedrückt!"));
}
switch (inChar)
{
case '*':
Serial.println(F("Tuer verriegelt"));
servoblau.write(90); //Servo zum verriegeln auf 90 Grad ansteuern.
digitalWrite(roteLedPin, HIGH); //..die rote LED einschalten
digitalWrite(grueneLedPin, LOW); //..die grüne LED einschalten
safeIstGeschlossen = true;
clearAll();
break;
case '#':
if (memcmp(oeffner, buf, oeffnerSize) == 0)
{
Serial.println(F("Code korrekt, Schloss offen"));
servoblau.write(0); //Servo zum öffnen auf 0 Grad ansteuern.
digitalWrite(roteLedPin, LOW); //..die rote LED nicht leuchten..
digitalWrite(grueneLedPin, HIGH); //..die grüne LED leuchten..
safeIstGeschlossen = false;
}
else // ist das nicht der Fall, bleibt das Schloss gesperrt
{
Serial.println(F("Code falsch, Schloss gesperrt, Warten!"));
digitalWrite(roteLedPin, HIGH); // Die rote LED leuchtet
digitalWrite(grueneLedPin, LOW); // Die grüne LED ist aus
delay(3000);
}
clearAll();
break;
case '0' ... '9':
case 'A' ...'D':
if (idx < oeffnerSize)
{
buf[idx] = inChar;
idx++;
}
else
{
Serial.println(F("Zu viele Codezeichen"));
clearAll();
}
break;
}
}
}
void clearAll()
{
memset(buf, '\0', oeffnerSize);
idx = 0;
if (safeIstGeschlossen){
Serial.print(F("Bitte "));
Serial.print(oeffnerSize);
Serial.println(F("-stelligen Code eingeben:"));
Serial.println(F("(# zum Oeffnen * zum Schliessen/Loeschen fehlerhafter Eingaben)"));
}
}