Also ich habe eine Folientastatur, wenn ich dort eine dreistellige Zahl eingebe und dann Bestätige soll etwas passieren.
Aber wenn ich nun eine Falsche Eingabe gemacht habe, dann möchte ich durch die Tasteneingabe “B” jederzeit zurück in den Beginn der Eingabe kommen.
Aber ich weiß nicht wie ich das mache, ich wollte das mit dem default-teil machen das funktioniert aber nicht.
vielleicht könnt ihr mir ja helfen, anbei ist der Programmcode aktuell.
#include <LiquidCrystal.h>
#include <AnalogMatrixKeypad.h>
#define analogPin 0
AnalogMatrixKeypad AnMatrixKeypad(analogPin);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int relaisPin = 6;
byte digit =0;
int number = 0;
void setup() {
pinMode(relaisPin, OUTPUT);
digitalWrite(relaisPin, LOW);
lcd.begin(16, 2);
lcd.print("Anzahl Pruef?");
Serial.begin(9600);
}
void loop() {
char Key = AnMatrixKeypad.readKey();
if(Key != KEY_NOT_PRESSED){
Serial.println(Key);
switch (digit){
case 0: // erste Ziffer (1er-Stelle) wird eingelesen
number = (Key - 48)*100; // char wird umgerechnet in int (nach ASCII-Tabelle)*100
lcd.setCursor(0,1);
lcd.print(number);
digit++;
break;
case 1: // 2. Ziffer (10-er Stelle) wird eingelesen.
number = number + (Key - 48)*10; // Taste mit 10 multiplizieren und zu number addieren
lcd.setCursor(0,1);
lcd.print(number);
digit++;
break;
case 2: // 3. Stelle (100er) wird eingelesen
number = number + (Key - 48)*1; // mit 1 multiplizieren und addieren
lcd.setCursor(0,1);
lcd.print(number);
lcd.setCursor(0,0);
lcd.print("Anzahl Richtig?");
digit++;
break;
case 3: // "4.Stelle" muss 'A' sein zum Abschluss
if (Key == KEY_A){
Serial.print("Eingegebene Zahl: ");
Serial.println(number);
lcd.setCursor(0,0);
lcd.print("Bestaetigt");
lcd.setCursor(0,1);
lcd.print(number);
digit = 0;
}
break;
default:
Serial.println(" Eingabefehler ");
digit = 0;
number = 0;
break;
} // end switch
} // end if KEYPRESSED
} // end loop
Überlege dir doch erst mal, welche Tasten du überhaupt bedienen willst, was bei welcher Taste passieren soll.
So wie ich das sehe, bisher 3 Aktionen:
0…9 Zifferneingabe
A Return
B Ziffer löschen
vielleicht noch ein ‘#’ für Abbruch?
Du könntest auch hier mit switch case arbeiten.
switch (Key){
case ‘A’: Ziffer speichern und weiter
case ‘B’: eine Stelle zurück
case ‘#’: alles verwerfen und zurück.
default: if 0…9: Ziffer lesen. (das kann auch wieder eine neue Switch Case sein)
}
ich habe das mal vereinfacht mit Serial-input anstelle deines Tastenfeldes dargestellt, da ich kein Tastenfeld habe. So kann das System auch 1 und 2 Stellige Zahlen verarbeiten.
void setup() {
Serial.begin(115200);
}
int digit = 0; // Zähler für die Stelle der Zahl
int number[3]; // Array für die eingegebenen Ziffern
int figure; // Endergebnis
void loop() {
// get any incoming bytes:
if (Serial.available() > 0) {
char Key = Serial.read();
switch (Key){
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
// eine Ziffer wurde gedrückt
number[digit] = Key - 48; // Ziffern als int speichern
if (digit++ > 2) digit = 2; // Begrenzung auf 3 Ziffern
break;
case 'B': // B für eine Stelle Löschen
digit--;
break;
case 'A': // Ziffer berechen
figure = 0;
for (int i = digit-1; i >=0;i--){
figure = figure + number[i] * int(pow(10,digit-i-1)+0.1);
}
for (int i = 0; i<3; i++) number[i]=0;
digit = 0;
Serial.print("Ergebnis: ");
Serial.println(figure);
} // end switch (Key)
} // end Serial.available
}// end loop