Mehrere LED`s ansteuern

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Nasenbär77
User
Beiträge: 4
Registriert: Donnerstag 18. August 2022, 11:33

Hallihallo,

Ich bin gerade dabei animierte Sequenzen über eine selbstgebaute LED Matrix ab zu spielen.
Hierzu habe ich einen LED Strip in 10 x 15 Dots augeteilt und versuche diese über pytoh mit Leben zu befüllen.
Ich gehe hier über einzelne Programm-Teile, die ich danach zusammen setze:

Code: Alles auswählen

def water(): # Wellenbewegung
    strip = Adafruit_NeoPixel(TOTAL_LED_COUNT, LED_STRIP_PIN, dma=5)
    GPIO.setmode(GPIO.BCM)
    strip.begin()
    for leds, duration in LED_PROGRAM_WATER:
        for led, color in leds:
            strip.setPixelColor(led, color)
        strip.show()
        time.sleep(duration)
Nun ists allerdings relativ anstrengend immer JEDE einzelne LED bei einer Animation in die Zeilen zu schreiben. Deshalb meine Frage:

Kann ich im Programm LED`s in folgender Zeile Zusammenfassen (z.B. LED 140 - 149)?:

Code: Alles auswählen

    ([(140, BLACK), (141, BLACK), (142, BLACK), (143, BLACK), (144, BLACK), (145, BLACK), (146, BLACK), (147, BLACK), (148, BLACK), (149, BLACK), (130, BLACK), (131, BLACK), (132, BLACK), (133, BLACK), (134, BLACK), (135, BLACK), (136, BLACK), (137, BLACK), (138, BLACK), (139, BLACK), (120, BLACK), (121, BLACK), (124, BLACK), (125, BLACK), (126, BLACK), (129, BLACK), (114, BLACK), (119, BLACK),], 0.1),
Danke schonmal für die Antworten und einen schönen Sonntag :)

Chris
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

So ein "Zusammenfassen" mußt Du halt programmieren, indem Du zum Beispiel statt einer Zahl für die LED ein iterierbares Objekt speicherst, z.B. range(140,150) und das dann in der for-Schleife berücksichtigst.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Nasenbär77: Das klingt jetzt so als würdest Du die Funktion mehrfach kopieren, umbenennen und die Konstante anpassen in der das ”LED-Programm” steht. Gewöhn Dir so etwas gar nicht erst an. Als Programmierer vermeidet man das wiederholen von Code und Daten. Und gerade Funktionen sind ein Mittel um das zu tun.

*Eine* Funktion, die verschiedene ”LED-Programme” abspielen kann, könnte so aussehen:

Code: Alles auswählen

def play_animation(strip, steps):
    for leds, duration in steps:
        for led, color in leds:
            strip.setPixelColor(led, color)
        strip.show()
        time.sleep(duration)
Aufruf dann mit:

Code: Alles auswählen

def main():
    GPIO.setmode(GPIO.BCM)
    strip = Adafruit_NeoPixel(TOTAL_LED_COUNT, LED_STRIP_PIN, dma=5)
    strip.begin()
    play_animation(strip, LED_PROGRAM_WATER)
    play_animation(strip, LED_PROGRAM_FIRE)
Wobei mir persönlich das erstellen von Animationen auf diese Art für 150 Pixel zu umständlich wäre. Da würde man eher schauen, dass man das mit einem Grafikprogramm macht, beispielsweise als GIF und dann Code schreiben, der das GIF lädt und abspielt.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich finde die Idee mit GIF interessant und habe mal etwas gegooglt. Auslesen könnte man die Datei dann mit imageio. Oder gibt es was sinnvolleres?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`PIL`/Pillow wäre so traditionell eine erste Anlaufstelle. Falls `tkinter` verfügbar und anwendbar ist, könnte man auch damit (mit ein bisschen tricksen weil `PhotoImage` die `index`-Option nicht kennt) die Daten lesen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten