Forum: Mikrocontroller und Digitale Elektronik Adafruit NeoPixel Rainbow Wheel dunkler


von Michael (Gast)


Lesenswert?

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

von foobar (Gast)


Lesenswert?

Das gibt's schon: Pixel.setBrightness(x)

von Michael (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Fablab KA (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.