smarthome-tricks.de

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 Millisekunden ü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 verdeutlicht:

// 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. Gerade beim Zusammenspiel von mehreren Komponenten ist die Nutzung von Delays so nicht machbar.

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. Im folgenden Beispiel zeige ich Dir, wie eine Wechselblinker-Schaltung mit 2 LEDs funktioniert.

// Pins definieren 
const int ledPin1 =  D7;
const int ledPin2 =  D8;
 
// Initialstates definieren
int ledState1 = LOW;
int ledState2 = HIGH;
 
// Timer-Variablen
long myTimer = 0;
long myTimeout = 100;
 
void setup() { 
  pinMode(ledPin1, OUTPUT); 
  pinMode(ledPin2, OUTPUT); 
} 
 
void loop() { 
 if (millis() > myTimeout + myTimer ) {
    myTimer = millis();
 
    if (ledState1 == LOW) {
      ledState1 = HIGH;
    } else {
      ledState1 = LOW;
    }
     
    if (ledState2 == LOW) {
      ledState2 = HIGH;
    } else {
      ledState2 = LOW;
    }    
 
    digitalWrite(ledPin1, ledState1);
    digitalWrite(ledPin2, ledState2);
  }  
}

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.

Die mobile Version verlassen