Programmschleife erstellen

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

Vorab ein "Sorry" da die Antwort auf die Frage warscheinlich extrem simpel ist, aber ich beiße mir die Zähne an dem Thema aus.
Ich habe ein simples script zum ansteuern eines LED Stripes erstellt (Vermutlich lässt sich elbst dieses auf einige wenige Zeilen herunterbrechen, aber zumindest funktioniert es ;)) und hätte gerne, das dieses Skript sich unendlich wiederholt, bis ich Strg-C eingebe:

import time
from rpi_ws281x import *
import argparse
TOTAL_LED_COUNT = 150
strip = Adafruit_NeoPixel(TOTAL_LED_COUNT, 18, 800000, 5, False, 255)
strip.begin()
strip.setPixelColorRGB(1, 255, 255, 255)
strip.show()
time.sleep(5) # Sleep for 5 seconds
strip.setPixelColorRGB(1, 0, 0, 0)
time.sleep(1) # Sleep for 1 seconds
strip.setPixelColorRGB(2, 255,0, 255)
strip.show()
time.sleep(1) # Sleep for 1 seconds
strip.setPixelColorRGB(2, 0, 0, 0)
time.sleep(1) # Sleep for 1 seconds
strip.setPixelColorRGB(3, 255,0, 0)
strip.show()
time.sleep(1) # Sleep for 1 seconds
strip.setPixelColorRGB(3, 0, 0, 0)
time.sleep(1) # Sleep for 1 seconds
strip.setPixelColorRGB(4, 255,0, 0)
strip.show()
strip.setPixelColorRGB(5, 255,255, 0)
strip.show()
strip.setPixelColorRGB(6, 255,255, 255)
strip.show()
time.sleep(5) # Sleep for 5 seconds
strip.setPixelColorRGB(4, 0,0, 0)
strip.setPixelColorRGB(5, 0,0, 0)
strip.setPixelColorRGB(6, 0,0, 0)
time.sleep(7) # Sleep for 7 seconds
strip.setPixelColorRGB(147, 255,0, 0)
strip.setPixelColorRGB(148, 255,0, 0)
strip.setPixelColorRGB(149, 255,0, 0)
strip.show()
time.sleep(3) # Sleep for 3 seconds
strip.setPixelColorRGB(147, 0,0, 0)
strip.setPixelColorRGB(148, 0,0, 0)
strip.setPixelColorRGB(149, 0,0, 0)
strip.show()

Wo muss ich hier welche Zeilen einfügen, das sich das Skript endlos wiederholt?
Danke schonmal für die Antworten.

BG

Chris
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Das Python Tutorial aus der offiziellen Dokumentation ist ein super Eintieg um die Sprache zu lernen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Nasenbär77 hat geschrieben: Donnerstag 18. August 2022, 11:42 Vorab ein "Sorry" da die Antwort auf die Frage warscheinlich extrem simpel ist, aber ich beiße mir die Zähne an dem Thema aus.
Es bringt dir absolut nichts, wenn wir einfach die Lösung hier posten.
Du suchst nach `while`.

Die Farben können in eine Liste und dadurch kannst du Code deduplizieren.

Code: Alles auswählen

import time

# nur 2 Farben
rgbw_sleep = [
    (1, 255, 255, 255, 5),
    (1, 0, 0, 0 ,1),
    (2, 0, 0, 0, 5),
]

# strip initialisieren

while True:
    for *color, delay in rgbw_sleep:
        print(color)
        
        # strip.setPixelColorRGB(*color)
        # strip.show()
        
        print("Sleeping", delay, "seconds")
        time.sleep(delay)

