Arduino millis anstatt von delay

So praktisch die delay Funktion auch ist, hat sie auch einen Nachteil. Wenn sie benutzt wird, wird der Arduino für die angegebene Zeit blockiert. Es ist also nicht möglich in der Zeit einen anderen Befehl auszuführen. Wenn Du allerdings zwei Prozesse “gleichzeitig” ausführen möchtest, kannst Du die delay Funktion nicht verwenden.

Allerdings kannst Du durch die Verwendung der millis Funktion mit mehreren Prozessen eine bestimmte Zeit warten.
millis() gibt dabei die Millisekunden zurück, die seit dem Start des Arduino-boards vergangen sind. Die Funktion ermöglicht also eine Zeitmessung. millis() gibt dabei ein unsigned long zurück. Dieser hat einen Wertebereich zwischen 0 und 4,294,967,295 (2^32 – 1). Somit kann in diesem eine Zeitspanne von ca. 50 Tagen gespeichert werden, bevor der Wert überläuft und wieder auf 0 zurück gesetzt wird.

Bei der Verwendung der millis Funktion musst Du also damit rechnen, dass der Wert wieder auf 0 zurück gesetzt wird. Nach diese “Zurücksetzung” zählt das Arduinoboard allerdings ganz normal die Millisekunden weiter.

Allgemeines Beispiel

Dieses Beispiel zeigt das Grundkonzept welches benutzt werden kann, um zwei Funktionen “gleichzeitig” auszuführen. Dabei wird die function1 in jedem loop Durchgang ausgeführt, während die function2 nur einmal die Sekunde (1000 Millisekunden) ausgeführt wird.

unsigned long previousMillis = 0; 
const long interval = 1000; 

void loop() {
 // function1
 unsigned long currentMillis = millis(); 
  if (currentMillis - previousMillis >= interval) { 
    previousMillis = currentMillis; 
    // function2
  }
}Code-Sprache: Arduino (arduino)

Immer wenn die jetzige Anzahl an Millisekunden (currentMillis), minus der Anzahl der Millisekunden der letzten Durchführung (previousMillis), größer als das gewählte Intervall ist wird function2 ausgeführt. Zudem wird bei einer Ausführung von function2 immer previousMillis auf currentMillis gesetzt, damit die Differenz wieder auf 0 gesetzt wird.

Blink mit millis statt delay

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}
const int ledPin = LED_BUILTIN;
 
void setup(){
  pinMode(ledPin, OUTPUT);
}
 
void loop(){
  digitalWrite(LED_BUILTIN,HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN,LOW);
  delay(1000);
}Code-Sprache: Arduino (arduino)

Dies ist das bekannte Blink Beispiel aus der Arduino-IDE. Die delay-Funktion wird dafür verwendet eine Sekunde (1000 ms) zu warten, bevor die nächste Aktion mit der LED ausgeführt wird.

unsigned long previousMillis = 0;
const long interval = 1000;
 
void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
}
 
void loop(){
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }
}Code-Sprache: Arduino (arduino)

In diesem Beispiel wird gezeigt, wie Du die millis Funktion anstatt der delay Funktion nutzen kannst, um den zeitlichen Abstand zu berechnen.

Zwei Funktionen gleichzeitig

Die obigen Beispiele zeigen immer nur Programme, die eine Sache gleichzeig machen. Doch die größte Stärke der millis-Funktion ist, Funktionen “gleichzeitig” laufen zu lassen.

unsigned long previousMillisLED = 0;
unsigned long previousMillisPrint = 0;
const long intervalLed = 1000;
const long intervalPrint = 800;
 
void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
}
 
void loop(){
  unsigned long currentMillisPrint = millis();
  if (currentMillisPrint - previousMillisPrint >= intervalPrint){
    previousMillisPrint = currentMillisPrint; 
    Serial.println("Hallo Welt");
  }

  unsigned long currentMillisLED = millis();
  if (currentMillisLED - previousMillisLED >= intervalLED){
    previousMillisLED = currentMillisLED;
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }
}Code-Sprache: Arduino (arduino)

In diesem Beispiel werden zwei verschiedene Funktionen mit unterschiedlichen Zeitabständen ausgeführt. Beide können aufgerufen werden, ohne das die andere Funktion dadurch blockiert wird.

So ist es auch möglich, dass die eine Funktion die andere kontrollieren kann. Ein Beispiel wäre ein Not-Aus-Schalter, mit dem eine zeitgesteuerte Maschine ausgeschaltet werden kann. Mit der delay-Funktion wäre es nicht möglich, da diese während der Wartezeit den Arduino blockiert, wodurch keine neue Interaktion mit dem Arduino möglich ist.