Delay() vs. millis() – Warum ich lieber millis() einsetze

In diesem Artikel erkläre ich Dir die Unterschiede der delay() und millis() Funktion.  In Deinem ersten Arduino Programm hast Du bestimmt auch genauso wie ich eine oder zwei LEDs blinken lassen. Dabei wurde das Intervall der Blinkgeschwindigkeit bestimmt über die delay() Funktion gesteuert. Für einfache Programme und Anwendungsfälle ist die Funktion sehr praktisch und einfach zu verwenden. Für größere Projekte würde ich sie Dir nicht empfehlen. Warum? Das erfährst Du jetzt im Artikel.

Die Funktionsweise der delay() Funktion ist relativ einfach. Der Funktion wird die Zahl der Mikrosekunden übergeben. Wenn wir also der Funktion 1000 übergeben, wird das Programm eine Sekunde verzögert. Im folgenden Code-Beispiel wird die Verwendung der delay() Funktion verdeuticht:

// Pins definieren
const int ledPin = LED_BUILTIN;

void setup()
{
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  digitalWrite(ledPin,HIGH);
  delay(1000);
  digitalWrite(ledPin,LOW);
  delay(1000);
}

In der Loop-Funktion wird zunächst der ledPin auf HIGH gesetzt. Im Anschluss wird das gesamte Programm angehalten und dann wieder der ledPin auf LOW gesetzt. Über die delay() Funktion wird also die Blink-Frequenz gesteuert. Dabei wird das gesamte Programm angehalten, und somit auch andere Funktionalitäten geblockt. Wenn nun also mehrere Funktionen parallel ausgeführt werden sollen, haben wir hier ein Problem.

Aus diesem Grund würde ich für komplexere Aufgaben die millis() Funktion einsetzen. Die Funktion gibt die Anzahl Millisekunden zurück, die seit dem ersten Start des Programms vergangen sind.

const int ledPin = LED_BUILTIN;
int ledState = LOW;
unsigned long previousMillis = 0;
const long interval = 1000;

void setup()
{
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;

    if (ledState == LOW)
    {
      ledState = HIGH;
    }
    else
    {
      ledState = LOW;
    }

    digitalWrite(ledPin, ledState);
  }
}

Zugegeben, auf der ersten Blick doch komplexer als das Beispiel über die delay() Funktion, aber eigentlich einfach und mittels dieser Vorgehensweise flexibler für Erweiterungen. Ich setze die millis() Funktion für größere Projekte bereits ein.

 

Matthias Korte

Hauptberuflich Software-Entwickler und seit einigen Jahren Smart-Home Fan. Angefangen hat alles mit einem RaspberryMatic und einer schaltbaren Steckdose. Mittlerweile habe ich einige Steckdosen, Sensoren, und Thermostate sowie ioBroker zur Visualisierung im Einsatz.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Die Checkbox für die Zustimmung zur Speicherung ist nach DSGVO zwingend.

Ich akzeptiere