FastLed - von einer Farbe zur nächsten überblenden?

Ich stehe gerade total auf dem schlauch.
Ich habe einen LED Ring mit 12 Leds (ws2812).
Nun möchte ich das alle LEDs zb. von grün zu rot faden. kann mir bitte jemand erklären wie das geht?
Etwa so in der Art: Fade(leds, erste led, letzte led, farbe von, farbe zu, geschwindigkeit)

Danke!

Wiki/Dokumentation/Beispiele von FastLed nicht angeschaut :confused:?

Fertige Funktion werde ich nicht liefern. Der PseudoCode sollte mehr als ausreichen

uint8_t soll = 0;// rot
uint8_t ist = 85; // grün

if(ist > soll)
{
ist--;
}

Das ganze auf hsv (hue) anwenden und gut ist.

Natürlich habe ich gesucht. Bin von Fade ausgegangen -> Fabe zu einer anderen Faden. Aber das war es nicht. Blend -> Farbe übeblenden auch nicht.

Dann waren meine Versuche etwa so:

  uint8_t speed = beatsin8(20,0,255);
  endclr = blend(CRGB::White, CRGB::Green, speed);
  midclr = blend(CRGB::Green, CRGB::White, speed);

Habe hsv bisher nicht verwendet, bei mir sieht das so aus:

  if (effectnr == 1) {
    for(int Lednum = 0; Lednum < 3; Lednum = Lednum + 1) {
      leds[Lednum] = CRGB::Blue;
      leds[Lednum] = CRGB::Blue;
      leds[Lednum] = CRGB::Blue;
      leds[Lednum] = CRGB::Green;
      leds[Lednum] = CRGB::Green;
      leds[Lednum] = CRGB::Red;
      leds[Lednum] = CRGB::Red;
      FastLED.show();
      delay(1000);
      leds[Lednum] = CRGB::Black;
    }
   }

Geht es nicht auch ohne hsv? Muss kein fertiger code sein. Ein Anhaltspunkt wie die Funktion heißt wäre schon ausreichend. ich weiß halt nicht nach was ich da suchen soll. Daher "ich stehe auf dem schlauch".

Wäre echt nett wenn jemand helfen könnte. Danke!

Falls es nicht anders geht muss ich halt alles in hsv umschreiben, damit scheint es einfacher zu sein. würde mir das aber gerne ersparen wenn möglich.

Les dir das FastLED Wiki durch. Da kannst du dich noch nicht wirklich eingelesen haben. Die Lib hat eine hsv2rgb Funktion. Da musste nicht alles umschreiben.

Des weiteren wären auch das erneute durchlesen der C-Basics nicht verkehrt. Schau dir bitte mal an, was das soll in der for-Schleife.

void fadeRedGreen(void)
{
	static int ct = 0;
	
	if(/*millis()...*/ && ct < 256)
	{
	leds[led].r = 0;
	leds[led].g = 255- ct;
	
	ct++;		
	}	
}

Wir hatten das Überblenden hier schonmal erfolgreich diskutiert. Inkl. funktionierendem Code.

Läuft darauf hinaus, bei jeder einzelnen LED die R, G und B Werte in der passenden Schrittlänge hoch- oder runterzuzählen.

Das wird im RGB Farbraum weicher, als im HSV Raum.

Braucht einen Doppelpuffer - also 2 CRGB Arrays (für das alte Bild und das neue Bild) old_frame und new_frame.

Auch interessant: SQRT Blending. Ebenfalls inkl. Code.

Mit FastLEDs blend und nblend kann man auch Übergänge machen - braucht ebenfalls einen Doppelpuffer.

Hilft das erstmal zum Inspirieren?

Gruß,

Helmuth

Ich habe noch nicht alles gelesen, es ist aber dennoch eine inspiration die zum nachdenken in eine ganz andere richtung führt :slight_smile: Danke!

Hatte da wohl zu einfach gedacht und auf eine fertige funktion wie etwa
Fade(leds, erste led, letzte led, farbe von, farbe zu, geschwindigkeit)
gehofft. Für gradient gibt es so etwas....

Ich stehe halt noch ziemlich am anfang. habe schon einiges an einfachen effekten programmiert aber halt auf meine eher einfach gehaltene art. wird zeit weiter zu denken xD

Hatte da wohl zu einfach gedacht und auf eine fertige funktion wie etwa
Fade(leds, erste led, letzte led, farbe von, farbe zu, geschwindigkeit)
gehofft. Für gradient gibt es so etwas....

Wenn es nur um Farbverläufe geht, kannst Du ja fill_gradient nehmen und (HSV) Start- und Endcolor gegenläufig hoch-/runterzählen.

void fill_gradient( T* targetArray,
                    uint16_t startpos, CHSV startcolor,
                    uint16_t endpos,   CHSV endcolor,
                    TGradientDirectionCode directionCode  = SHORTEST_HUES )

wird zeit weiter zu denken xD

Gruß,

Helmuth