Problem mit while Schleife

Moin,
ich habe ein Problem mit dieser while Schleife

while(Minuten > 0 && Sekunden > 0) 
      {
        Serial.print(Minuten);
        Serial.print(":");
        Serial.println(Sekunden); 
        currentTime = millis();
        if(currentTime >= (loopTime + 1000))  
          {  
          loopTime = currentTime;  // Updates loopTime
          
          Sekunden--;
          //Wenn Sec 0 dann Min -1, Sec wieder auf 59
          if (Sekunden == 0) 
          {
            Minuten--;
            Sekunden = 59;
          } 
          
          //wenn Minuten einstellig dann einen 0 vorweg ausgeben
           format( 11,0, Minuten, 2, 0);
           format( 14,0, Sekunden, 2, 0);   
        }
        Serial.print(Minuten);
        Serial.print(":");
        Serial.println(Sekunden); 
      }

Wenn Minuten z.B. 1 ist und Sekunden 5 dann zählt die while Schleife runter bis 0:59 und beendet die Schleife.
Ich hatte schon die Vermutung das er in einem zwischen schritt Min und Sec auf 0 sind aber mit Hilfe von
Serial.print konnte ich dies nicht bestätigten.

Gruß Ingo

Was genau macht die format( ) Anweisung?
Wo sind die Variablen definiert und vorbelegt?

hi,

ich versteh Dein problem logisch nicht. wenn minuten 0 ist, soll er doch aufhören, oder?
und bei 0:59 ist minuten halt auf 0. außerdem löst Du Dein problem mit sekunden auch falsch. wieso ist 0 plötzlich 59? da kriegst Du einen fehler rein...

gruß stefan

ok, man soll nicht alles aus programmierersicht sehen. Du willst ja wohl, daß er bis 00:00 weiterläuft. ein
while (Minuten > 0 && Sekunden > 0)
läuft, solange BEIDE größer 0 sind (bei 02:00 oder 00:59 springst Du aus der schleife), ein ODER würde bewirken, daß die schleife läuft, bis beide 0 sind.
wenn sekunden 0 sind, mußt Du auf 60 setzen, aber erst, nachdem du die uhrzeit ausgegeben hast, Du wilst ja kein 4:60 statt 5:00.

gruß stefan

@erni
die format Funktion gibt die Zeit auf dem Display aus und sorgt für die Position auf dem Display und die davor stehenden 0'en
Der code ist nur ein Ausschnitt aus einer Void funktion die ich mit einem Tastendurck an meinem LCD shield von dfrobot aufrufe.
Die Variablen deklariere ich außerhalb dieser Funktion.

@Eisebaer,

Du hast recht er soll aufhören wenn der Minutenzähler auf 0 ist, aber erst wen der Sekunden Zähler AUCH auf 0 ist
und beim herunter zählen von 1:05 bleibt er halt Stehen
1:05
...
1:01
1:00
0:59
Und wenn er mir anzeigt 0:59 ist die Bedingung in der while Schleife in meinen Augen noch false und dürfte
sich doch nicht beenden?

Gruß Ingo

while (Minuten > 0 && Sekunden > 0)

heißt, daß BEIDE größer als 0 sein müssen. wenn EINE der beiden 0 ist, springst Du raus...

5 32
true AND true = true

0 32
false AND true = false

gruß stefan

Hallo Stefan;

jetzt hab ich es mal umgeschrieben

while(Minuten > 0 || Sekunden > 0) 
      {
        Serial.print(Minuten);
        Serial.print(":");
        Serial.println(Sekunden); 
        currentTime = millis();
        if(currentTime >= (loopTime + 1000))  
          {  
          loopTime = currentTime;  // Updates loopTime
          
          Sekunden--;
          //Wenn Sec 0 dann Min -1, Sec wieder auf 59
          //wenn Minuten einstellig dann einen 0 vorweg ausgeben
           format( 11,0, Minuten, 2, 0);
           format( 14,0, Sekunden, 2, 0);   
  
          if (Sekunden == 0) 
          {
            Minuten--;
            Sekunden = 60;
          } 
          

        }
        Serial.print(Minuten);
        Serial.print(":");
        Serial.println(Sekunden); 
      }

jetzt zählt er zwar runter bis 00:00 und springt dann auf 56:00

also ich kenne AND Verknüpfung so

0&0=0
1&0=0
0&1=0
1&1=1

