for-Schleife def. Zeitraum loopen lassen ohne "delay"

Hallo,

steh grad echt auf dem Schlauch.

Ich würde gerne eine for-Schleife sich einen bestimmten Zeitraum loopen lassen, ohne "delay" verwenden zu müssen.

Ließe sich das u.U. über eine Schleife in der Schleife realisieren und falls ja, wie?

Stichworte sollten reichen. :wink:

Gruß Chris

Die Abbruch-Bedingung für eine for-Schleife ist das Überschreiten des Abbruchwertes. Man kann den - in Abhängigkeit von Irgendwas - auch ständig erhöhen, so dass er nicht erreicht wird ... aber sauberes Programmieren geht anders.
Dafür sind eigentlich while-Schleifen gedacht. Was hast du genau vor? So eine "Warte"-Schleife blockiert sämtliche anderen Reaktionen und trotzdem braucht der Prozessor voll Strom ... das geht ganz bestimmt eleganter.

Hallo,

ich suche eine Möglichkeit eine Schleife eine bestimmte Dauer loopen zu lassen, während ein Zähler die Anzahl der Durchläufe festhält. Aufgrund des Zählers entschied ich mich für die for-Schleife, stehe nun aber wie gesagt vor dem Zeitproblem.

Im Kopf meiner for-Schleife steht bereits aufgrund der von mir gewollten Unendlichkeit etwas in dieser Art: (i=1;i>0;i++).

Gruß Chris

Wenn es unbedingt eine For Schleife sein soll, dann würde ich den Vergleich aber gleich weglassen, also

for(int i=0; ; ++i)

Üblicher wäre aber

int i=0;
while (true) {
  ++i
}

Hallo Chris,
ich würde es so machen:

wenn du in die Schleife läufst Startzeit merken:

start = millis();
i = 0;
while (millis() - start < x ) {    //x ist dein Wert in Millisekunden wie lange die Schleife laufen soll
i++;
}

Serialprintln(i);   // gibt aus wie oft die Schleife durchlaufen wurde

Gruß

Bernward

Ich würde es auch wie maverick1509 machen; nur mit if.

start = millis();
i = 0;
if (millis() - start < x ) {    //x ist dein Wert in Millisekunden wie lange die Schleife laufen soll
i++;
}
Serialprintln(i);   // gibt aus wie oft die Schleife durchlaufen wurde

Aber es ist wirklich Ansichtssache ob Du if oder while verwendest.
Grüße Uwe

Hammerforum.

Thema erledigt. :slight_smile:

Vielen Dank Euch!

Gruß Chris

Immer wieder gerne :wink: dafür gibts das Forum.

For the record:
Mit break; kann man aus While und For-Schleifen "ausbrechen"

und immernoch für die Cronik:
mit continue kann man:
den Rest des Codes überspringen und den nächsten Durchlauf der Schleife erzwingen.
Grüße Uwe

Hallo,

kann es sein, dass Ihr (maverick1509 und uwefed) ">" anstatt von "<" gemeint habt und kann es sein, dass Ihr Beide innerhalb des Loops "schleifenzeit = millis();" vergessen habt?

Gruß Chris

Edit: Und gleich noch eine Frage zum Thema Schleifen: Wenn eine Schleife nur einmal pro Sekunde durchlaufen wird, ist es dann so, dass sämtliche in der Schleife enthaltenen Abfragen auch nur einmal pro Sekunde abgefragt werden?

Ist es also so, dass folgendes Beispiel keinen Sinn machen würde und würde man dies ehr mit einer weiteren if-Schleife außerhalb der ersten if-Schleife lösen?

if (millis() - schleifenzeit > 1000)                                                // Schleifendurchlaufszeit
  {
      schleifenzeit = millis();                                                     // Erfassung der aktuellen Schleifenzeit
      schleifenzaehler++;                                                           // Erhöhung des Schleifenzählers um "1"
      
      if (millis() - schleifenzeit > 500)
        {
        digitalWrite(LED_A,HIGH);
        }
  }
  1. würde in der theorie die zweite Bedingung immer zu treffen weil schon eine Sekunde vergangen ist!
  2. ist dies aber nicht der fall weil du vor der zweiten if schon schleifenzeit neu setzt.

Gleube ich!

Hallo Chris,
warum > und warum was vergessen?
Wenn ich in die Schleife laufe merke ich mir eine bestimmte Zeit (start).
millis() wird automatisch immer größer (interner Zähler).
Also bleibe ich in der Schleife bis millis() minus der startzeit größer als meine Vorgabe (x) wird,
also solange wie die Differenz < als mein Wert ist bleibe ich in der Schleife.
Ich sehe keinen Fehler, oder?

edit: ich glaube du machst einen Denkfehler, deine Bedingung darf eigentlich nie wahr werden, da du bei jedem Durchlauf, der sicherlich kürzer als eine Sekunde ist, schleifenzeit neu setzt.
Somit dürfte (millis() - schleifenzeit > 1000) nie wahr werden.

Gruß
Bernward