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.
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++).
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
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
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);
}
}
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.