Wichtig ist auch immer, welche Datenstruktur man verwendet. Am besten wählt man eine Datenstruktur, die einem die Verbreitung der Daten so einfach wie möglich macht.
Dafür musst du aber die Basics kennen (Datentypen wie z.B. dict, set, tuple, list. Verschachteln kann man auch noch.

Wildcard-Imports beißen einen irgendwann in den Hintern und müllen die Modulebene zu.

Code: Alles auswählen

from rpi_ws281x import *

Richtig wäre z.B.:

Code: Alles auswählen

from rpi_ws281x import Adafruit_NeoPixel
Dann kann man auf Modulebene direkt auf Adafruit_NeoPixel zugreifen, ohne rpi_ws281x davor und es wird auch nichts Weiteres von rpi_ws281x auf Modulebene zugewiesen.

Nicht verwendete Imports (argparse) entfernen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Nasenbär77
User
Beiträge: 4
Registriert: Donnerstag 18. August 2022, 11:33

Danke für die schnellen Antworten.
Das Tuorial hatte ich schon versucht, aber auch hier hapert es an den Basics (Wo füge ich wann was ein):(
Ich bin zwar aus der IT Branche, aber Programmieren war bis jetzt kein "Need".
Da wollte ich mich einfach mal Hobbymäßig reinspielen, da ich das Thema interessant finde.
Dann starte ich "from the scratch" und schau mal wie weit ich komme :)
Anyway..... Morgen kommt mein Python3 Einsteiger-Wälzer und wurste mich da mal durch.
Vermutlich steh ich einfach nur auf dem Schlauch ;)
Schönen Abend in die Runde....
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Nasenbär77: Ergänzende Anmerkungen zu dem was schon gesagt wurde: Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht. Bei den vorhandenen „sleep“-Kommentaren ist besonders ungünstig, dass da immer noch mal die Sekundenanzahl wiederholt wird. Das heisst wenn man die ändert muss man immer Code und Kommentar anpassen. Macht man das nicht, hat man einen Kommentar der nicht nur keinen Mehrwert hat, sondern auch noch dem Code widerspricht und der Leser weiss dann nicht ob der Code oder der Kommentar falsch ist, und der Kommentar erreicht das Gegenteil von dem wofür Kommentare gedacht sind. Er klärt dann keine Fragen, sondern wirft neue auf.

Einige `sleep()`-Aufrufe stehen an komischen Stellen. Die Änderungen an den LEDs werden ja erst sichtbar, wenn `show()` aufgerufen wird. Also macht es keinen Sinn `sleep()` zum Beispiel zwischen dem setzen von Farben aufzurufen, wo aber gar kein `show()` steht. Beispiel:

Code: Alles auswählen

        strip.show()
        time.sleep(5)
        strip.setPixelColorRGB(1, 0, 0, 0)
        time.sleep(1)
        strip.setPixelColorRGB(2, 255, 0, 255)
        strip.show()
Zwischen den beiden `show()`-Aufrufen wird insgesamt 6 Sekunden gewartet. Es macht den Code unnötig unregelmässig diese Zeit auf zwei `sleep()`-Aufrufe zu verteilen. Der Leser muss das erkennen und selbst die Zeiten addieren um zu verstehen wie der Zeitablauf ist. Warum wird das so gemacht? Der Code könnte/sollte so aussehen:

Code: Alles auswählen

        strip.show()
        time.sleep(6)
        strip.setPixelColorRGB(1, 0, 0, 0)
        strip.setPixelColorRGB(2, 255, 0, 255)
        strip.show()
Die Regelmässigkeit braucht man auch um den Ansatz von DeaD_EyE umzusetzen, das nicht als Code auszudrücken, sondern als Daten mit ein bisschen Code der die dann ”abspielt”.

Da es sich bei den Farben um welche handelt die ”bekannt” sind, würde es Sinn machen da Konstanten für zu definieren.

Das Programm könnte dann so aussehen (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import time

from rpi_ws281x import Adafruit_NeoPixel, Color

TOTAL_LED_COUNT = 150
LED_STRIP_PIN = 18

BLACK = Color(0, 0, 0)
RED = Color(255, 0, 0)
MAGENTA = Color(255, 0, 255)
WHITE = Color(255, 255, 255)
YELLOW = Color(255, 255, 0)
#
# Program steps made of LED numbers and colors, and a duration in seconds.
#
LED_PROGRAM = [
    ([(1, WHITE)], 6),
    ([(1, BLACK), (2, MAGENTA)], 2),
    ([(2, BLACK), (3, RED)], 2),
    ([(3, BLACK), (4, RED)], 0),
    ([(5, YELLOW)], 0),
    ([(6, WHITE)], 2),
    (
        [
            (4, BLACK),
            (5, BLACK),
            (6, BLACK),
            (147, RED),
            (148, RED),
            (149, RED),
        ],
        3,
    ),
    ([(147, BLACK), (148, BLACK), (149, BLACK)], 0),
]


def main():
    strip = Adafruit_NeoPixel(TOTAL_LED_COUNT, LED_STRIP_PIN, dma=5)
    strip.begin()
    for leds, duration in LED_PROGRAM:
        for led, color in leds:
            strip.setPixelColor(led, color)
        strip.show()
        time.sleep(duration)


if __name__ == "__main__":
    main()
Wobei sich hier noch die Frage stellt, ob die Schritte mit 0 Sekunden Dauer nicht auch zusammengefasst werden können/sollten. Ausgenommen vielleicht der letzte Schritt.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Nasenbär77
User
Beiträge: 4
Registriert: Donnerstag 18. August 2022, 11:33

Super, Danke... funzt :)

Jetz muss ich nur noch den Code aufdröseln um auch zu kapieren, wie das funktioniert ;)
Antworten