Adafruit NeoPixel Rainbow Wheel dunkler

Gast #6057821
Hallo Leute,

ich habe eine Frage zu dem Adafruit NeoPixel Arduino Sketch.
Siehe Adafruit_NeoPixel Library.

Die "void rainbowCycle(uint8_t wait)" Funktion nutzt folgende Zeilen:
1
Pixels.setPixelColor(i, Wheel(((i * 256 / Pixels.numPixels()) + j) & 255));

Es wird also auf "uint32_t Wheel(byte WheelPos)" verwiesen:
1
uint32_t Wheel(byte WheelPos)
2
{
3
  WheelPos = 255 - WheelPos;
4
  if(WheelPos < 85)
5
  {
6
    return Pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
7
  }
8
  if(WheelPos < 170)
9
  {
10
    WheelPos -= 85;
11
    return Pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
12
  }
13
  WheelPos -= 170;
14
  return Pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
15
}

Nun durchlaufen alle LEDs nacheinander die RGB Farben von 0 bis Maximum 
255.

Nun möchte ich aber jede Farbe nur bis Helligkeit 100/255 haben, dies 
will ich in einer extra Integer hinterlegen.
1
 int MaxBright = 100;

Was von der Wheel Funktion muss ich ändern bzw durch "MaxBright" 
ersetzen?
Als Anfänger verstehe ich die Funktion noch nicht ganz. Vielleicht mag 
mir das jemand etwas aufschlüsseln. :)

Danke für eure Hilfe :)
Gast
Danke, habe ich nun probiert.
Nun springen die LEDs während der rainbow und rainbowCycle Funktion 
jedoch.
Anstatt also alle Fabren zu durchlaufen, von (als Beispiel) Gelb direkt 
wieder zu Rot.
1
  void rainbowCycle(uint8_t wait)
2
  {
3
   uint16_t i, j;
4
    for(j=0; j<256*5; j++) // 5 cycles of all colors on wheel
5
    {
6
      for(i=0; i< Pixels.numPixels(); i++)
7
      {
8
        Pixels.setPixelColor(i, Wheel(((i * 256 / Pixels.numPixels()) + j) & 255));
9
        Pixels.show();
10
      }
11
      delay(wait);
12
    }
13
  }

Setze ich jedoch Pixel.setBrightness(255); ist alles wieder okay, bei 
Pixel.setBrightness(Zahl nah an 255); ist der Sprung zwischen den Farben 
geringer.
Gast
Michael schrieb:
> Nun springen die LEDs während der rainbow und rainbowCycle Funktion
> jedoch.

Was erwartest du. Für die Ausgabe an die LEDs gibt es eine bestimme 
Auflösung, i.e. eine Diskretisierung der möglichen Helligkeitswerte. 
Wenn man zur Verringerung der Maximalhelligkeit nur einen Teil des 
Bereiches nutzt, wird die Anzahl der verfügbaren Helligkeitsstufen 
geringer. Bei Farbmischung äußert sich das als schlechtere Abdeckung des 
Farbraumes.
Gast
Hallo,

Du musst Dich dafür etwas tiefer mit den Farbmodellen befassen! Für das 
Colorwheel wird eigentlich ein HSL-Farbmodell verwendet. Dabei ist Hue 
der Farbwert auf einem Farbkreis, hier im Wertebereich 0..254 (255 
entspricht dabei wieder 0).
In der verwendeten Formel in Wheel() wird lediglich ein Sonderfall 
behandelt, die dem volle Sättigung (Saturation S) und halbe Helligkeit 
(Lightness L) angenommen werden. Dadurch wird die Formel einfacher.

Um jedoch die Helligkeit begrenzen zu können, brauchst Du eine Formel, 
in die auch der Lightnesswert miteingeht.
Z.B. https://www.rapidtables.com/convert/color/hsl-to-rgb.html
In Deiner referenzierten Funktion werden einzelne Farbwerte (R,G,B) je 
nach Position im Farbkreis durch die Werte
(255 - WheelPos * 3) bzw. (WheelPos * 3) bestimmt. Wenn diese Werte 
nachträglich auf einen Maximalwert gekappt werden, kommt es zu den 
Sprüngen.

Um das mit Kindern durchzuspielen, haben Kollegen im Fablab Karlsruhe 
ein kleines Projekt gebaut: https://github.com/fablab-ka/FLKA-Lightboard
bei dem die Farbwerte über Regler (web-basiert) eingestellt werden 
können.
Je nachdem, ob einer der RGB-Regler oder einer der HSL-Regler verändert 
wird, werden die anderen Regler passend nachgezogen.
Das ganze kann man sogar ohne ESP mit angeschlossenen WS2812 trocken 
durchspielen:

https://fablab-ka.github.io/FLKA-Lightboard/

Setze hier einmal die Helligkeit (Lightness L) herunter, und Du wirst 
sehen, dass dies auch ohne Sprünge geht.

Allerdings verhalten sich die WS2812 LED nicht ganz so ideal, wie die 
Bildschirmdarstellung, hier müssten dann noch deren Kennlinien 
eingearbeitet werden.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.