Multitasking

Bisher haben wir die delay-Methode verwendet, um Pausen zwischen verschiedenen Aktionen einzufügen, wie z.B. beim Blinken einer LED. Möchte man zwei LEDs in unterschiedlichen Intervallen und völlig unabhängig voneinander blinken lassen ist dies nur schwer mit einem delay vorstellbar. Die Lösung, um Multitasking mit Hilfe des Arduinos umzusetzen ist deshalb denkbar einfach:

Höre auf, delay() zu verwenden!

Hier siehst Du noch einmal das bisherige Programm, welches die delay-Methode verwendet, um die LED blinken zu lassen.

const int ledPin = 2;   
 
//setup() wird einmal nach Start/Reset aufgerufen
void setup() {
//Initialisiere den PIN als OUTPUT Pin
pinMode(ledPin, OUTPUT);
}
 
//loop() wird immer und immer wieder aufgerufen - hier arbeiten wir für gewöhnlich
void loop() {
digitalWrite(ledPin, HIGH); //schaltet LED ein; HIGH schaltet die Spannung an
delay(500); 
digitalWrite(ledPin, LOW); //schaltet LED aus; LOW schaltet die Spannung an
delay(500); 
}

Wir nutzen fortan die millis()-Methode, um die Anzahl der Millisekunden seit Starten des Arduino-Boards zu erhalten. Des Weiteren speichern wir in einer Variable bei welcher Anzahl von Millisekunden das letzte Update beim LED-Status gemacht wurde. Ist die Differenz zwischen beiden Angaben größer als das Intervall, in der die LED blinken soll, so muss der Status umgeschaltet werden.

const int ledPin = 2; 

int ledStatus = LOW;    //speichert ob die LED ein- oder ausgeschaltet ist      
long letztesUpdate = 0; //speichert, wann das letzte mal umgeschaltet wurde
long intervall = 250;   //speichert in welchem Abstand umgeschaltet werden soll       
 
void setup() {
  pinMode(ledPin, OUTPUT);
}
 
void loop() {
  //Anzahl der Millisekunden seit Start auslesen...
  unsigned long aktuelleMillis = millis();
 
  //...und mit dem Zeitpunkt des letzten Updates vergleichen...
  if(aktuelleMillis - letztesUpdate > intervall) {
    //LED-Status wird sich gleich ändern, also protokollieren wir dies schon mal!
    letztesUpdate = aktuelleMillis;
 
    //LED-Status ändern
    if (ledStatus == LOW)
      ledStatus = HIGH;
    else
      ledStatus = LOW;
 
    //LED-Status tatsächlich setzen
    digitalWrite(ledPin, ledStatus);
  }
}

Dieses Vorgehen kann man nun leicht auf zwei verschiedene Prozesse erweitern – hier das Blinken zweier LEDs (A&B) in verschiedenen Intervallen.

const int ledPinA = 2; 
const int ledPinB = 4; 
 
int ledStatusA = LOW;    //speichert ob die LED A ein- oder ausgeschaltet ist      
int ledStatusB = LOW;    //speichert ob die LED B ein- oder ausgeschaltet ist      
long letztesUpdateA = 0; //speichert, wann das letzte mal umgeschaltet wurde
long letztesUpdateB = 0; //speichert, wann das letzte mal umgeschaltet wurde
long intervallA = 250;   //speichert in welchem Abstand umgeschaltet werden soll       
long intervallB = 333;   //speichert in welchem Abstand umgeschaltet werden soll       
 
void setup() {
  pinMode(ledPinA, OUTPUT);
  pinMode(ledPinB, OUTPUT);
}
 
void loop() {
  //Anzahl der Millisekunden seit Start auslesen...
  unsigned long aktuelleMillis = millis();
 
  //...und mit dem Zeitpunkt des letzten Updates vergleichen...
  if(aktuelleMillis - letztesUpdateA > intervallA) {
    //LED-Status wird sich gleich ändern, also protokollieren wir dies schon mal!
    letztesUpdateA = aktuelleMillis;
 
    //LED-Status ändern
    if (ledStatusA == LOW)
      ledStatusA = HIGH;
    else
      ledStatusA = LOW;
 
    //LED-Status tatsächlich setzen
    digitalWrite(ledPinA, ledStatusA);
  }

  if(aktuelleMillis - letztesUpdateB > intervallB) {
    //LED-Status wird sich gleich ändern, also protokollieren wir dies schon mal!
    letztesUpdateB = aktuelleMillis;
 
    //LED-Status ändern
    if (ledStatusB == LOW)
      ledStatusB = HIGH;
    else
      ledStatusB = LOW;
 
    //LED-Status tatsächlich setzen
    digitalWrite(ledPinB, ledStatusB);
  }
}