Versuchen wir mal, es einfach zu machen
Mit jedem Tastendruck liefert readKey() ein Zeichen zurück und hat sich schon um Prellen und kurze/lange Tastendrücke gekümmert, oder liefert bei Abfrage den Wert KEY_NOT_PRESSED, wenn kein neuer Tastendruck da war. Das ist doch schon das Schwierigste.
Für mich das zweitschwierigste war:
#define KEY_star 'stern'
und tatsächlich, Kinder, wenn euch meine Erklärung verwirrt, oder es zu grausam ist, macht schnell die Augen zu
(ich hab meinen Arduino geopfert und es ausprobiert):
#define KEY_STAR 'stern' // kein Syntaxfehler, ist ja nur der Präprozessor
byte testkey = KEY_STAR; // kein Syntaxfehler
static char teststring[]= "---";
teststring[1] = testkey;
Serial.println(teststring); // erzeugt "-n-"
Genauso erzeugt
#define KEY_hash 'raute' im Endeffekt ein 'e'
Das ist jetzt wohl nur Tobias' Problem.
wie Arduinokiller einmal einen Stern als 42 kriegen kann ist mir klar. Merkwürdig ist mir, wie er aber aus "10" eine "4210" (statt z.B. "424948" , weil eine '1' hat den ASCII-wert 49 (0x31) genauso wie '' den Wert 42 hat.
Tobias kann natürlich die Library anpassen, da hatten wir schon 2 Varianten, eine zum einfach Rechnen, eine zum einfach Anzeigen.
Ab jetzt nehm ich mal an, wir bleiben beim Einfach Anzeigen und die Stern-Taste würde als '' im Display erscheinen, wenns ein 'n' ist wissen wir ja, warum. Rechnen (einen als Zahl agespeicherten CODE ermitteln und vergleichen) kann man mit '' genauso schlecht wie mit 'n'.
Ihr könnt die Augen wieder aufmachen
Ein Sclüsselcode bestht also nur aus Ziffern, die # und * Tasten sind was besonderes. Was, das kann man sich frei wählen.
Für's einfache Verständnis lassen wir so wie es jetzt ist: Schlüsselcode sind 4 Ziffern, nicht mehr und nicht weniger.
Wir wollen ausser einer Code-Eingabe auch in einen Funktions-Menü-Modus springen:
Nehmen wir doch dazu das * Zeichen.
Dann definieren wir noch das # Zeichen als Anfang einer Code Eingabe, das hilft auch, wenn man sich vertippt hat.
Bei variabel langen Schlüsseln brauchen wir noch ein Ende-Zeichen ( zB. den Stern ) aber lassen wir das erstmal.
#define EINGABE 0
#define MENU 1
byte mode = EINGABE; // Voreinstellung
byte stelle = 0;
unsigned int CODE = 9367;
unsigned int Eingabe = 0; // gleich als Zahl umgerechnet
void loop(){
char myKey = myOwnKeyPad.readKey(); // Abfragen des gedrückten Tasters
if (myKey != KEY_NOT_PRESSED){ // Abfragen ob irgendein Taster gedrückt ist
lcd.print(myKey); // Taste im LCD anzeigen
if ( mode == EINGABE)
switch (myKey) {
case KEY_STAR:
mode = MENU;
break;
case KEY_HASH:
delay(200); // damit man das # Zeichen noch kurz sieht
stelle = 0; // alles auf Anfang
Eingabe = 0;
lcd.clear(); // ...
break;
default: // alle anderen Tasten
Eingabe = Eingabe*10 + myKey-'0' ; // setzt voraus, dass diese
stelle++;
if ( stelle == 4) {
if (Eingabe == CODE) {
// usw. ( richtiger Code )
} else {
// falscher Code
}
}
break;
} // Ende switch
else { // Menu - Zweig
if ( myKey == ...
// wie kommen wir wieder zur Code - eingabe ???
}
}
}