LED Strip RGB Farben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mardor
User
Beiträge: 27
Registriert: Montag 9. Februar 2015, 19:07

Hallo,

ich habe mir eine Lampe via APA102 LED Strip gebaut. Bei diesem LED Strip wird jede einzelne LED via RGB Farbcode angesprochen.
Leider ist es tatsächlicherweise nicht wirklich der bekannte Farbcode, denn wenn ich FFFF33 eingebe kommt leider kein gelb heraus.

Ich würde nun gerne einfach den kompletten Farbraum also 000000 bis FFFFFF nacheinander durchlaufen lassen. Mein Problem ist wie ich dieses Durchlaufen lassen realisieren kann. Meine Idee wäre für die erste Stelle eine Schleife von 0 bis F zu erstellen, dann wenn die Schleife bei F wäre die 2te Stelle auf B zu stellen. Dies würde ich dann mit allen 6 Stellen durchführen. Somit bräuchte ich auch 6 ineinander verschachtelte Schleifen.

Macht das Sinn oder geht das auch irgendwie einfacher ?

Gruß
BlackJack

@Mardor: 000000 bis FFFFFF sind doch einfach nur die Zahlen 0 bis 16777215 (2²⁴ - 1) als sechsstellige Hexadezimaldarstellung mit Grossbuchstaben. Da brauchst Du nur *eine* Schleife — eben über die Zahlen — und die `format()`-Methode auf Zeichenketten oder die `format()`-Funktion mit dem entsprechenden Platzhalter um eine ganze Zahl wie gewünscht zu formatieren.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Der RGB-Farbraum lässt sich doch einfach als Ganzzahl zwischen 0 und 2 ^ 24 - 1 darstellen. Ein bisschen Formatieren und man hat die RRGGBB-Darstellung:

Code: Alles auswählen

from functools import partial
all_rgb = map(partial('{:06x}'.format), range(2 ** (8 * 3)))
(BlackJack war schneller)
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
karolus
User
Beiträge: 140
Registriert: Samstag 22. August 2009, 22:34

@bwbg: partial wird da nicht benötigt
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Stimmt, ist mir gerade auch aufgefallen:

Code: Alles auswählen

all_rgb = map('{:06x}'.format, range(2 ** (8 * 3)))
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Mardor
User
Beiträge: 27
Registriert: Montag 9. Februar 2015, 19:07

Hallo,

vielen vielen Dank für eure Tipps.

An das "hochzählen" und dann umwandeln in Hex hatte ich gar nicht gedacht. Da meine Fähigkeiten noch nicht so hoch sind um den "map" Befehl komplett zu verstehen, habe ich den Code zum Beispiel genommen und folgendes daraus gemacht:

Code: Alles auswählen

import apa102
import time

strip = apa102.APA102(180,10)

for color_int in range(2 ** (8 * 3)):
	for led_number in range(0,180):
		color_hex = format(color_int, '#08x')
		strip.setPixelRGB(int(led_number),color_hex)
		print(led_number, color_hex)
	strip.show()
Leider erhalte ich folgende Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "ms_all_led_colorchange_all.py", line 15, in <module>
    strip.setPixelRGB(int(led_number),color_hex)
  File "/home/pi/Documents/APA102_Pi/apa102.py", line 128, in setPixelRGB
    self.setPixel(ledNum, (rgbColor & 0xFF0000) >> 16, (rgbColor & 0x00FF00) >> 8, rgbColor & 0x0000FF)
TypeError: unsupported operand type(s) for &: 'str' and 'int'
Folgender Code:

Code: Alles auswählen

print ("2")
for i2 in range(0,180):
  print("2."+ str(i2))
  strip.setPixelRGB(int(i2),0xADC42A)
Für mich sieht die Meldung irgendwie so aus als könnte ich nur einen Hexwert benutzen. Allerdings habe ich schon viele Test (inkl. hex(color_hex)) getestet, jedoch ohne Erfolg.

Was mache ich hier falsch ?

