Simples Multitasking mit dem Arduino

Für viele Projekte ist es notwendig, dass verschiedene Komponenten (Messungen, Lampen, Motoren, etc.) parallel angesteuert werden können. Dafür muss eine nicht-blockierende Technik beim Programmieren des Sketches verwendet werden, d.h. Funktionsaufrufe wie delay() sind hierbei nicht zulässig, da der Mikroprozessor bei deren Verwendung blockiert wird, d.h. in dieser Zeit nichts anderes ausführen kann.

Video: Live-Demonstration

Funktionsweise

In diesem Experiment werden 4 LEDs parallel ein- und ausgeblendet, d.h. deren Steuerung läuft unabhängig voneinander ab.

Schaltplan
Abb.: Schaltplan

Verwendete Bauteile

Aufbau

Aufbau der Schaltung
Abb.: Aufbau der Schaltung

Sketch 1:

Lineares, paralleles Ein- und Ausblenden von einigen LEDs ohne Verwendung von delay().

struct LED {
    byte pin;
    int fadeDirection;
    byte fadeSpeed;
    long nextWakeup;
    byte ledValue;
};

// initial values of the connected LEDs (first column is the PIN
LED connectedLeds[] = {
    { 6, 1,  7, 0, 0},
    { 9, 1, 21, 0, 0},
    {10, 1, 13, 0, 0},
    {11, 1, 17, 0, 0},
};
byte numLeds = sizeof(connectedLeds)/sizeof(LED);

void setup()
{
}

void loop()
{
    for(byte i=0; i<numLeds; i++) {
        checkLed(&connectedLeds[i]);
    }
}

void checkLed(LED* led)
{
    if (millis() - led->nextWakeup > led->fadeSpeed) {
        led->nextWakeup = millis();
        led->ledValue += led->fadeDirection;
        if (led->ledValue <= 0 || led->ledValue >= 255) {
            led->fadeDirection *= -1;
        }
        analogWrite(led->pin, led->ledValue);
    }
}

Library PLed

Diese von mir geschriebene Library (Lizenz: GPL) erleichtert die Ansteuerung von mehreren LEDs parallel. In der README.md-Datei sind Installation und Verwendung beschrieben.

PLed-Libary [3,5kB]
zurück