Weitere Abbruchbedingung

Hallo Leute eine Frage zu dem sketch

#include <LiquidCrystal.h>
#include <AnalogMatrixKeypad.h>
#include "DHT.h"
 
#define DHTPIN 13     
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22
#define analogPin 0

AnalogMatrixKeypad AnMatrixKeypad(analogPin);

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int relaisPin = 6;
byte digit =0;
int number = 0;
int tauchen = 10;
int trocknen = 10;
int fertig = 0;
DHT dht(DHTPIN, DHTTYPE);

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.clear();
        lcd.setCursor (0,0);
        lcd.print ("Anzahl Pruef?");
        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.clear();
          lcd.setCursor(0,0);
          lcd.print ("Bestaetigt");
          lcd.setCursor(0,1);
          lcd.print(number);
          while (number > 0){
            lcd.clear();
            while (tauchen>0){
              
              digitalWrite(relaisPin, HIGH);
              lcd.clear();
              float h = dht.readHumidity();     //Luftfeuchte auslesen
              float t = dht.readTemperature();  //Temperatur auslesen
              lcd.setCursor(0,0);
              lcd.print ("Temp.");
              lcd.setCursor(7,0);
              lcd.print (t);
              lcd.setCursor(0,1);
              lcd.print ("Luftfeuchte");
              lcd.setCursor(12,1);
              lcd.print (h);
              delay (5000);
              tauchen--;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print ("Noch Pruefungen");
              lcd.setCursor(0,1);
              lcd.print(number);
              delay (5000);
              tauchen--;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print ("Fertige Pruefungen");
              lcd.setCursor(0,1);
              lcd.print(fertig);
              delay (5000);
              tauchen--;
            }
            while (trocknen >0) {
              
              digitalWrite(relaisPin, LOW);
              lcd.clear();
              float h = dht.readHumidity();     //Luftfeuchte auslesen
              float t = dht.readTemperature();  //Temperatur auslesen
              lcd.setCursor(0,0);
              lcd.print ("Temp.");
              lcd.setCursor(7,0);
              lcd.print (t);
              lcd.setCursor(0,1);
              lcd.print ("Luftfeuchte");
              lcd.setCursor(12,1);
              lcd.print (h);
              delay (5000);
              trocknen--;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print ("Noch Pruefungen");
              lcd.setCursor(0,1);
              lcd.print(number);
              delay (5000);
              trocknen--;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print ("Fertige Pruefungen");
              lcd.setCursor(0,1);
              lcd.print(fertig);
              delay (5000);
              trocknen--;
            }
            fertig++;
            tauchen = 10;
            trocknen = 10;
            number--;
          }
            }
            digit = 0;
            number = 0;
            tauchen = 10;
            trocknen = 10;
            fertig = 0; 
            Key=KEY_NOT_PRESSED;
            lcd.clear();
            lcd.setCursor (0,0);
            lcd.print ("Anzahl Pruef?");
     break;
      default:
        Serial.println(" Eingabefehler ");
        digit = 0;
        number = 0;
      break;
     } // end switch
      if(Key == KEY_B){
        digit=0;
        number=0;
        Key=KEY_NOT_PRESSED;
        lcd.clear();
        lcd.setCursor (0,0);
        lcd.print ("Anzahl Pruef?");
      }
  } // end if KEYPRESSED
} // end loop

Im case 3, gehe ich 3 while schleifen durch, wie kann ich denn in den while schleifen eine weitere Abbruch bedingung machen, ich versuchte es mit einer if-anweisung also
if(Key==KEY_B){…} aber das hat nicht funktioniert

hab ihr einen tipp?

hi,

wie im anderen thread geschrieben:

setze das if KEY_B VOR das switch und das switch in ein else von dem if KEY_B.

wenn KEY_B willst Du doch garnicht in die switch, oder hat sich das geändert?

gruß stefan

