Farben zuordnen

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
Tim815
User
Beiträge: 8
Registriert: Donnerstag 17. Mai 2018, 18:13

Hallo
Ich habe da ein kleines einfaches Skript für eine binäre Uhr auf einer 8x8 LED-Matrix von Adafruit. Nun hätte ich gerne für Stunden, Minuten und Sekunden unterschiedliche Farben. Kann jemand helfen? Vielen Dank.
Tim

from neopixel import *
import time

# LED strip configuration:
LED_COUNT = 64 # Number of LED pixels.
LED_PIN = 18 # GPIO pin connected to the pixels (18 uses PWM!).
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 5 # DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS = 105 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # Invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
LED_STRIP = ws.WS2811_STRIP_GRB # Strip type and colour ordering


def render(number, pixel_offset, strip):
for index, char in enumerate("{0:b}".format(number).rjust(6, "0")[::-1]):
color = Color(0, 0, 50) if char == '1' else 0
strip.setPixelColor(pixel_offset + index, color)


if __name__ == '__main__':
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA,
LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL, LED_STRIP)
strip.begin()
print('Press Ctrl-C to quit.')
while True:
t = time.localtime()
render(t.tm_sec, 17, strip)
render(t.tm_min, 33, strip)
render(t.tm_hour, 49, strip)
strip.show()
time.sleep(500/1000.0)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

... und willkommen im Forum ;-)

Bitte in Zukunft den Code in einen Codeblock setzen, sonst ist das schlecht bis nicht lesbar. Dazu musst unter dem Editorfeld auf "Vorschau und erweiterter Editor" klicken, dann im erscheinenden Menü ganz rechts auf Python.

Zur Farbe: was genau ist denn dein Problem? Was hast du probiert, was funktioniert nicht?

Ohne in die Doku geschaut zu haben würde ich mal stark vermuten, dass du in der Zeile

Code: Alles auswählen

color = Color(0, 0, 50) if char == '1' else 0
einfach nur andere Werte als `(0, 0, 50)` angeben musst, um eine andere Farbe zu bekommen.

Gruß, noisefloor
Tim815
User
Beiträge: 8
Registriert: Donnerstag 17. Mai 2018, 18:13

Hallo
Sorry für den Fauxpas, werde mich bessern und den Code nochmal posten. Das mit der Farbe wechseln ist kein Problem, allerdings wird damit pauschal die Farbe der ganzen Matrix verändert. Was ich gerne hätte wäre, dass die ersten paar Reihen eine Farbe haben, die mittleren eine andere und die unteren wieder eine.
Danke für die Hilfe

Code: Alles auswählen

from neopixel import *
import time

# LED strip configuration:
LED_COUNT = 64          # Number of LED pixels.
LED_PIN = 18            # GPIO pin connected to the pixels (18 uses PWM!).
LED_FREQ_HZ = 800000    # LED signal frequency in hertz (usually 800khz)
LED_DMA = 5            # DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS = 105    # Set to 0 for darkest and 255 for brightest
LED_INVERT = False      # Invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0                   # set to '1' for GPIOs 13, 19, 41, 45 or 53
LED_STRIP = ws.WS2811_STRIP_GRB   # Strip type and colour ordering


def render(number, pixel_offset, strip):
    for index, char in enumerate("{0:b}".format(number).rjust(6, "0")[::-1]):
        color = Color(0, 0, 50) if char == '1' else 0
        strip.setPixelColor(pixel_offset + index, color)


if __name__ == '__main__':
    strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA,
        LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL, LED_STRIP)
    strip.begin()
    print('Press Ctrl-C to quit.')
    while True:
        t = time.localtime()
        render(t.tm_sec, 17, strip)
        render(t.tm_min, 33, strip)
        render(t.tm_hour, 49, strip)
        strip.show()
        time.sleep(500/1000.0)
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mir ist zwar nicht ganz klar, wie das ganze am Ende aussehen soll, aber uebergib doch einfach die gewuenschte Farbe als Argument an render, und benutz die uebergebene Farbe im Fall von char == '1' statt der hart kodierten Color(0, 0, 50).
Tim815
User
Beiträge: 8
Registriert: Donnerstag 17. Mai 2018, 18:13

Das ist es nicht was ich brauche, denn es würde schlicht alle LEDs anschalten.
Der Code ist für eine binäre Uhr, was bedeutet ich nutze jeweils 6 LEDs aus der 2. Reihe der Matrix um Binärwerte für die Sekunden anzuzeigen. Danach wird eine Reihe ausgelassen und in der 4. Reihe der Matrix werden weitere 6 LEDs genutzt um die Minuten in Binärform anzuzeigen. Wieder eine „Leerreihe“ und dann eine weitere mit 6 LEDs für die Stunden. Mit meinem Code haben die LEDs für Sekunden, Minuten und Stunden die unter „color =„ definierten Farbe, wenn für das betroffene LED der Wert „1“ als True zurückgegeben wird. Zur Verdeutlichung hier ein Beispiel. Um 18:15 Uhr und 5 Sekunden, ist der Status der betroffenen LEDs der Matrix dieser (ich lasse jene LEDs weg, die sich ausserhalb der 6,6,6er Reihe befinden:
000101 (5)
001111 (15)
010010 (18)

Sekunden, Minuten und Stunden sollten sich farblich unterscheiden.
Danke.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das habe ich schon verstanden. Aber du mich nicht. Du sollst nicht ALLE leds mit der gleichen Farbe bestuecken. Sondern in der Fallunterscheidung in render wird entweder Color(0, 0, 50) genommen, wenn das Bit gesetzt ist, oder schwarz wenn nicht.

Wenn du also die Farbe fuer die gesetzten Bits aendern willst, musst du die dort paramtrisierbar gestalten. Also eben an render uebergeben.

Das heisst natuerlich NICHT, dass du die Fallunterscheidung sausen lassen sollst.
Tim815
User
Beiträge: 8
Registriert: Donnerstag 17. Mai 2018, 18:13

Nun ich verstehe in der Theorie was du meist. Mein Problem, abgesehen von diesem spezifischen ist, dass ich gerade erst dabei bin, die Grundzüge des Programmierens und damit von Python zu verinnerlichen. Aus diesem Grund bin ich noch nicht in der Lage entsprechende Codezeilen zu schreiben, welche den gewünschten Effekt haben. Ich kann zwar meistens theoretisch verstehen (oder nachschlagen) was welcher Befehl, welche Funktion im Code bewirkt, bin aber noch nicht in der Lage, sinnvollen Code selbst zu schreiben. Da ich nun eine Arbeit abzuliefern habe, nämlich diese binäre Uhr, läuft mir langsam die Zeit davon und diese ist zu kurz, um Python zu verinnerlichen. Es sei angemerkt, dass es bei meiner Arbeit nicht darum geht in der Lage zu sein, Programme zu schreiben, sondern darum, das Zusammenspiel von Hardware und Programm(code) zu verstehen. Es würde mir also sehr geholfen sein, wenn ich zusätzlich zum Lösungsansatz die entsprechende Codezeile\n bekommen könnte.
Danke nochmals.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Meine Einstellung hier heißt Hilfe zur Selbsthilfe zu geben. Und nicht Hausaufgaben oder Spassprojekte frei Haus zu liefern. Denn zum einen lernst du dabei nichts, und ICH komme mir dann schlicht blöd vor. Und die meisten hier sehen das ähnlich.

Und du musst nicht alles von Python verinnerlicht haben, um diese Aufgabe zu lösen. Die Funktion bekommt bereits 3 Parameter. Einen 4 hinzuzufügen benötigt nur ein scharfes Auge. Und die Ersetzung des Parameters sowohl in dem if-Ausdruck damit er verwandt wird, als auch an den drei Aufrufstellen, ist auch kein Hexenwerk.

Wenn du dich daran probierst, wird es schon klappen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast doch schon eine Funktion geschrieben, weißt also schon, wie man Parameter übergibt, also einen mehr also offensichtlich.

Statt mit nachträglich mit rjust nullen aufzufüllen, nimm doch gleich die richtige Formatanweisung:

Code: Alles auswählen

"{:06b}".format(number)
oder rechne es Dir einfach aus dem Index aus:

Code: Alles auswählen

if (number >> index) & 1
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

@Sirius3: geschrieben hat er nix, das ist von hier: https://github.com/mattiasjahnke/rpi-bi ... ryclock.py
Tim815
User
Beiträge: 8
Registriert: Donnerstag 17. Mai 2018, 18:13

Stell mich nur bloß ;-) Ja es stimmt, ich habe den Code nicht selbst geschrieben. Ich verstehe jedoch, was er beinhaltet und konnte die Parameter entsprechend anpassen, dass das Ding meinen Wünschen entsprechend auf der Matrix läuft. Wie bereits gesagt, meine Aufgabe besteht nicht darin, Python zu erlernen, auch wenn ich es spannend fände und es mich sehr reizen würde. Irgendwann werde ich mich auch dahinter klemmen aber im Moment fehlt dazu schlichtweg die Zeit. Ich bedanke mich für die Hilfe und werde nun die Codeschnipsel in mein Programm einfügen und mal sehen ob ich es hinkriege. Danke auf jeden Fall.
Tim815
User
Beiträge: 8
Registriert: Donnerstag 17. Mai 2018, 18:13

