Blinken ohne Verzögerung
Teil des Abschnitts Timing ohne Delay der Arduino-Journey von Coddy. Lektion 3 von 18.
delay() hält das gesamte Sketch an. Während ein Blinkvorgang seine 500 ms wartet, läuft sonst nichts in loop(): Ein Tastendruck in dieser Zeit wird erst nach Ende der Wartezeit bemerkt.
Die Lösung ist, niemals zu warten. Lass loop() immer wieder sehr schnell laufen und vergleiche jedes Mal die Uhr mit dem Zeitpunkt, an dem die LED zuletzt gewechselt hat. Bis 500 ms vergangen sind, tue nichts. Ändere dann die LED und speichere den neuen Zeitpunkt:
const unsigned long interval = 500;
unsigned long previousMillis = 0; // als die LED zuletzt ihren Zustand änderte
void loop() {
unsigned long now = millis();
if (now - previousMillis >= interval) {
previousMillis = now; // merke dir diesen Zeitpunkt
// schalte die LED hier um
}
// alles andere hier wird tausendfach pro Sekunde ausgeführt
}now - previousMillis ist die Zeit seit dem letzten Wechsel. Um die LED umzuschalten, speichere ihren Zustand in einer Variablen, int redState = LOW;, wechsle ihn mit if/else und schreibe ihn mit digitalWrite(redLed, redState);.
Wenn du vergisst, previousMillis zu aktualisieren, bleibt die Bedingung nach den ersten 500 ms wahr, sodass die LED bei jeder Schleifeniteration wechselt und halb eingeschaltet aussieht.
Aufgabe
MittelDie gelbe LED sollte dem Knopf folgen, reagiert aber verzögert, weil die delay()-Aufrufe der roten LED die Schleife anhalten. Schreibe das Blinken der roten LED mit millis() um:
- Belasse den Teil mit dem Knopf unverändert
- Schalte die rote LED an Pin 13 alle 500 ms um
- Nirgendwo
delay()
Drücke Run, halte den Knopf gedrückt und beobachte beide LEDs, dann Check.
Probier es selbst
const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;
void setup() {
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// Die gelbe LED reagiert auf den Taster. Behalte diesen Teil bei.
if (digitalRead(buttonPin) == LOW) {
digitalWrite(yellowLed, HIGH);
} else {
digitalWrite(yellowLed, LOW);
}
// Die rote LED blinkt, aber jeder Aufruf von delay() hält die obigen Zeilen
// für eine halbe Sekunde an. Schreibe diesen Teil mit millis() neu.
digitalWrite(redLed, HIGH);
delay(500);
digitalWrite(redLed, LOW);
delay(500);
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Timing ohne Delay
Übe selbstständig: Arduino-Playground