ja das hab ich doch probiert, aber funktioniert nicht

    Serial.println(Key); 
  
          if(Key == KEY_B){
        digit=0;
        number=0;
        Key=KEY_NOT_PRESSED;
        lcd.clear();
        lcd.setCursor (0,0);
        lcd.print ("Anzahl Pruef?");
                digitalWrite(7, LOW);
                digitalWrite(8, LOW);
                digitalWrite(9, HIGH);}
      else{
      switch (digit){
      case 0:  // erste Ziffer (1er-Stelle) wird eingelesen
        number = (Key - 48)*100;    // char wird umgerechnet in int (nach ASCII-Tabelle)*100
        lcd.clear();
        lcd.setCursor (0,0);
        lcd.print ("Anzahl Pruef?");
        lcd.setCursor(0,1);
        lcd.print(number);
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
        digitalWrite(9, HIGH);
        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.clear();
          lcd.setCursor(0,0);
          lcd.print ("Bestaetigt");
          lcd.setCursor(0,1);
          lcd.print(number);
          while (number > 0){
            lcd.clear();
            while (tauchen>0){
                      digitalWrite(7, HIGH);
                      digitalWrite(8, LOW);
                      digitalWrite(9, LOW);
              digitalWrite(relaisPin, HIGH);
              lcd.clear();
              float h = dht.readHumidity();     //Luftfeuchte auslesen
              float t = dht.readTemperature();  //Temperatur auslesen
              lcd.setCursor(0,0);
              lcd.print ("Temp.");
              lcd.setCursor(7,0);
              lcd.print (t);
              lcd.setCursor(0,1);
              lcd.print ("Luftfeuchte");
              lcd.setCursor(12,1);
              lcd.print (h);
              delay (5000);
              tauchen--;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print ("Noch Pruefungen");
              lcd.setCursor(0,1);
              lcd.print(number);
              delay (5000);
              tauchen--;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print ("Fertige Pruefungen");
              lcd.setCursor(0,1);
              lcd.print(fertig);
              delay (5000);
              tauchen--;
            }
            while (trocknen >0) {
                      digitalWrite(7, LOW);
                      digitalWrite(8, HIGH);
                      digitalWrite(9, LOW);
              digitalWrite(relaisPin, LOW);
              lcd.clear();
              float h = dht.readHumidity();     //Luftfeuchte auslesen
              float t = dht.readTemperature();  //Temperatur auslesen
              lcd.setCursor(0,0);
              lcd.print ("Temp.");
              lcd.setCursor(7,0);
              lcd.print (t);
              lcd.setCursor(0,1);
              lcd.print ("Luftfeuchte");
              lcd.setCursor(12,1);
              lcd.print (h);
              delay (5000);
              trocknen--;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print ("Noch Pruefungen");
              lcd.setCursor(0,1);
              lcd.print(number);
              delay (5000);
              trocknen--;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print ("Fertige Pruefungen");
              lcd.setCursor(0,1);
              lcd.print(fertig);
              delay (5000);
              trocknen--;
            }
            fertig++;
            tauchen = 10;
            trocknen = 10;
            number--;
          }
            }
            digit = 0;
            number = 0;
            tauchen = 10;
            trocknen = 10;
            fertig = 0; 
            Key=KEY_NOT_PRESSED;
            lcd.clear();
            lcd.setCursor (0,0);
            lcd.print ("Anzahl Pruef?");
                    digitalWrite(7, LOW);
                    digitalWrite(8, LOW);
                    digitalWrite(9, HIGH);
     break;
      default:
        Serial.println(" Eingabefehler ");
        digit = 0;
        number = 0;
      break;}
     } // end switch
      if(Key == KEY_B){
        digit=0;
        number=0;
        Key=KEY_NOT_PRESSED;
        lcd.clear();
        lcd.setCursor (0,0);
        lcd.print ("Anzahl Pruef?");
                digitalWrite(7, LOW);
                digitalWrite(8, LOW);
                digitalWrite(9, HIGH);
      }
  } // end if KEYPRESSED
} // end loop

Auch wenn es eine höchst verwerfliche Sache ist und übel nach "Spaghetti-Code" riecht... aber man könnte einen zusätzlichen Abbruch mit einem "GOTO" realisieren. Das widerspricht zwar jeder sauberen und strukturierten Programmierhandschrift - aber in der Not kann man sich damit behelfen, bevor man alles noch einmal total von neuem beginnt... Das ist aber auch nur ein (fauler!) Kompromiss und für die Zukunft sollte man sich VOR der Programmierung ein paar Gedanken über die grundsätzliche Struktur machen!

Doch Butter bei die Fische:

Bau doch INNERHALB des "Case 3:" dann VOR DEM BREAK ein "Label" ein, auf dass du dann bei "totalem Abbruch innerhalb der Whiles" hinverzweigst. Damit kannst du den betreffende Zweig sofort komplett abbrechen und beim Rest des Programmes weiter machen. So im Sinne von:

byte    verzweigung;
byte    bedingung1;
byte    bedingung2;
byte    bedingung3;
byte    oberes;
boolean abbruch;

void setup()
{
}

void loop()
{
  switch( verzweigung )
  {
    case 0 : // mache irgendwas
             break;
             
    case 1 : // mache was anderes
             break;
             
    case 2 : // kompliziertes
             while( oberes )
             {
               while( bedingung1 )
               { // mache was und dann...
                 abbruch = true;
                 goto ABBRECHEN;
               }
               while( bedingung2 )
               { /* falls kein "Total-Abbruch" dann weiter */  }
               while( bedingung3 )
               { /* falls kein "Total-Abbruch" dann weiter */  }
             }
             ABBRECHEN:
             break;
             
    default: // alles übrige
             break;
  }
// Weiter im Programm
}

Steinigt mich für diesen Vorschlag...
Sauberer wäre es vielleicht mit betreffenden logischen Zuweisungen in Sinne von

total_abbruch = true
...
if( total_abbruch ) { exit }

RudiDL5:
Steinigt mich für diesen Vorschlag...

Gute Idee.

:slight_smile: :slight_smile: :slight_smile:

Warum funktioniert es denn nicht, einfach in der while-schleife

if (Key == Key_B){
tauchen =0;
trocknen = 0;
number = 0;
}

Es stört nicht, wenn man 15 sek wartet, bis der Abbruch erfolgt,
aber hierbei ist das Problem, die Folientastatur nimmt nichts mehr an, also es leuchtet die LED am Arduino nicht

Was in loop() auch einfach geht: return machen. Und schon fängt die Funktion von vorne an.

aber er liest ja keine taste mehr ein

hi,

bei solchen dingen baut man am besten ein paar Serial.print("POS_XX") ein, dann weiß man, wann er wohin geht.

gruß stefan

Muck93:
aber er liest ja keine taste mehr ein

Vermutlich ließt "er" keine Taste ein, weil du "ihm" das nicht genügend klar gemacht hast, was "er" tun soll.

Ich halte Schleifen für bedenklich.
Die blockieren den Programmablauf, bis zum Abbruch.
Manchmal ist es gewünscht, und manchmal passiert das falsche, so wie hier.

loop() wird doch schon in einer Schleife aufgerufen!
Warum reicht dir das nicht?

Was soll das Ganz überhaupt werden?

ist eine Steuerung für einen Pneumatikzylinder

habs jetzt gelöst mit einem notaus taster :smiley: