Ich versuche, eine Funktion Feuer jede x Menge zu haben, ohne die Hauptschleife blockiert, ich habe einige Beispiel-Code gesehen, dies zu tun, siehe Code unten:Arduino - millis() - Wert immer Wert einer anderen Variablen
// Interval is how long we wait
// add const if this should never change
int interval=1000;
// Tracks the time since last event fired
unsigned long previousMillis=0;
void loop() {
// Get snapshot of time
unsigned long currentMillis = millis();
Serial.print("TIMING: ");
Serial.print(currentMillis);
Serial.print(" - ");
Serial.print(previousMillis);
Serial.print(" (");
Serial.print((unsigned long)(currentMillis - previousMillis));
Serial.print(") >= ");
Serial.println(interval);
if ((unsigned long)(currentMillis - previousMillis) >= interval) {
previousMillis = currentMillis;
}
}
Nun geschieht folgendes:
TIMING: 3076 - 2067 (1009) >= 1000
TIMING: 4080 - 3076 (1004) >= 1000
TIMING: 5084 - 4080 (1004) >= 1000
TIMING: 6087 - 5084 (1003) >= 1000
TIMING: 7091 - 6087 (1004) >= 1000
Warum ist die currentMillis immer so viel jede Schleife höher? Es sieht so aus, als ob es einen Zeiger oder ähnliches teilt, weil es jedes Mal den Intervallwert hinzufügt. Ich bin verwirrt!
Sie haben Recht, es gab viel mehr Code und auch ein Schlaf im Code, ich entfernte den Schlaf und jetzt ist das Problem gelöst! Ich verstehe immer noch nicht die Beziehung :) –
@OlafvanderKaa Wenn Sie für * Intervall * Millisekunden schlafen, dann ist die Schleife für diese Zeit eingefroren, und das nächste Mal, wenn Sie * Millis() * - die aktuelle Uhr zurückgibt time - Sie erhalten einen Wert, der höher als der * interval * -Schwelle ist. Was ist daran unklar? Oder ich habe deine Frage nicht verstanden? –
ah ja, ich verwirrte mich, wenn ich versuchte, es zur Arbeit zu bringen und tatsächlich mein Intervall auf weniger als den Schlaf gesenkt, jedenfalls Problem gelöst, danke für die Antwort! –