Arduino: Wie kann ich eine While-Schleife 10 Sek. laufen lassen?

3 Antworten

Von Experte whgoffline bestätigt

Ach. Kein Problem.

unsigned long time = millis();

while((millis() - time) <10000) {
}

Die Schleife läuft, solange, wie die Differenz kleiner als 10.000 ist, nämlich dann, sind noch keine 10 Sekunden vergangen.

1s = 1000ms

Dies ist die 0815 Lösung.

Man könnte es mit einem Interrupt lösen, wäre eleganter, zumindest würde ich dies, ganz subjektiv gesehen, eleganter werten.


LeonL8 
Beitragsersteller
 19.02.2021, 18:06

Vielen Dank, Simon!

Simon221585  19.02.2021, 18:10
@LeonL8

Die Lösung ist nicht unbedingt die Beste, das habe ich schön erwähnt.

Wenn du jetzt möchtest, dass die Whileschleife für 25 Tage laufen soll, dann funktioniert dieser Ansatz so nicht mehr, weil bei nem Arduino kommt es bei time zu einer gewissen Zeit zu einem Overflow, heißt die Zeitzählung beginnt von vorne.

Den genauen ,,Tageswert" habe ich nicht im Kopf, 25 wurde von mir nur als Beispiel gewählt. Näheres dazu gibt es auf der Arduino Seite. Ist für dich zwar nicht relevant, nur dass du bescheid weißt.

LeonL8 
Beitragsersteller
 19.02.2021, 18:13

Ich habe noch eine Frage: Kann ich diese while-Schleife auch mehrmals in einem Sketch verwenden? Muss ich vor allen while-Schleifen
unsigned long time = millis ();
schreiben oder reicht das einmal?

Simon221585  19.02.2021, 18:15
@LeonL8

Sagen wir, du machst das drei mal hintereinander, aus irgendeinem Grund, dann wäre eine Möglichkeit, die Zeit dementsprechend zu erhöhen.

ODER

unsigned long time = millis ();

Jaein. Wenn du es in der selben Funktion / selbem Scope nochmal machst, einfach nochmal die Whileschleife unten reinkopierst, dann musst du natürlich die Zeit neuzuweisen. Da time schon existiert, kannst du nicht nochmal

unsigned long time = millis ();

schreiben, weil dann, kriegst du einen Fehler, da es im aktuellen scope schon deklariert ist.

In diesem Fall machst du dann einfach:

time = millis();

über deine nächste Whileschleife, die auch nur eine gewisse Zeit laufen soll.

Jede ,,Zeitschleife" braucht hier natürlich die aktuelle Zeit vor Beginn, sonst kommt Quatsch bei rum.

unsigned long StartTime = millis();

while true{
  unsigned long CurrentTime = millis();
  unsigned long ElapsedTime = CurrentTime - StartTime;
  if(ElapsedTime >= 10000){
    break;
  }
}
Woher ich das weiß:Studium / Ausbildung – Informatikstudent

LeonL8 
Beitragsersteller
 19.02.2021, 18:07

Vielen Dank, whgoffline!

Simon221585  19.02.2021, 18:06

Sieht für mich ganz schön komplex aus und eine break; Anweisung ist hier eigentlich nicht nötig. Man kann die Bedienung direkt in den Schleifenkopf schreiben.

whgoffline  19.02.2021, 18:07
@Simon221585

Ich wollte es etwas übersichtlicher/verständlicher machen. Deshalb auch die Variablen.

Du Fragst beim eintritt in die Schleife die Systemzeit der Umgebung ab und bei jedem Durchlauf den Offset. Ist dieser 10 Sekunden verlässt Du die Schleife.