Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

Blinken ohne "delay()"

Benötigt:

  • Arduino
  • Falls nicht die LED L an Pin 13 verwendet wird, braucht es eine Standard-LED beliebiger Farbe und den entsprechenden Vorwiderstand.

Manchmal muss man während man eine LED blinken lässt (oder andere Dinge bei denen man eine bestimmte Zeit warten muss) zur gleichen Zeit etwas anderes tun (wie einen Taster abfragen). In diesem Fall kann "delay()" nicht verwendet werden, da es das gesamte Programm anhalten würde. Dieses Beispiel zeigt wie man eine LED ohne "delay()" blinken lassen kann. Das Programm "merkt" sich wann es die LED das letzte Mal ein- oder ausgeschaltet hat. Jedes mal wenn "loop()" durchläuft kontrolliert es ob eine bestimmte Zeit vergangen ist, wenn dies der Fall ist wird die LED umgeschaltet. Es wird die Funktion millis() verwendet, welche direkt beim Starten des AVR anfängt in Millisekunden hochzuzaehlen. Diese Zahl faengt nach ca. 49,6 Tagen wieder von Null an zu zählen. Dieser Überlauf wird bei richtiger Kontrolle der vergangenen Zeit abgefangen und führt zu keiner falschen Wartezeit. Die Schaltung ist die gleiche wie bei "Hallo Welt!".

Code:

  1. /* Blinken ohne "delay()"
  2.  *
  3.  * Schaltet eine LED, welche an einem digitalen Pin liegt ein- und aus
  4.  * ohne die "delay()" Funktion zu verwenden. Das heisst anderer Code
  5.  * kann zur gleichen Zeit ausgeführt werden ohne blockiert zu werden.
  6.  *
  7.  * https://playground.arduino.cc/Learning/BlinkWithoutDelay_de
  8.  */
  9.  
  10. byte ledPin = 13;                  // LED liegt am (digitalen) Pin 13
  11. boolean value = LOW;                  // Startwert der LED
  12. unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
  13. unsigned long interval = 1000;    // Interval zwischen zwei Änderungen
  14.  
  15. void setup()
  16. {
  17.   pinMode(ledPin, OUTPUT);      // Setzt den ledPin (Pin 13) als Ausgang
  18. }
  19.  
  20. void loop()
  21. {
  22.   // Code der immer laufen soll kommt hier hin.
  23.  
  24.  /* es wird kontrolliert, ob die Zeit für das Blink-Intervall schon abgelaufen ist
  25.   * Wenn die Zeitdifferenz zwischen dem Letzten Abspeichern und der aktuellen Zeit größer
  26.   * als das Intervall ist, so wird die nachfolgende Funktion ausgeführt.
  27.   */
  28.   if (millis() - previousMillis > interval) {
  29.     previousMillis = millis();   // aktuelle Zeit abspeichern
  30.  
  31.     // LED Zustand wecheln.
  32.     value = !value;
  33.  
  34.     // Wert auf den Ausgang schreiben
  35.     digitalWrite(ledPin, value);
  36.   }
  37. }