Gruß Ingo

hi, scoth,

bei einer while-schleife bleibt er in der schleife, solange die bedingung wahr ist. ich sage bedingung, nicht bedingungen. mit der UND-verknüpfung machst Du aus den zwei bedingen eine. bei einer und-verknüpfung müssen beide einzelbedingungen wahr sein, damit im gesamten auch wahr rauskommt. und bei 0:59 ist minuten > 0 nicht wahr.

gruß stefan

sorry, vergessen:

das mit den 56:00 versteh ich auch nicht. kommt das sicher nicht aus den code nach der schleife?

gruß stefan

ist Sekunden nicht immer > 0 beim Schleifenanfang?

sagen wir mal, als Beispiel.
Minuten: 0
Sekunden: 1

Meinen Kommentar habe ich jeweils im Code dazgeschrieben

Wir beginnen am Anfang der Schleife, da die Bedingung der Schleife noch wahr ist (Sekunden > 0)

while(Minuten > 0 || Sekunden > 0) 
 {
  currentTime = millis();
  if(currentTime >= (loopTime + 1000))  
  {  
    loopTime = currentTime;  
          
    Sekunden--; // Sekunden ist nun 0
    format( 11,0, Minuten, 2, 0); //Ausgabe von 00
    format( 14,0, Sekunden, 2, 0);   //Ausgabe von 00
    if (Sekunden == 0) // Diese Bedingung ist wahr
    {
      Minuten--; // Minuten ist nun eventuell -1, ist aber vom gewählten Datentyp abhängig, könnte z.B. auch 255 sein
      Sekunden = 60; // Sekunden ist 60
    } 
  }
}

ok, wir habe die Ausgabe mit 00:00, aber die Bedingung der Schleife wird nochmals geprüft

while(Minuten > 0 || Sekunden > 0) // Bedingung ist wahr, da Sekunden = 60
 {
  currentTime = millis();
  if(currentTime >= (loopTime + 1000))  
  {  
    loopTime = currentTime; 
          
    Sekunden--; // Sekunden ist nun 59
    format( 11,0, Minuten, 2, 0); //Ausgabe von ?, keine Ahnung, da die Funktion format nicht bekannt ist und der Datentyp von Minuten ebenfalls unbekannt ist
    format( 14,0, Sekunden, 2, 0); // 59  
    if (Sekunden == 0) // Diese Bedingung ist nicht wahr
    {
      Minuten--; 
      Sekunden = 60; 
    } 
  }
}

Und das geht so weiter, ohne Ende
Ein vielleicht etwas einfacherer Ansatz wäre, wenn du die Zeit in Sekunden hinterlegst und nur für die Ausgabe in Sekunden und Minuten formatierst.

hi, thewkind,

stimmt, da bin ich in die falle gelaufen. zum zeitpunkt der prüfung ist sek immer ungleich 0.

Ein vielleicht etwas einfacherer Ansatz wäre, wenn du die Zeit in Sekunden hinterlegst

natürlich, aber der code war halt schon so da.

gruß stefan

So ich hab es jetzt etwas anders gelöst.
Die Countdown hab ich jetzt in eine eigene Routine ausgelagert.

void countdown()
{
  currentTime = millis();
  if(currentTime >= (loopTime + 1000))  
  {  
    Serial.println("test");
    loopTime = currentTime;  // Updates loopTime
    Sekunden--;
    format( 11,0, Minuten, 2, 0);
    format( 14,0, Sekunden, 2, 0);  
    //Wenn Sec 0 dann Min -1, Sec wieder auf 59
    if (Sekunden == 0) 
    {
      Minuten--;
      Sekunden = 60;
    } 
  }
  if(Minuten >= 0 && Sekunden >= 0) 
  {
    countdown();
  }
}

Jetzt rufe ich die Countdown Funktion nur aus dem anderen Bereich auf und sobald 0:00 erreicht wird,
geht es an der Vorherigen Stelle weiter.

Gruß Ingo
PS noch mal vielen Dank für Eure Hilfe

hi,
vorsicht mit rekursiven funktionen, also funktionen, die sich selbst aufrufen.
die funktion, die ein duplikat seiner selbst bildet, bleibt erhalten, also im speicher, ebenso seine lokalen variablen. ich hab' jetzt nicht die erfahrung mit dem arduino, aber irgendwann ist schluß.

gruß stefan