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.
In diesem Experiment werden 4 LEDs parallel ein- und ausgeblendet, d.h. deren Steuerung läuft unabhängig voneinander ab.
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);
}
}
Diese von mir geschriebene Library (Lizenz: GPL) erleichtert die Ansteuerung von mehreren LEDs parallel.
In der README.md
-Datei sind Installation und Verwendung beschrieben.