switch Anweisung

Hallo Leute habe ein Problem.

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

hi,

VOR dem switch hast du ha schon den key. einfach vor dem switch prüfen, ob er B ist, und wenn ja, digit und number auf 0 setzen.

gruß stefan

Dein denkfehler ist: Du prüfst im switch ja nicht auf die eingabe, sondern auf die stelle, also warum sollte er bei B in default springen?

#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);
  
  if(Key == KEY_B){
    digit=0;
    number=0;
  } 
  
    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

Jetzt hab ich eine if überprüfung davor gesetzt, aber wenn ich die Taste B drücke, wird mir angezeigt auf dem Display 1800

hi,

stell die ganze switch-sache in ein else nach dem if. wenn KEY_B soll er ja nicht mehr in die switch.

gruß stefan

Ü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

Super, danke für die schnelle Hilfe, seit echt Klasse hier im Forum :slight_smile: