LED Strip Blinker sehr langsam

Hallo

Ich habe meine 300 LED Strip 2812 versuch zum blinken zu bringen mit dem folgenden Script. Bei 60 LED geht das sehr schnell, bei 300 schaltet es die LED sehr langsam. Verwende ich den falschen Befehl ?

#include 


#define PIXEL_COUNT 300
#define PIXEL_PIN    13    // Data PIN for LED Stripe       

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

void setup() {

  strip.begin();
  strip.show(); 

}

void loop() {
  
for(uint16_t i=0; i<300; i++) {
    strip.setPixelColor(i, strip.Color(  255, 55, 0));
    strip.show();
//        delay(1);
    }
    delay(400);
    {
    for(uint16_t i=0; i<300; i++) {
    strip.setPixelColor(i, strip.Color(0, 0, 0));
    strip.show();
  }
    delay(400);
}}

Hi,

spiel doch etwas mit den delay "Zeiten". Wenn du die kleiner machst, dann wird das ganze auch schneller ;)

Gruß

MiReu

Vielleicht wäre es eine Überlegung wert (wenn Du schon mit delay() arbeiten willst) die Wartezeit automatisch an die vorher verstrichene Zeit zum Setzen der Pixel anzupassen:

  unsigned long vorher;
  unsigned long nachher;

  vorher = millis();
  for(uint16_t i=0; i<300; i++) {
    strip.setPixelColor(i, strip.Color(  255, 55, 0));
    strip.show();
  }
  nachher = millis();
  delay(400 - (nachher-vorher));

Gruß Walter

Schreib das strip.show(); außerhalb der for Schleife.

strip.show(); √ľbertr√§gt die Daten aus dem Buffer auf die LED. Pro LED dauert die √úbertragung 24 x 1,25¬ĶS = 30¬ĶS und zus√§tzlich ca 50¬ĶS Reset vorher. Bei 300 LED sind das jedes mal ca 9mS. Wenn Du das 300 mal in der Schleife machst dann sind das ca 2,7s nur f√ľr die √úbertragung.

Gr√ľ√üe Uwe

Uii - wieder was gelernt; nämlich die Strip-Zeiten. Danke!

@Michi: Dann w√ľrde auch mein Code aus der Kurve fliegen, denn der schaut nicht nach, ob die Restzeit positiv ist.

Gruß Walter

Problem solved :)

Vielen Dank f√ľr die Tipps

Vielleicht könnt Ihr mir gerade noch weiter helfen :-)

Wie m√ľsste ich den Befehl anpassen, damit von den 300 LED's immer 30 ein und dann die n√§chsten 30 wieder aus sind

for(uint16_t i=0; i<300; i++) {
    strip.setPixelColor(i, strip.Color(  255, 55, 0));
    strip.show();

Hat Du nichts gelernt? wo ist strip.show(); ??

for(uint16_t i=0; i<300; i++) {
if( !((i/30) %2) )  strip.setPixelColor(i, strip.Color(  255, 55, 0));
else  strip.setPixelColor(i, strip.Color(  0, 0, 0));
 }
strip.show();

@Uwe Danke f√ľr den Code

for(uint16_t i=0; i<300; i++) { if( !((i/30) %2) ) strip.setPixelColor(i, strip.Color( 255, 55, 0)); else strip.setPixelColor(i, strip.Color( 0, 0, 0)); }

Habe so was in meiner Led Kette auch umst√§ndlich √ľber mehrere Vaiablen und if Versch. eingebaut. Aber durch den Modulo Oper. ist das ja viel leichter zu l√∂sen.Ja Mathematik hilft manchmal. :)

durch den Modulo Oper. ist das ja viel leichter zu lösen.Ja Mathematik hilft manchmal.

Gut dass der Compiler noch viel schlauer ist und wei√ü, dass es was viel einfacheres gibt und man f√ľr %2 keine m√ľhsame Modulo-Division braucht. 8)

michael_x: Gut dass der Compiler noch viel schlauer ist ...

[Klugscheisser an] Der Compiler ist doof, die Leute, die ihn programmiert haben, sind schlau! [Klugscheisser aus] :grin:

@michael_x

Da reicht mein Verständniss nicht aus . Kannst du mir das verdeutschen?

Der Compiler optimiert die Moduloberechnung zu einer f√ľr ihn einfacheren Operation. Wahrscheinlich testet er Bit 0.

Aha Es ist so aber die beste wenn nicht ein zigste Möglichkeit dem Compiler mitzuteilen was ich will. Sehe ich das so ungefähr richtig?

Hi

Viele Wege f√ľhren nach Rom - und Welcher davon der Beste ist, dar√ľber wird man trefflich streiten k√∂nnen. Vll. wird man sich einig, Welchen man ganz sicher nicht beschreiten sollte, aber in der anderen Richtung sehe ich schwarz ;)

Wenn Der Code f√ľr Dich passt, schnell genug ist und Das macht, was Du willst: Gl√ľckwunsch! Erst Mal so belassen!!

Klar, man kann IMMER irgend was besser oder sch√∂ner machen - nur, ob's unterm Strich was bringt. Auch ist RAM und Flash daf√ľr da benutzt zu werden - unbenutzte Bereiche bringen Dir keinen VOrteil - wenn hier noch Optimierungspotential besteht, hat an 'f√ľr sp√§ter' noch Reserven, mehr aber nicht.

MfG

Ok alles Klar.

Danke euch :)

agmue: Der Compiler optimiert die Moduloberechnung zu einer f√ľr ihn einfacheren Operation. Wahrscheinlich testet er Bit 0.

Oder verschiebt die Zahl √ľber ein Flag nach rechts und f√ľhrt einen bedingten Sprung dieses Flags durch. (6502 Vorgesch√§digter)

Gr√ľ√üe Uwe

Thorsten4171:
Aha
Es ist so aber die beste wenn nicht ein zigste Möglichkeit dem Compiler mitzuteilen was ich will.
Sehe ich das so ungefähr richtig?

i & 1 unterscheidet grade/ungrade.

Postmaster hat nat√ľrlich Recht.
Wenn der Compiler einen unterst√ľtzt, und aus % 2 das erheblich elegantere &1 macht, schadet es nicht, das zumindest zu wissen.