Go Down

Topic: LED Strip Blinker sehr langsam (Read 1 time) previous topic - next topic

Michi33

Mar 21, 2018, 01:01 am Last Edit: Mar 21, 2018, 07:12 am by uwefed Reason: add CODE TAGs </>
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 ?



Code: [Select]

#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);
}}

MiReu

Hi,

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

Gruß

MiReu
Wer nix macht, macht nix falsch, lernt aber auch nix.

wno158

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:

Code: [Select]

  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
Gruß Walter

uwefed

#3
Mar 21, 2018, 07:18 am Last Edit: Mar 21, 2018, 07:23 am by uwefed
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

wno158

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
Gruß Walter

Michi33

#5
Mar 21, 2018, 10:39 pm Last Edit: Mar 22, 2018, 12:20 am by uwefed
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

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

uwefed

#6
Mar 22, 2018, 12:19 am Last Edit: Mar 22, 2018, 12:20 am by uwefed
Hat Du nichts gelernt? wo ist strip.show(); ??

Code: [Select]
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();

Thorsten4171

@Uwe
Danke für den Code
Quote
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. :)

michael_x

Quote
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)

agmue

Gut dass der Compiler noch viel schlauer ist ...
[Klugscheisser an]
Der Compiler ist doof, die Leute, die ihn programmiert haben, sind schlau!
[Klugscheisser aus]
 :smiley-mr-green:
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Thorsten4171

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

agmue

Der Compiler optimiert die Moduloberechnung zu einer für ihn einfacheren Operation. Wahrscheinlich testet er Bit 0.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

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?

postmaster-ino

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
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Thorsten4171


Go Up