WS2812B Lauflicht mit mehreren leds

Hallo zusammen, ich habe mir ein Arduino und eine WS2812B Kette gekauft und auch soweit alles verbunden das die Beispiele die Arduino mit sich bringt laufen.

Ich brauche einen Sketch wo ein Lauflicht von rechts nach links läuft und immer 4-5 leds an sind.

so das ich sage mal led 0-4 an sind, dann 5 an geht und 0 wieder aus und das bis zum schluss.

vielleicht kann mir ja einer von euch helfen, da ich langsam verzweifel wie ich das am besten machen sollt.

MFG Jan.B

Ohne zu wissen was die WS2812B Bibliothek von sich aus mitbringt, würde ein programmtechnischer Ansatz wie folgt sein

Zwei for Schleifen, die erste Schleife durchläuft die Anzahl der LEDs und in der 2ten, inneren Schleife, würdest Du
die LEDs setzen.

Im Prinzip soetwas

Für i von 0 bis ANZAHL_ALLER_LEDS
Für j von 0 bis ANZAHL_DER_GLEICHZEITIG_LEUCHTENDEN
Wenn i+j < ANZAHL_ALLER_LEDS
LED(i+j).anschalten
Pause damit dies auch visuell sichtbar ist.

Gruß
Claudia

hi,

Du mußt garnicht überprüfen, ob Du über die anzahl der LEDs hinauskommst. das läuft bei den 2812 einfach ins leere.

nachteil der methode: das lauflich läuft am ende schön "heraus", aber am anfang nicht schön "herein", weil da ja immer gleich die ersten fünf angehen. da gibt's aber natürlich lösungen. dazu müßte man wissen, ob der teil, der hinten rausläuft, gleichzeitig vorne wieder reinlaufen soll. also wenn hinten nur noch 2 leuchten, dann auch vorne die restlichen zwei wieder an sein sollen. schön im kreis also.

und sollen die leds einfachalle auf hell sein oder nur die mittige der fünf voll an und nach hinten und vorne der schlange gedimmt werden soll.

gruß stefan

Hi Stefan,

nachteil der methode: das lauflich läuft am ende schön "heraus", aber am anfang nicht schön "herein"

da hast Du natürlich Recht, auch fehlt das ausschalten in der Logik, ggf. nach der Pause oder vor der inneren Schleife, aber ich denke das Jan noch mit Infos kommt was genau getan werden soll. ;-)

Gruß Claudia

JanB: ... die Beispiele die Arduino mit sich bringt laufen.

Welche Programmbibliothek verwendest Du?

NeoPixel-KnightRider

Also am besten wäre es wenn es vom Anfang led 1-5 nacheinander an geht und wenn die 5. Led an ist dann erst anfängt die hinteren leds wieder auszuschalten.

ich benutze Arduino 1.6.13 mit Adafruit_NeoPixel bibliothek

Ich habe das jetzt so gelöst, das problem ist das er am ende mit meiner Technik die nicht die perfekteste ist alle 4 Leds gleichzeitig aus macht und nicht nacheinander.

#include <Adafruit_NeoPixel.h>

#include <Adafruit_NeoPixel.h>
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
int t;

void setup() {
strip.begin();
strip.show(); // Initialize all pixels to ‘off’
}

void loop() {
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color( 255, 0, 0));
t = i - 4;

if (t < 0) {
t = strip.numPixels() - 4;
strip.setPixelColor(t, strip.Color( 0, 0, 0));
t = strip.numPixels() - 3;
strip.setPixelColor(t, strip.Color( 0, 0, 0));
t = strip.numPixels() - 2;
strip.setPixelColor(t, strip.Color( 0, 0, 0));
t = strip.numPixels() - 1;
strip.setPixelColor(t, strip.Color( 0, 0, 0));
};

strip.setPixelColor(t, strip.Color( 0, 0, 0));
strip.show();
delay(30);
}
}

JanB: Also am besten wäre es wenn es vom Anfang led 1-5 nacheinander an geht und wenn die 5. Led an ist dann erst anfängt die hinteren leds wieder auszuschalten.

ich benutze Arduino 1.6.13 mit Adafruit_NeoPixel bibliothek

Von der Beschreibung her klingt es, als wenn Du einen "Larson Scanner" Effekt programmieren möchtest.

Benannt ist dieser Effekt nach https://en.wikipedia.org/wiki/Glen_A._Larson, einem Hollywood-Drebuchschreiber, - -Filmproduzenten, -Stuntman und -Filmeffekterfinder.

