WS2812B Landebahn

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.