Zwei Lauflichter in einem WS2812-Stripe ab der Mitte

Hallo,

ich beschäftige mich erst seit kurzem mit den Neopixels und Arduino. Daher sind meine Programmierkenntnisse eher mau, aber ich gebe mir Mühe. Den Code ich aus dem Internet und wollte ihn für meine Bedürfnisse abändern.
Im Moment scheitere ich an folgendem Projekt
ich habe einen 5m Neopixel WS2812-Stripe an einem D1-mini mit ESP8266.
Bei dem Stripe soll ab der mitte zwei Lauflichter loslaufen, aber der mitte, der eine nach rechts, der andere nach links.
Ich bekomme es aber nicht hin. Ein Lauflicht ab der mitte klappt, aber bei zwei bin ich am scheitern.

Hier ist mein Code, vielleicht findet jemand den Fehler, oder kann mir sagen wie ich es am besten umsetzen kann:

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#define LED_PIN    D5
#define LED_COUNT 300

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
 #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
 clock_prescale_set(clock_div_1);
#endif

 strip.begin();           
 strip.show();            
 strip.setBrightness(50);

 

}

void loop() {
 colorWipe(strip.Color(200,   100,   255), 1); 
 colorWipe(strip.Color(  0, 60,   150), 15);
 colorWipe(strip.Color(  200,   40, 200), 25); 

 

}

void colorWipe(uint32_t color, int wait) {
 for (int j=150; j<strip.numPixels(); j++) {
   strip.setPixelColor(j, color);         

 for (int i=149; i>0; i--) {
   strip.setPixelColor(i, color);         
  strip.show();                          
                            
 }
}

das lauflicht nach rechts läuft, das nach links läuft nicht (zweite for-Funktion)

Wäre schön wenn mir jemand auf dei Sprünge helfen könnte

Gruß
Oliver

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Entferne bitte auch die unnötigen Leerzeilen.

Gruß Tommy

Hi

Du willst zwei Lichtpunkte angehen lassen ... ja, warum machst Du Das nicht einfach?
i zählst Du von 0 bis 150, oder von mir aus von 150 bis pixelcount.
Dann setzt Du den Pixel links der Mitte und den Pixel rechts der Mitte - Beide haben den gleichen Abstand zur Mitte, weshalb man aus dem i Beide berechnen kann.
Nun kommt ein .show() und die aktuelle Lage wird angezeigt.
Wenn Du Das direkt in der FOR ablaufen lässt, wird der Stripe sehr sehr schnell gefüllt sein.
Du möchtest aber eher, daß die Pixel erst 'nach einer gewissen Zeit' weiter aufgefüllt werden, oder?

MfG

kannst du mir auf die Sprünge helfen wie ich das im code umsetzen kann?
Die Idee ist gut, aber mit meinen spärlichen Kenntnissen kann ich das noch nicht umsetzen... :frowning:

Oder Du zählst count von 0 bis 150 und steuerst die LEDs 150+count und 150 -count an.

Gruß Tommy

So dürftest Du ein Stückchen weiter kommen (ungetestet):

void colorWipe(uint32_t color, int wait) {
  for (int j = 0; j < (strip.numPixels() / 2); j++) {
    strip.setPixelColor((strip.numPixels() / 2) + j, color);
    strip.setPixelColor((strip.numPixels() / 2) - 1 - j, color);
    strip.show();
    delay(wait);
  }
}

Vielen Dank für eure Hilfe, der Code hat funktioniert, macht genau das was ich haben wollte :slight_smile:
Das mit dem Counter muss auch auch mal ausprobieren.

→ Ich sehe schon, ich habe noch einen weiten Weg vor mir…

Danke an alle

Viele Grüße
Oliver

void colorWipe(uint32_t color, int wait)
{
  for (int j=150; j<strip.numPixels(); j++)
  {
     strip.setPixelColor(j, color);         

     for (int i=149; i>0; i--)
    {
       strip.setPixelColor(i, color);         
       strip.show();                         
    }
  }
} // Die fehlte

Ich habe deinen Code nur mal etwas übersichtlicher geschrieben.
Der dürfte gar nicht übersetzen weil da eine Klammer fehlt.

Ansonsten ist der gar nicht so schlecht, nur du hast die Forschleifen verschachtelt und
das strip.show nur in der zweiten drin.

So :

void colorWipe(uint32_t color, int wait)
{
  for (int j=150; j<strip.numPixels(); j++)
  {
     strip.setPixelColor(j, color);         
     strip.show();
  }

  for (int i=149; i>0; i--)
 {
    strip.setPixelColor(i, color);         
    strip.show();                         
  }
}

könnte das klappen. Allerdings setzt du die Pixel nur.
D.h. wenn die Funktion colorWipe zuende ist sind alle Pixel in einer Farbe an.

Ulli

Ich glaube, Ihr liegt beide daneben, weil der TO wohl ein gleichzeitiges Laufen nach beiden Seiten will, was dann zur Lösung von agmue führt.

Die Klammer war natürlich richtig.

Gruß Tommy

Oli1204:
--> Ich sehe schon, ich habe noch einen weiten Weg vor mir...

Wenn Du mehrere Animationslayer getrennt voneinander aufbauen möchtest, schadet das blockierende delay(), das Du deshalb durch millis() ersetzen solltest. Leider sind viele Bibliotheksbeispiele mit delay, was sie einfacher aber auch weniger praktikabel macht.