ws2812 larson von Bis als Funktion

Guten Tag
Ich bin nicht der Hellste in sachen logic
ich würde gerne diesen "KnightRider effekt " mit 5 Led 1ste Hell 255 dann dunkler roduzieren
von LED 126 bis 167 un zurück
vileicht mit int speed als zeit 100-speed als FastLED delay
kann mir da jemand helfen ?

void larsonScanner(int startled, byte ledcount, byte hue, byte sat,speed)
{
  //static unsigned long previousMillis=millis();
  static int i; // Schrittzaehler
  static int led=0;
  static boolean reverse=false;
  byte dim;

  if(i > 32)
  {
    i = 0;
    
    if (reverse) led--;
    else led++;

    // Anfang erreicht
    if (led<0 ){
      led=0;
      reverse=!reverse;
    }
    
    // Ende erreicht
    if (led>=ledcount){
      led=ledcount-1;
      reverse=!reverse;
    }
  }

    //previousMillis=millis();
    memset(LED,0,ledcount*3); // LED Array zuruecksetzen
    dim = i*4;
    i++;
    
    // Aktuelle Led-2
    if (led-2>=0 && !reverse) LED[led-2] = CHSV(hue,sat,128-dim); // FadeDown
    else if (led-2>=0 && reverse) LED[led-2] = CHSV(hue,sat,dim); // FadeUp

    // Aktuelle Led-1
    if (led-1>=0 && !reverse) LED[led-1] = CHSV(hue,sat,255-dim); // FadeDown
    else if (led-1>=0 && reverse) LED[led-1] = CHSV(hue,sat,127+dim); // FadeUp

    // Aktuelle Led
    LED[led] = CHSV(hue,sat,255);

    // Aktuelle Led+1
    if (led+1<ledcount && !reverse) LED[led+1] = CHSV(hue,sat,127+dim); // FadeUp
    else if (led+1<ledcount && reverse) LED[led+1] = CHSV(hue,sat,255-dim); // FadeDown

    // Aktuelle Led+2
    if (led+2<ledcount && !reverse) LED[led+2] = CHSV(hue,sat,dim); // FadeUp
    else if (led+2<ledcount && reverse) LED[led+2] = CHSV(hue,sat,128-dim); // FadeDown
    
    FastLED.show(); 

    FastLED.delay(100-speed);
}

Hi

Ich habe nun nur rudimentär heraus gefunden, wie die Lichtfolge wohl aussah (obwohl ich den Kram durchaus einige Male gesehen haben müsste ... Turbo-Boost :wink: )

Grundlegendes:
Die Variablen sollten nur so groß sein, wie Du Diese benötigst.
Bei <256 LEDs wäre meine Wahl BYTE (0...255), KEINE negativen Zahlen - haben ja auch keine negativen LED ...

Mein Ansatz wäre, daß ich quasi ZWEI Wander-Punkte hätte

  • Nummer 1 bringt die LED auf MAX
  • Nummer 2 (läuft Nummer 1 hinterher) bringt die LED auf Null
    Damit kann ich die Länge des Nachleuchten (vorerst halt alle leuchtenden LED voll an) bestimmen.
    Nun würde ich von der 'Nummer 2' schrittweise zur 'Nummer 1' gehen und den LEDs eine Helligkeit entsprechend dem Abstand zu 'Nummer 1' geben.
    Das funktioniert auch, wenn die LED am Ende die Richtung wechselt - hier werden den LEDs teilweise zwei Helligkeiten zugewiesen - da wir aber von Dunkel nach Hell setzen, überschreiben wir mit dem hellen Wert den Dunklen.

Wenn alle nötigen LEDs gesetzt sind, ein .show() und ab in die Wartezeit, bis der nächste Pixel gesetzt werden soll.

Verständlich?

MfG

so in eine richtung gehts zumindestens schon

void larsonScanner(int startled,int duration, byte hue, byte sat,byte duspeed)
{
  
  int i = startled; // Schrittzaehler
  int maxled = startled+duration;
  static int led=0;
  static boolean reverse=false;
  byte dim;
  for (int led = startled;led<=maxled;led++){
    //clear leds
    for (int led = startled;led<=maxled;led++){
    LED[led]= CRGB::Black;}
    // Aktuelle Led-2
    if (led-2>=startled && !reverse) LED[led-2] = CHSV(hue,sat,128-dim); // FadeDown
    else if (led-2>=startled && reverse) LED[led-2] = CHSV(hue,sat,dim); // FadeUp

    // Aktuelle Led-1
    if (led-1>=startled && !reverse) LED[led-1] = CHSV(hue,sat,255-dim); // FadeDown
    else if (led-1>=startled && reverse) LED[led-1] = CHSV(hue,sat,127+dim); // FadeUp

    // Aktuelle Led
    LED[led] = CHSV(hue,sat,255);

    // Aktuelle Led+1
    if (led+1<maxled && !reverse) LED[led+1] = CHSV(hue,sat,127+dim); // FadeUp
    else if (led+1<maxled && reverse) LED[led+1] = CHSV(hue,sat,255-dim); // FadeDown

    // Aktuelle Led+2
    if (led+2<maxled && !reverse) LED[led+2] = CHSV(hue,sat,dim); // FadeUp
    else if (led+2<maxled && reverse) LED[led+2] = CHSV(hue,sat,128-dim); // FadeDown
    
    FastLED.show(); 
    FastLED.delay(100-duspeed);
    dim = i*4;
    i++;
  }    
}