zum Code:
Also du könntest das über For-Loops lösen.
Ich habe wie angesprochen nur zwei Bahnen, keine Anfang-/Ende Markierungen.
Eine "Verlängerungs-LED" am Pixel 0, d.h. Die erste Bahnen beginnt bei 1-10
die zweite Bahn von 11 - 20, wobei die zweite Bahn von "hinten" - Pixel 11 bis "vorne" Pixel 20. Will mal also die zwei gegenüberliegende Pixel aufrufen, sind das für die erste Led 1 und 20.
Im loop habe ich einen klassischen "BlinkWithoutMillis" Zeitticker, der das Muster (Pattern) periodisch aufruft
if (!isBlackout && actualPattern > 0 && (unsigned long)(millis() - msTimerPattern) >= (msTimerPatternIntervall*patternIntervallFactor))
{
if (actualPattern == 1) {fadePixel();} //bei 5 Pattern ist ein if else um etwa 16 byte kleiner als ein switch case
else if (actualPattern == 2) {pattern2();}
else if (actualPattern == 3) {pattern3();}
else if (actualPattern == 4) {pattern4();}
else if (actualPattern == 5) {pattern5();}
else if (actualPattern == 6) {pattern6();}
else if (actualPattern == 7) {pattern7();}
msTimerPattern=millis();
}
Das Pattern ist nicht blockierend, und muss im richtigen Zeitabstand im loop aufgerufen werden.
die aktuelle Position steht in der counterPattern
Beispiel für ein Pattern links rot, rechts grün, jeweils zwei durchlaufende Pixel heller als die anderen.
void pattern3()
// Seefahrt: rot/grün mit einem schnell durchfahrenden Highpoint
// vom Haus nach draußen
// Zwei separate Schleifen
{
//Serial.println(F("D127 Pattern2 Seefahrt"));
const byte myPixels=10; //Length of pathway - 10 pixel links - 10 pixel rechts
const byte high = 255; //dimmer value for high pixel
const byte medium = 128; //dimmer value for medium pixel
const byte low = 42; //dimmer value for low dimmed pixel
counterPattern++;
if (counterPattern>myPixels) {counterPattern=0;}
for (int j = 1; j<=myPixels; j++)
{
if (counterPattern==j) r_channel[j]=high; else r_channel[j]=low;
g_channel[j]=0;
b_channel[j]=0;
//Serial.print (F("D135 ")); Serial.print (j); Serial.print (F("r: ")); Serial.println(r_channel[j]);
}
for (int j = myPixels*2; j>myPixels; j--)
{
r_channel[j]=0;
if (myPixels*2+1 - counterPattern==j) g_channel[j]=high; else g_channel[j]=low;
b_channel[j]=0;
//Serial.print (F("D143 ")); Serial.print (j); Serial.print (F("g: ")); Serial.println(g_channel[j]);
}
if(counterPattern%2) //Status LED 0 blink
{
r_channel[0]=high; g_channel[0]=0; b_channel[0]=0;
}
else
{
r_channel[0]=0; g_channel[0]=high; b_channel[0]=0;
}
updatePixel();
}
dazu eine Weboberfläche zum Aufrufen und Konfigurieren.
Der Code ist in mehreren Tabs organisiert, daher nur als externes Download.
http://werner.rothschopf.net/2018/esp8266_neopixel.zip
Bitte vor dem flashen einmal das ganze EEPROM löschen.