Abbruch von verschachtelten Schleifen mit break?, how to

Hallo,

ich habe eine for-Schleife in einer while-Schleife verschatelt.
Hintergrund ist, dass die for Schleife einen Countdown runterzählt und dieser visualisiert wird.
Funktioniert soweit auch. Jedoch möchte ich jetzt eine Abbruch Funktion einbringen (Über einen Taster tasterstatus2)

if (state == 1){                        // start unten + kühlzeit
    myTimer2 = millis();
    myTimeout2 = ((Dauer) * 100L);
    while(millis() < myTimeout2 + myTimer2 && tasterstatus2 != HIGH){

  digitalWrite(in1, LOW); //STOP
  digitalWrite(in2, LOW); //STOP
  digitalWrite(in3, HIGH); //dreht
  digitalWrite(in4, LOW); //dreht
  state = 2;

       if (tasterstatus2 == HIGH){    
        break;
       // i=0;
        }
                                                         i=Dauer;    
                                                              for (i; i>0; i--){
                                                                Serial.println(i);
       
                                                                delay(1000);
                                                                display.clearDisplay();
                                                                display.setTextColor(WHITE);
                                                                display.setTextSize(2);
                                                                display.setCursor(1,0);
                                                                display.println(i);
                                                                display.display();
                                                            }
  
}  
}

Habe hier schon verschiedenste Szenarien ausprobiert.
Wie ich es als Laie sehe, kommt der Status des Tasters während dem Ablauf der for-Schleife gar nicht durch…
[Ardunio Uno Board, muss ich hier speziellen Eingang nutzen?]

Hat hier jemand einen Tipp, oder wäre das ein Fall für goto? oder ähnliches.

Viele Grüße,
Bernd

 if (tasterstatus2 == HIGH){

Wo liest Du den Tasterstatus aus? Du fragst den Tasterstatus auch in der For Schleife nicht ab, also kann es zu keiner Abbruchbedingung kommen. P.S. Delay ist in diesen Zusammenhang nicht gut. Schau Dir die Nachtwächtererklärung an.

naja du müsstest halt auch in deiner For regelmäßig den Taster abfragen und dann mittels break ausbrechen.

Oder dein ganzes Konzept überdenken und while und for auflösen und in einer State Machine denken. Ist langfristig besser.

Ich sehe das wie die Anderen. Guck Dir das Modell eines „endlichen Automaten“ an.

Zudem ist Dein Code ja mal extrem hässlich formatiert und unvollständig. Wenn ich

} 
}

sehe, bekomme ich Pickel.

Gruß

Gregor

Hi, danke für das erste Feedback. Sorry für das Design, bin natürlich auch Laie der sich über jeden Fortschritt freut.

Habe nochmal etwas nagepasst, leider immernoch ohne erfolg.

if (state == 1){         // start unten + kühlzeit
    myTimer2 = millis();
    myTimeout2 = ((Dauer) * 100L);
//myTimeout2 = Dauer; 
    while(millis() < myTimeout2 + myTimer2 && tasterstatus2 != HIGH){

  digitalWrite(in1, LOW); //STOP
  digitalWrite(in2, LOW); //STOP
  digitalWrite(in3, HIGH); //dreht
  digitalWrite(in4, LOW); //dreht
  state = 2;


       if (tasterstatus2 == HIGH){    
        break;
       // i=0;
        }
                                                           
  

                                                              i=Dauer;  
                                                              for (i; i>0 && tasterstatus2 != HIGH; i--){
                                                                  myTimer3 = millis();  
                                                                  while(millis() < myTimeout3 + myTimer3){
                                                                  Serial.println(i);
                                                          
       if (tasterstatus2 == HIGH){    
        break;
        i=0;
        }                                                      
                                                           
                                                                display.clearDisplay();
                                                                display.setTextColor(WHITE);
                                                                display.setTextSize(2);
                                                                display.setCursor(1,0);
                                                                display.println(i);
                                                                display.display();                      
                                                             }
                                                            }

while(millis() < myTimeout2 + myTimer2

Weiterhin falsch.

Leider ist dein Programm nicht testbar.

Wie wäre es mit: Das Problem auf ein testbares Minimum reduzieren und dann hier zeigen.

rock5_1: Sorry für das Design, bin natürlich auch Laie der sich über jeden Fortschritt freut.

Nunja, als Einsteiger, der „im Stoff steckt“, überblickt man natürlich die Struktur und (hoffentlich) die Arbeitsweise seines Programms. Für jemanden, der das zum ersten Mal sieht, ist das nicht so. Nech :-)

Die Sachen, die ich beim Programmieren beachte, habe ich vor gut einem Jahr mal hier ins Netz gekippt.

Gruß

Gregor