Der Effekt wurde zuerst eingesetzt im SciFi-Spielfilm "Kampfstern Galactica"(q978) und danach in der Fernsehserie "Knight Rider"(1982-1986) wiederverwendet. Daher auch unter dem Namen "KnightRider-Effekt" bekannt.

Im Prinzip handelt es sich um ein ständiges Hoch- und Runterdimmen von LEDs.

In der Mitte des Effekts befindet sich die hellste LED, diese hellste LED verschiebt sich ständig von links nach rechts und danach wieder zurüdk nach links.

Unmittelbar rechts und links neben der hellsten LED ist eine etwas dunklere LED.

Und zwei LEDs links und zwei LEDs rechts der hellsten LED ist eine deutlich dunklere LED, aber in derselben Farbe. Also je größer der Abstand zur hellsten LED, desto dunkler.

Der Effekt wird geadezu hypnotisch, wenn Du den Ablauf sehr flüssig hinbekommst, ohne Helligkeitssprünge, sondern mit fließenden Übergängen zwischen den Phasen.Der Effekt kann eine Laufbreite von 3, 5 oder 7 LEDs haben.

Bis vor ca. 5 Jahren gab es in diesem Forum regelmäßigFragen dazu, wie man den KnightRider-Effekt programmiert, aber nachdem die Serie schon vor über 30 Jahren abgesetzt wurde, werden die Fragen bezüglich des Larson-Scanner Effekts immer seltener.

Genau so etwas hab ich kürzlich programmiert, dabei die FastLED-Library verwendet. Hier der entsprechende Teilcode (der ganze Code ist noch nicht fertig, und auch viel umfangreicher):

reset_LEDS();                                                   //LED-Array resetten
      if(dir){                                                        //wenn nach rechts
        pos++;                                                        //Position weiterruecken
        for(int i=lgth+1; i>0; i--){                                  //Helligkeitswerte und Positionen fuer Schweif berechnen
          int bTemp=bVal*i/(lgth+1);
          int gTemp=gVal*i/(lgth+1);
          int rTemp=rVal*i/(lgth+1);
          int posTmp=pos-(lgth+1)+i;
          if(posTmp>=0 && posTmp<NUM_LEDS){                           //wenn berechneter Wert innerhalb LED-Array
            leds[posTmp].setRGB( bTemp, gTemp, rTemp);                //Rot und Blau vertauscht!
          }
        }
        if(pos>=(NUM_LEDS-1+lgth)){                                   //wenn Ende erreicht
          pos=NUM_LEDS-1;                                             //Position setzen
          dir=false;                                                  //Richtung umkehren
        }
      }else if(!dir){                                                 //wenn nach links
        pos--;                                                        //Position weiterruecken
        for(int i=lgth+1; i>0; i--){                                  //Helligkeitswerte und Positionen fuer Schweif berechnen
          int bTemp=bVal*i/(lgth+1);
          int gTemp=gVal*i/(lgth+1);
          int rTemp=rVal*i/(lgth+1);
          int posTmp=pos-i+lgth+1;
          if(posTmp>=0 && posTmp<NUM_LEDS){                           //wenn berechneter Wert innerhalb LED-Array
            leds[posTmp].setRGB( bTemp, gTemp, rTemp);                //Rot und Blau vertauscht!
          }
        }
        if(pos<=(0-lgth)){                                            //wenn Anfang erreicht
          pos=0;                                                      //Position setzen
          dir=true;                                                   //Richtung umkehren
        }
      }
      FastLED.show();

Erklärung der Variablen:
bool dir: Richtungsflag
int bVal, gVal, rVal: RGB-Helligkeitswerte, welche dargestellt werden sollen
int lgth: Länge des “Schweifs”
CRGB leds: LED-Array

DerLehmi: Genau so etwas hab ich kürzlich programmiert, dabei die FastLED-Library verwendet. Hier der entsprechende Teilcode (der ganze Code ist noch nicht fertig, und auch viel umfangreicher):

Vor knapp vier Jahren habe ich hier auch mal einen Larson-Scanner Code gepostet: https://forum.arduino.cc/index.php?topic=198987.msg1482702#msg1482702

Die damals verwendete Library hat heute wohl einen geringfügig anderen Namen.

Aber der Effekt läuft ohne delay auf beliebig langen LED-Steifen (ich selbst hatte damals nur mit einem 10-LED-Streifen getestet.

Nachteil des Codes: Er läuft nicht 100% smooth mit Fading der LEDs, sondern die LEDs springen mit Taktrate von 80 Millisekunden (Bildrate :12 Bilder pro Sekunde). Fand ich damals beim Ansehen aber gar nicht mal so schlecht wie sich das anhört.