Noch etwas zur Präzisierung zum Kommentar von _deets_. Ich sehe das im Prinzip gleich, Hilfe zur Selbsthilfe. Nur in diesem Fall geht es nicht darum Python zu beherrschen sondern Zusammenhänge zwischen Hardware und Software zu verstehen. Dass Code en masse im Netz zu finden ist weiss jeder Dozent. Es war meine persönliche Challenge meine Uhr dreifarbig zu gestalten und habe auch eine Weile herum probiert, eine Menge Tutorials über Python studiert und schlussendlich bemerkt, dass es doch mehr Zeit kostet als mir zur Verfügung steht.
Tim815
User
Beiträge: 8
Registriert: Donnerstag 17. Mai 2018, 18:13

Also Freunde der Blasmusik. Schlussendlich ist es mir doch gelungen, das Ding zum Laufen zu bringen, nach meinen Vorstellungen. Schlussendlich habe ich meine einfache und pragmatische Lösung selbst entdeckt, die so aussieht:

Code: Alles auswählen

from neopixel import *
import time

# LED strip configuration:
LED_COUNT = 64          # Number of LED pixels.
LED_PIN = 18            # GPIO pin connected to the pixels (18 uses PWM!).
LED_FREQ_HZ = 800000    # LED signal frequency in hertz (usually 800khz)
LED_DMA = 5            # DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS = 105    # Set to 0 for darkest and 255 for brightest
LED_INVERT = False      # Invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0                   # set to '1' for GPIOs 13, 19, 41, 45 or 53
LED_STRIP = ws.WS2811_STRIP_GRB   # Strip type and colour ordering


def render1(number, pixel_offset, strip):
    for index, char in enumerate("{0:b}".format(number).rjust(6, "0")[::-1]):
        color = Color(0, 0, 50) if char == '1' else 0
        strip.setPixelColor(pixel_offset + index, color)

def render2(number, pixel_offset, strip):
    for index, char in enumerate("{0:b}".format(number).rjust(6, "0")[::-1]):
        color = Color(0, 50, 0) if char == '1' else 0
        strip.setPixelColor(pixel_offset + index, color)

def render3(number, pixel_offset, strip):
    for index, char in enumerate("{0:b}".format(number).rjust(6, "0")[::-1]):
        color = Color(222, 222, 222) if char == '1' else 0
        strip.setPixelColor(pixel_offset + index, color)


if __name__ == '__main__':
    strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA,
        LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL, LED_STRIP)
    strip.begin()
    print('Press Ctrl-C to quit.')
    while True:
        t = time.localtime()
        render1(t.tm_sec, 17, strip)
        render2(t.tm_min, 33, strip)
        render3(t.tm_hour, 49, strip)
        strip.show()
        time.sleep(500/1000.0)
Ganz nach den Vorstellungen, nichts gestohlen :lol: . Vielen Dank euch trotzdem.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Und statt drei identische Funktionen zu schreiben, kannst Du auch einfach einen Parameter benutzen:

Code: Alles auswählen

import time
from datetime import datetime as DateTime
from neopixel import Adafruit_NeoPixel, Color

# LED strip configuration:
LED_COUNT = 64          # Number of LED pixels.
LED_PIN = 18            # GPIO pin connected to the pixels (18 uses PWM!).
LED_DMA = 5             # DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS = 105    # Set to 0 for darkest and 255 for brightest

def render(strip, number, pixel_offset, color):
    for index, in range(6):
        strip.setPixelColor(
            pixel_offset + index,
            color if (number >> index) & 1 else 0)

def main()
    strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, dma=LED_DMA,
        brightness=LED_BRIGHTNESS)
    strip.begin()
    print('Press Ctrl-C to quit.')
    while True:
        t = DateTime.now()
        render(strip, t.second, 17, Color(0, 0, 50))
        render(strip, t.minute, 33, Color(0, 50, 0))
        render(strip, t.hour, 49, Color(222, 222, 222))
        strip.show()
        time.sleep(0.5)

if __name__ == '__main__':
    main()
Tim815
User
Beiträge: 8
Registriert: Donnerstag 17. Mai 2018, 18:13

Danke dir. Es war mir bewusst, dass meine Lösung nicht die schlankste war. Ich hatte deine Anregungen aufgegriffen und eine Weile probiert. Zum Teil hat es sogar mit deinem Code jetzt übereingestimmt. Allerdings natürlich nicht komplett, weshalb ich immer wieder Fehlermeldungen bekommen hatte. Das lag unter anderem sicher daran, dass ich entsprechende Bibliotheken nicht importiert habe. Aber wie soll man auch in vier Wochen eine Programmiersprache erlernen, die erste Programmiersprache?
Antworten