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 <Adafruit_NeoPixel.h>


#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 :wink:

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 :slight_smile:

Vielen Dank für die Tipps

Vielleicht könnt Ihr mir gerade noch weiter helfen :slight_smile:

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. :slight_smile:

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 :wink:

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 :slight_smile:

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.