Led Streifen langsamer "zählen"

Hallo,

ich habe einen Led Streifen mit WS2812B Leds. Den hab ich zu einzelnen Lampen aufgeteilt a 14 Leds.

Bin leider ein blutiger Anfänger und es ist eher alles nach dem Motto “Try and Error”

Habe einen Sketch verwendet, den jemand freundlicherweise zur Verfügung gestellt hat und den etwas modifiziert damit er statt Regenbogen in dem Fall von Rot nach Gelb wechselt.
Hier der Code:

#include "LedFunction.h"

class WechselRY: public LedFunction
{
  public:
  WechselRY()
  {    
  }

  virtual void render()
  {
    int j = (millis() >> 4) & 255;
    for(int i = 0; i < state->count; i++)
    {
      int ij = 255 - ((i + j) & 255);
         state->setRgb(i, 255, 255-ij , 0);
     }
  }
};

Ich hätte zwei Fragen dazu:

  1. Wie schaffe ich es, dass das System langsamer zählt, da mir der Wechsel zwischen den einzelnen Leds zu schnell geht. Als ichs mit nem Delay hinter der Klammer } für die For Schleife probiert habe hat dann natürlich das ganze für die Dauer des Delay gestoppt und hat dann alle paar Sekunden den Zustand gewechselt und es gab eben keine fliesende Bewegung mehr sondern Farbsprünge. Als ich es hinter dem For Befehl probiert habe hat er die Variable nicht mehr erkannt (?).

Daher wäre meine Frage, wie ich es hinbekommen, dass die Schleife einfach an sich langsamer zählt.

  1. Ich würde gerne die Farbe Blockweise wechseln können. Also 14 Leds gleichzeitig färben und dann zum nächsten Block wechseln

for(int i = 0; i < state->count; i++)
{
int ij = 255 - ((i + j) & 255);
state->setRgb(i, 255, 255-ij , 0);
}

Habe da versucht die Led mit ner Schleife zu ersetzen hat aber nicht so geklappt bzw. hab ichs sehr wahrscheinlich falsch gemacht.

Hab vorher ein int k=0; eingeführt und dann damit versucht das i mit einer for Schleife zu ersetzen:
state->setRgb(for ((i+k);k<14;k++)), 255, 255-ij , 0);

Muss vermutlich noch was mit {und } machen oder? Weiß aber nicht so recht was ich dann darein schreiben würde.

Die Hauptschleife würde ich dann auf for(int i = 0; i < state->count; i+14) ändern?

i < state->count bezieht sich auf die Led Gesamtzahl und ist in einem anderen Teil des Sketches definiert. (Insgesamt 210)

Danke für eure Mühen und noch einen schönen Abend

Christian

Zu 1:

int j = (millis() >> 4) & 255;

millis() wird durch 16 geteilt. Wenn du da einen anderen Wert nimmst, sollte sich die Geschwindigkeit ändern

z.B.:

int j = (millis() /100) & 255;

Schau mal BlinkWithoutDelay an, wie zeitabhängige Abläufe implementiert werden können. Dann kannst Du auch mehrere Streifen quasi gleichzeitig oder unabhängig voneinander ansteuern.

Rintin:
Zu 1:

int j = (millis() >> 4) & 255;

millis() wird durch 16 geteilt. Wenn du da einen anderen Wert nimmst, sollte sich die Geschwindigkeit ändern

z.B.:

int j = (millis() /100) & 255;

Perfekt. Vielen Dank :slight_smile:

Bin mir nicht sicher ob ich 2. richtig verstanden hab.

Mit i werden die einzelnen LEDs angesprochen. Außerdem geht es in die Berechnung der Farbe ein:

int ij = 255 - ((i + j) & 255);

Zum gruppieren von der LEDs mußt du die Berechnung der Farbe ändern. z.B.:

int k = i / 14;
int ij = 255 - ((k + j) & 255);

Danke für deine Hilfe :slight_smile:

  1. War so gemeint, dass ich insgesamt 15 einzelne Lampen hab, die dann eine gesamte Lampe ergeben. Jede Lampe hat 14 Leds und es soll jede Lampe als ganzes die Farbe wechseln und dann immer die nächste.

Kann ich mit int durch 14 teilen? Ist der nicht nur für ganze Zahlen?

Könnte ich alternativ die Farbberechnung weiter mit i machen und für die Ausgabe dann (vermutlich zwei) Variablen einführen, die dann die Farbe an die Leds ausgeben?

  int p = 0;
  virtual void render()
  {
    int j = (millis() /66) & 255;
    for(int i = 0; i < state->count; i+14)
    {
      int ij = 255 - ((i + j) & 255);
      p+14;
      for(int k = 0; k < p; k++)
      { state->setRgb(k, 255, 255-ij, 0);
      }   
     }
  }
};

Hatte es jetzt erstmal so probiert, aber ist (höchst unerwartet :smiley: ) nicht die Lösung des Problems. Aber gibts da vielleicht ne Möglichkeit, das so in die Richtung zu machen?

Alternativ könnte man statt die Farbe zu berechnen am Anfang zB sagen geh komplett auf Rot und wechsel dann blockweise auf Orange oder nicht ? (Auch wenn dann natürlich etwas vom Effekt verloren ginge)

Chrizzle:
Habe einen Sketch verwendet, den jemand freundlicherweise zur Verfügung gestellt hat und den etwas modifiziert …

Um das, was Du machst, nachzuvollziehen, wäre es gut, das komplette Programm einschließlich LedFunction.h zur Verfügung zu stellen, meinetwegen als Anhang. Bevor ich Dir einen Rat gebe, würde ich gerne sehen, ob er auch funktioniert :slight_smile: