Go Down

Topic: [GELÖST] Wie FastLED Animation bzw. Effekt überlagern? (Read 1 time) previous topic - next topic

agmue

Mit etwas Glück leuchten beide Pixel in gleicher Farbe.
Gut gesehen, aber kein Glück! Ich habe das natürlich ausprobiert, sonst würde ich das hier nicht reinstellen. Allerdings habe ich nicht alle Farben probiert  ;)

Clou ist aber eigentlich newColor.v = 100; mit einer neuen Helligkeit bei gleicher Farbe.

Aber der TO hat sich so auf die gesuchten Methoden versteift, daß er alternative Lösungen nicht sehen "will".

#10 ist eigentlich die Idee, die Animation in HSV zu rechnen und dann nach RGB zu kopieren, weil FastLED.show ein RGB-Feld benötigt. Diese Variante dürfte farbtreuer sein.

Oder man macht sich eben eine Funktion zum Umrechnen von RGB nach HSV.

postmaster-ino

Hi

Das 'Glück' war auch eigentlich nur so gesagt ;)
Der Link zu Deinem Sketch ist auch schon in den Lesezeichen ... muß 'nur noch' in die Arduino-IDE finden (mir gehen gerade die Nano's aus ... wobei ich auch noch Uno's da hätte ... und einen WS2812B-Streifen habe ich Gestern auch recycled (... gegen auf Flach-Alu geklebte Streifen getauscht).

MfG

Tommy56

Ich komme nochmal auf meinen Kommentar zurück: Halte Deine Werte in einem eigenen CHSV-Array.
Das sind 3 Byte * 144 = 432 Byte. Das sollte auf einem MEGA machbar sein, bei Verwendung eines I2C-FRAM (evtl. SPI - ist wesentlich schneller) sogar auf einem UNO. Da wäre aber die notwendige Geschwindigkeit noch in Betracht zu ziehen.

Dann änderst Du die Werte im CHSV-Array und füllst von dort das CRGB-Array (diese Richtung ist ja implementiert), evtl. auch nur für einzelne Pixel.

Also Lösungen gibt es.

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Lagom

#18
Oct 11, 2018, 11:47 pm Last Edit: Oct 12, 2018, 12:05 am by Lagom
Also

Code: [Select]
leds[i].addToRGB(#);
leds[i].subtractFromRGB(#);

sind nicht brauchbar, da die Farbe erheblich verändert wird.

Der Hinweis von @agmue auf

Code: [Select]
leds[i].fadeLightBy(#);
war, was das dimmen betrifft, gut. Allerdings dimmen Werte von 0-255 nicht linear, erst ab einem Wert von über 196 tut sich etwas Wahrnehmbares, höhere Werte als 237 verändern zusehends die Farbe. Auch bei

Code: [Select]
leds[i].fadeToBlackBy(#);
tut sich unter 196 nichts, wobei man dann allerdings ohne Farbverfälschung bis auf 255 (LED ist aus) gehen kann; das ist also, was die Farbstabilität angeht, sehr gut, wenn man zwischen 196 und 254 bleibt.

Wenn jetzt noch

Code: [Select]
leds[i].maximizeBrightness(#);
das genaue Gegenstück dazu ist, wäre die Sache gelöst.

@Tommy56 Ich verwende 24 Adafruit Trinket 5V der Kleinheit halber. Aber das Problem ist schon zur Hälfte gelöst. Fortgeschrittene codes schaue ich mir natürlich auch gerne an, aber erst wenn ich sie auch nachvollziehen kann. Alles in allem hat dieser thread im Gegensatz zum Englischen konkret ein Ergebnis gebracht, das ist schon sehr gut, wie ich finde. Wenn nun noch maximizeBrightness das Gegenstück zu fadeToBlackBy ist, dann ist sicher auch anderen Laien geholfen.

Tommy56

Hier ist ein Beitrag zur Nichtlinearität von LED und Auge.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Lagom

@Tommy56 Das ist hier anders. Unter 196 ist, ein verläßliches Testo 545 Luxmeter ist vorhanden, keine Helligkeitsveränderung festzustellen; ab 196 tritt diese sprunghaft ein.

agmue

#21
Oct 12, 2018, 12:57 pm Last Edit: Oct 12, 2018, 04:24 pm by agmue
... ein verläßliches Testo 545 Luxmeter ist vorhanden ...
Das habe ich gerade nicht zur Hand ::)

Nimm doch eine Meßkurve der Helligkeit zum Wert einer LED (gemeint ist die innerhalb eines Lichtpunktes) auf. Wenn Du keine annähernd linearen Verläufe erhältst, mußt Du kalibrieren oder den Lichtstreifen in den Partykeller hängen.

postmaster-ino

Hi

Nur als Gedanke:
Wenn Du hier eine brauchbare Lösung bekommen konntest, wäre eine Nennung im englischen Bereich vll. auch nicht ganz verkehrt.

MfG

Verzweifler

#23
Oct 12, 2018, 07:09 pm Last Edit: Oct 12, 2018, 07:10 pm by Verzweifler
Hi!

Wie wärs: Du füllst deine Leds mit der Palette wie gehabt, aber auf voller Helligkeit.

Erst dann modifizierst du die Helligkeit:
-Hellere Pixel werden wenig gedimmt.
-Dunklere Pixel werdem stärker gedimmt.
-Die Restlichen Pixel werden um z.B. 50 gedimmt für die "normale" Helligkeit.

Das kann vieleicht mit nFadeVideo() oder wie das Heist Farbgetreu gehen.
Siehe: https://github.com/FastLED/FastLED/wiki/Pixel-reference Im Abschnitt Color Math.

Wie viel Leds hast du dann an nem Trinket.
Der hat doch nur 512 Byte RAM (basiert der nicht auf dem Tiny85?) mit Arrays kann man da Probleme kriegen.

Ich melde mich später mal ob meine Idee geklappt hat, komme die nächsten Stunden leider nicht zum Probieren.

Grüße

Lagom

Hi

Nur als Gedanke:
Wenn Du hier eine brauchbare Lösung bekommen konntest, wäre eine Nennung im englischen Bereich vll. auch nicht ganz verkehrt.

MfG
@postmaster-ino Danke, das sollte man so machen; ich ändere den Titel meiner threads nach einer Lösung der Fairness halber mit [SOLVED] und füge ggf. den funktionierenden code hinzu, sodaß auch andere Anfänger ein komplettes Beispiel zur Ansicht haben. So werde ich es auch in diesem Fall halten.

Lagom

#25
Oct 12, 2018, 07:49 pm Last Edit: Oct 12, 2018, 08:03 pm by Lagom
Nimm doch eine Meßkurve der Helligkeit zum Wert einer LED (gemeint ist die innerhalb eines Lichtpunktes) auf. Wenn Du keine annähernd linearen Verläufe erhältst, mußt Du kalibrieren oder den Lichtstreifen in den Partykeller hängen.
Daß man von 0-195 nicht und erst ab 196 eine Helligkeitsänderung sehen kann, ist ok; mit Werten von 196-237 erhält man ein akzeptables Abdunkeln der LEDs, wie ursprünglich gedacht. Vielleicht könnte es mit Werten unter 196 noch besser sein, aber sei's drum; besser als nichts.

Lagom

#26
Oct 12, 2018, 08:02 pm Last Edit: Oct 12, 2018, 08:25 pm by Lagom
Du füllst deine Leds mit der Palette wie gehabt, aber auf voller Helligkeit.
@Verzweifler Vielen Dank, genau so mache ich es.

Quote
Erst dann modifizierst du die Helligkeit:
-Hellere Pixel werden wenig gedimmt.
-Dunklere Pixel werdem stärker gedimmt.
Alle LEDs sind, über die gradient palette, mit ihrer Helligkeit in setup() auf 255 gesetzt.

Quote
Das kann vieleicht mit nFadeVideo() oder wie das Heist Farbgetreu gehen.
Die anderen methods verändern die Farbe zu stark; mit

Code: [Select]
leds[i].fadeToBlackBy(#);


geht es, wie oben beschrieben, mit Werten von 196-237 ganz ordentlich.


Quote
Wie viel Leds hast du dann an nem Trinket.



An jedem Trinket hängt ein APA102C Streifen mit 144 LEDs.

Zur Ansicht der sketch, der über 1 Stunde, mit einer gradient palette, den leds array füllt:


Code: [Select]
/******* Skylight *******/

/******* Adafruit Pro Trinket, 1m APA102C LED strip *******/

/******* LIBRARIES *******/

#include "FastLED.h"

/******* VARIABLES *******/

const byte pinData = 3;
const byte pinClock = 4;

const byte ledCount = 144; // Standard number for 1m APA102C LED strip
byte maxBrightness = 255; // Values from 0 - 255, can be changed interactively with a potentiometer

DEFINE_GRADIENT_PALETTE(testSky) {
  0,  33, 55, 153,
  25,  80, 119, 197,
  89, 153, 215, 250,
  95, 199, 233, 252,
  102, 255, 255, 255,
  120, 197, 219, 240,
  147, 150, 187, 223,
  200, 159, 171, 172,
  255, 169, 154, 128
};

CRGBPalette16 activePalette = testSky;

struct CRGB leds[ledCount];

/******* FUNCTIONS *******/

void setup() {
  LEDS.addLeds<APA102, pinData, pinClock, BGR>(leds, ledCount); // BGR for APA102C LED strips
  LEDS.setBrightness(maxBrightness);
  LEDS.setCorrection(UncorrectedColor); //LEDS.setCorrection(Candle); or (Tungsten40W)
} // End of setup

void loop() {
  sky();
  //shimmer();
  FastLED.show();
} // End of loop

void sky() { // Static variables local to the function, but persist between calls

  static const float transitionDuration = 60; // Minutes (10 minutes: one step = 2343.75 ms; 1 hour = 14062.5 ms)
  static const float interval = ((float)(transitionDuration * 60) / 256) * 1000; // Steps in milliseconds
  static byte paletteIndex = 0; // Current gradient palette colour

  CRGB colour = ColorFromPalette(activePalette, paletteIndex, maxBrightness, LINEARBLEND); // Or use a built-in palette
  fill_solid(leds, ledCount, colour); // Set whole strip to colour fetched from the palette

  EVERY_N_MILLISECONDS(interval) { // Timed palette traversal
    if (paletteIndex < 240) { // Don't use 255, see https://github.com/FastLED/FastLED/issues/515#issuecomment-340627525
      paletteIndex++;
    }
  }
} // End of sky


@Tommy56 In der Anleitung von Adafruit steht zum Pro Trinket: 28K of flash, and 2K of RAM. Das ist die Trinketversion, die ich habe. Das "normale" Trinket hat weniger RAM, das stimmt. Der obige sketch verwendet 12% und global variables 593 bytes; so zeigt es die Arduino IDE an.

Tommy56

Das ist bei 512 Byte RAM schon ganz schön am Limit.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

agmue

Der  Pro Trinket hat einen ATmega328 an Bord.

Tommy56

Danke für die Korrektur, ich war vom Trinket (ohne pro) ausgegangen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Go Up