Gruß Mardor
Zuletzt geändert von Anonymous am Freitag 14. April 2017, 13:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Mardor: Es wird ganz offensichtlich eine *Zahl* erwartet und keine Zeichenkette. Also ganz einfach nur `color_int` übergeben und gar nichts weiter damit machen.

Frage Nebenbei: Was denkst Du denn was bei ``int(led_number)`` der `int()`-Aufruf bewirken soll?
Mardor
User
Beiträge: 27
Registriert: Montag 9. Februar 2015, 19:07

Hallo BlackJack,
@Mardor: Es wird ganz offensichtlich eine *Zahl* erwartet und keine Zeichenkette. Also ganz einfach nur `color_int` übergeben und gar nichts weiter damit machen.
Ja, aber es wird ein 0x und eine 6stellige Zahl erwartet, somit wäre dies dann ein string oder (weil ein 0x dabei ist) ?
Wenn ich nur beispielsweise ein FFEE00 übergebe erhalte ich einen Fehler.

Frage Nebenbei: Was denkst Du denn was bei ``int(led_number)`` der `int()`-Aufruf bewirken soll?
Es übergibt den bereits als integer existierenden Wert als integer. Also macht es sozusagen gar nix (sinnvolles). :? Danke für den Hinweis.

Gruß Mardor
BlackJack

@Mardor: Es wird eine Zahl erwartet und keine Zeichenkette. Wie Du die Zahl schreibst ist wurscht solange es eine Zahl ist. 0xFFEE00 ist keine Zeichenkette sondern eine Zahl. Ob Du diese Zahl als 0xFFEE00 oder 16772608 oder 077767000 oder 0b111111111110111000000000 ist egal, das ist immer die gleiche Zahl, bloss halt *im Quelltext* in einer anderen Schreibweise. Denn im laufenden Programm ist das immer der selbe Wert. So etwas wie dezimale ganze Zahlen und hexadezimale ganze Zahlen gibt es nicht.
Mardor
User
Beiträge: 27
Registriert: Montag 9. Februar 2015, 19:07

Hallo BlackJack,

entschuldige meine nochmalige Rückfrage:

Also wenn ich einfach den integer übergebe erhalte ich zumindest keine Fehlermeldung mehr. Allerdings verstehe ich eines noch nicht.

Code: Alles auswählen

import apa102
import time

strip = apa102.APA102(180,10)

for color_int in range(2 ** (8 * 3)):
        for led_number in range(0,180):
                color_hex = format(color_int, '#08x')
                strip.setPixelRGB(led_number,color_hex)
                print(led_number, color_hex)
        strip.show()
Ist hier "color_hex" eine Zahl oder ein String ?
Wenn ich mir die Fehlermeldung so ansehe würde ich auf einen String tippen.

Code: Alles auswählen

Traceback (most recent call last):
  File "ms_all_led_colorchange_all.py", line 9, in <module>
    strip.setPixelRGB(led_number,color_hex)
  File "/home/pi/Documents/APA102_Pi/apa102.py", line 128, in setPixelRGB
    self.setPixel(ledNum, (rgbColor & 0xFF0000) >> 16, (rgbColor & 0x00FF00) >> 8, rgbColor & 0x0000FF)
TypeError: unsupported operand type(s) for &: 'str' and 'int'
Wenn dies ein String wäre, kann ich diesen String dann irgendwie unkompliziert zur Zahl konvertieren um diesen als Hex-Wert/Zahl zu im Programm zu nutzen ?

Gruß Mardor
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mardor hat geschrieben:Ist hier "color_hex" eine Zahl oder ein String ?
Ein String. Wenn das aus der Dokumentation zu format nicht klar genug hervorgeht, dann kann man sich einfach mit print(type(color_hex)) den Typ ausgeben lassen.
Mardor hat geschrieben:Wenn dies ein String wäre, kann ich diesen String dann irgendwie unkompliziert zur Zahl konvertieren um diesen als Hex-Wert/Zahl zu im Programm zu nutzen ?
Ja, man kann diesen String in eine Zahl konvertieren, aber wozu? Du hast die Zahl doch bereits in color_int. Die Frage wäre eher, warum du überhaupt noch einen String daraus machst.
Antworten