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ß
LED Strip RGB Farben
@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.
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:
(BlackJack war schneller)
Code: Alles auswählen
from functools import partial
all_rgb = map(partial('{:06x}'.format), range(2 ** (8 * 3)))
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
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!"
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:
Leider erhalte ich folgende Meldung:
Folgender Code:
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
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()
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'
Code: Alles auswählen
print ("2")
for i2 in range(0,180):
print("2."+ str(i2))
strip.setPixelRGB(int(i2),0xADC42A)
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.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@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?
Frage Nebenbei: Was denkst Du denn was bei ``int(led_number)`` der `int()`-Aufruf bewirken soll?
Hallo BlackJack,
Wenn ich nur beispielsweise ein FFEE00 übergebe erhalte ich einen Fehler.
Gruß Mardor
Ja, aber es wird ein 0x und eine 6stellige Zahl erwartet, somit wäre dies dann ein string oder (weil ein 0x dabei ist) ?@Mardor: Es wird ganz offensichtlich eine *Zahl* erwartet und keine Zeichenkette. Also ganz einfach nur `color_int` übergeben und gar nichts weiter damit machen.
Wenn ich nur beispielsweise ein FFEE00 übergebe erhalte ich einen Fehler.
Es übergibt den bereits als integer existierenden Wert als integer. Also macht es sozusagen gar nix (sinnvolles). Danke für den Hinweis.Frage Nebenbei: Was denkst Du denn was bei ``int(led_number)`` der `int()`-Aufruf bewirken soll?
Gruß Mardor
@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.
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.
Ist hier "color_hex" eine Zahl oder ein String ?
Wenn ich mir die Fehlermeldung so ansehe würde ich auf einen String tippen.
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
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()
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'
Gruß Mardor
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:Ist hier "color_hex" eine Zahl oder ein String ?
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.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 ?