Hallo an alle,
ich habe mich seit kurzem mit Python beschäftigt und bastle an einem LED Streifen, welches verschiedene Laufmuster hat. Mein Programm hat 3 Laufmuster:
1= Eine LED wandert von links nach rechts
2 = eine LED wandert von rechts nach links
3 = eine LED wandert ständig hin und her.
Bis jetzt ist es so, dass ich die Laufrichtung als Konstante konfiguriert habe und ständig im Editor die Konstante ändern muss für eine andere Laufrichtung. Nun möchte ich, während das Programm läuft mit einer Tastatureingabe in der endlosen while-Schleife ein break setze und das Programm mich erneut fragt, welche Laufrichtung ich nun habe möchte.
Bis jetzt konnte ich das Programm nur mit Ctrl-c stoppen. Jedoch soll es mit return eine neue input Frage der Konstante machen.
Falls es was im Thread dazu gibt, würde ich mich über einen Link freuen.
Mit freundlichen Grüßen
Cedes
Mit Tastatureingabe While-Schleife beenden
Ok, dann habe ich das wohl missverstanden. Ich habe mich aber auch erst seit einer Woche mit Python beschäftigt. Wie würde ein einfacher Code aussehen, wo ich die Tasten 1,2 und 3 definiere, welcher dann die while-Hauptschleife beeinflussen kann? Ggf. würde ich mich auch über eine Bibliothek für RPI freuen f, wo ich dann selbst den Quellcode auslesen kann.
Leider kann ich meinen Beitrag nicht mehr Edititieren, sorry für Doppel-Post.
Ich habe jetzt die Bilbiothek 'from getkey import getkey, keys' gefunden. Dies ist ein Auszug der Bibliothek:
Die Konstante bei mir heißt Laufrichtung=1 ,2 oder 3 je nachdem was ich einsetze. Nun habe ich mir überlegt zu sagen:
Wäre es Richtig, wenn ich in der Konstante schreiben würde: Laufrichtung = getkey() ?
Ich habe jetzt die Bilbiothek 'from getkey import getkey, keys' gefunden. Dies ist ein Auszug der Bibliothek:
Code: Alles auswählen
key = getkey()
ifrom getkey import getkey, keys
key = getkey()
if key == keys.UP:
... # Handle the UP key
elif key == keys.DOWN:
... # Handle the DOWN key
elif key == 'a':
... # Handle the `a` key
elif key == 'Y':
... # Handle `shift-y`
else:
# Handle other text characters
buffer += key
print(buffer)
Die Konstante bei mir heißt Laufrichtung=1 ,2 oder 3 je nachdem was ich einsetze. Nun habe ich mir überlegt zu sagen:
Code: Alles auswählen
if key == keys.UP:
Laufrichtung=1
elif key == keys. DOWN:
Laufrichtung=2
usw...
Wen ein Name verschiedene Werte annimmt, dann ist es eine Variable. Und keine Konstante. Und wird klein_geschrieben. Um ihn von GROSSGESCHRIEBENEN echten Konstanten zu unterscheiden.
Und dein Plan geht nicht auf. Irgendwo einmal getkey() hinschreiben fúhrt das auch nur genau 1-mal aus. Und getkey liefert doch auch nicht die von dir geforderten Werte 1-3. Du musst schon die gewünschte Logik programmieren, also zb KEY_UP geht in eine Richtung, oder Tasten 1, 2, 3 wählen den Betriebsmodus aus.
Und dein Plan geht nicht auf. Irgendwo einmal getkey() hinschreiben fúhrt das auch nur genau 1-mal aus. Und getkey liefert doch auch nicht die von dir geforderten Werte 1-3. Du musst schon die gewünschte Logik programmieren, also zb KEY_UP geht in eine Richtung, oder Tasten 1, 2, 3 wählen den Betriebsmodus aus.
Ich habe nun den Code von meinem Raspberry Pi Lite OS abgetippt und sieht bis jetzt so aus:
Ich habe es geschafft, dass ich die LED durch drücken von a nach rechts bewegen kann und durch drücken von s bewegt es sich nach links. Jedoch muss ich ständig die Befehle ausführen, da es nicht automatisch abläuft.
Meine Frage wäre. wie bekomme ich es hin dass es automatisch durchläuft bis es durch drücken der Taste a bzw. s zu einem Wechsel kommt?
Code: Alles auswählen
from getkey import getkey, keys
import time
from rpi_ws281x import *
import argparse
LED_COUNT = 20 # 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 = 10 # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
Laufrichtung = [1,2,3]
Anzahl_Punkte = 1
LED_Start = [0,16,18]
LED_Ende = [14,17,19]
LED_Pause = 0.3
LED_Lauf = [1,1,1]
i = [1,1,1]
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit')
args = parser.parse_args()
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
print ('Press Ctrl-C to quit.')
if not args.clear:
print('Use "-c" argument to clear LEDs on exit')
try:
for n in range(0, Anzahl_Punkte):
i[n]=LED_Start[n]
LED_Lauf[n]=1
if Laufrichtung[n]==(2):
LED_Lauf[n]=-1
while True:
key = getkey()
if key == 'a'
Laufrichtung[0]=1
LED_Lauf[0]=1
elif key == 's':
LED_Lauf[0]=-1
for n in range (0, Anzahl_Punkte):
if i[n]>LED_ENDE[n]-1 and LED_Lauf[n]==1:
strip.setPixelColor(LED_Ende[n], Color(20,20,20))
strip.setPixelColor(LED_Start[n], Color (30,30,0))
strip.show()
time.sleep(LED_Pause)
if Laufrichtun[n]==(3):
LED_Lauf[n]=-1
strip.setPixelColor(LED_Start[n], Color(0,0,0))
else:
strip.setPixelColor(LED_Ende[n], Color(0,0,0))
i[n]=LED_Start[n]
elif i[n]<LED_Start[n]+1 and LED_Lauf[n]=-1:
strip.setPixelColor(LED_Ende[n], Color(30,30,0))
strip.setPixelColor(LED_Start[n], Color (20,20,20))
strip.show()
time.show()
time.sleep(LED_Pause)
if Laufrichtung[n]==3:
LED_Lauf[n]=1
strip.setPixelColor(LED_Ende[n], Color(0,0,0))
else:
strip.setPixelColor(LED_Start[n], Color (0,0,0))
i[n]=LED_Ende[n]
else:
strip.setPixelColor(i[n], Color(20,20,20))
strip.setPixelColor(i[n]+LED_Lauf[n], Color(30,30,0))
strip.show()
time.sleep(LED_Pause)
strip.setPixelColor(i[n], Color(0,0,0))
i[n]+=LED_Lauf[n]
except KeyboardInterrupt:
if args.clear:
colorWipe(strip, Color(0,0,0), 10)
Meine Frage wäre. wie bekomme ich es hin dass es automatisch durchläuft bis es durch drücken der Taste a bzw. s zu einem Wechsel kommt?
- __blackjack__
- User
- Beiträge: 14047
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Cedes63a: Der Code ist nicht lauffähig. Der kommt nicht einmal am Compiler vorbei. Und wenn Du die Einrückung so korrigierst, dass sie am Compiler vorbei kommt, könntest Du bitte auch gleich sauber einrücken — vier Leerzeichen pro Ebene.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Funktionen und Variablennamen schreibt man komplett kein. Konstanten dagegen komplett GROSS.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 1, 3, 4 oder 5. Die Einrückungen sind auch kaputt, so dass das Programm gar nicht am Compiler vorbeikommt.
Wie welcher if, elif oder else-Zweig betreten wird, hängt von der Einrückung ab, und die ist falsch.
`LED_ENDE` wird gar nicht definiert. Ein time.show gibt es auch nicht.
Statt Daten in parallelen Listen zu speichern würde man komplexere Datenstrukturen in EINER Liste speichern.
Solange das Programm gar nicht lauffähig ist, macht es wenig Sinn, es zu erweitern.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 1, 3, 4 oder 5. Die Einrückungen sind auch kaputt, so dass das Programm gar nicht am Compiler vorbeikommt.
Wie welcher if, elif oder else-Zweig betreten wird, hängt von der Einrückung ab, und die ist falsch.
`LED_ENDE` wird gar nicht definiert. Ein time.show gibt es auch nicht.
Statt Daten in parallelen Listen zu speichern würde man komplexere Datenstrukturen in EINER Liste speichern.
Solange das Programm gar nicht lauffähig ist, macht es wenig Sinn, es zu erweitern.
Vielen Dank für die Antwort. Ich nutze die Konsole leider auf dem Raspberry Pi Lite und kann daher nicht den Code direkt hier im Forum implementieren. Daher habe ich es abgeschrieben. Auf meinem Raspberry Pi Läuft der Code. Ich habe das alles auf meinem iPad abgetippt und daher sind die Zeilen etwas verrutscht. Ich habe nochmal den Code hier nochmal überarbeitet:
Ich hoffe es klappt jetzt. Das mit den vier Zeilen Leerzeichen Abstand habe ich noch nicht ganz verstanden. Bei der RPI Lite Version funktioniert es auch mit einem Leerzeichen.
EDIT: Code nochmal verbessert
Code: Alles auswählen
from getkey import getkey, keys
import time
from rpi_ws281x import *
import argparse
LED_COUNT = 20 # 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 = 10 # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
Laufrichtung = [1,2,3]
Anzahl_Punkte = 1
LED_Start = [0,16,18]
LED_Ende = [14,17,19]
LED_Pause = 0.3
LED_Lauf = [1,1,1]
i = [1,1,1]
KEY_S = 83
KEY_F = 70
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit')
args = parser.parse_args()
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
print ('Press Ctrl-C to quit.')
if not args.clear:
print('Use "-c" argument to clear LEDs on exit')
try:
for n in range(0, Anzahl_Punkte):
i[n]=LED_Start[n]
LED_Lauf[n]=1
if Laufrichtung[n]==(2):
LED_Lauf[n]=-1
while True:
key = getkey()
if key == 'a':
Laufrichtung[0]=1
LED_Lauf[0]=1
elif key == 's':
LED_Lauf[0]=-1
for n in range (0, Anzahl_Punkte):
if i[n]>LED_ENDE[n]-1 and LED_Lauf[n]==1:
strip.setPixelColor(LED_Ende[n], Color(20,20,20))
strip.setPixelColor(LED_Start[n], Color (30,30,0))
strip.show()
time.sleep(LED_Pause)
if Laufrichtung[n]==(3):
LED_Lauf[n]=-1
strip.setPixelColor(LED_Start[n], Color(0,0,0))
else:
strip.setPixelColor(LED_Ende[n], Color(0,0,0))
i[n]=LED_Start[n]
elif i[n]<LED_Start[n]+1 and LED_Lauf[n]==-1:
strip.setPixelColor(LED_Ende[n], Color(30,30,0))
strip.setPixelColor(LED_Start[n], Color (20,20,20))
strip.show()
time.show()
time.sleep(LED_Pause)
if Laufrichtung[n]==3:
LED_Lauf[n]=1
strip.setPixelColor(LED_Ende[n], Color(0,0,0))
else:
strip.setPixelColor(LED_Start[n], Color (0,0,0))
i[n]=LED_Ende[n]
else:
strip.setPixelColor(i[n], Color(20,20,20))
strip.setPixelColor(i[n]+LED_Lauf[n], Color(30,30,0))
strip.show()
time.sleep(LED_Pause)
strip.setPixelColor(i[n], Color(0,0,0))
i[n]+=LED_Lauf[n]
except KeyboardInterrupt:
if args.clear:
colorWipe(strip, Color(0,0,0), 10)
EDIT: Code nochmal verbessert
- __blackjack__
- User
- Beiträge: 14047
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Cedes63a: Natürlich funktioniert es auch mit einem Leerzeichen. Für den Rechner. Aber nicht für menschliche Leser. Vier Leerzeichen ist eine Konvention an die man sich hält, oder eben das Problem hat, das weniger Leute bereit sind sich das durchzulesen. Es mag einerseits nach einer pedantischen Kleinigkeit klingen, aber andererseits ist es *einfach* diese Konvention umzusetzen. Darum wird das auch immer wieder als Kritikpunkt kommen wenn sich da jemand nicht dran hält.
Du solltest als ersten Schritt lernen wie Du den tatsächlichen Quelltext vom Raspi 1:1 herunter bekommst *ohne* ihn abzutippen. Das ist unnötige Arbeit und eine unnötige Fehlerquelle.
Da sind noch Anmerkungen von Sirius3 die noch nicht umgesetzt wurde.
Auch wenn es *sehr* wahrscheinlich ist, dass er mit der Bemerkung zu `time.show()` recht hat, kann man das gar nicht so sicher sagen weil Du einen *-Import machst. Das sollte man nicht. Unter anderem aus diesem Grund — man kann dann überhaupt nicht mehr so leicht sagen was es danach gibt und was nicht.
Du solltest als ersten Schritt lernen wie Du den tatsächlichen Quelltext vom Raspi 1:1 herunter bekommst *ohne* ihn abzutippen. Das ist unnötige Arbeit und eine unnötige Fehlerquelle.
Da sind noch Anmerkungen von Sirius3 die noch nicht umgesetzt wurde.
Auch wenn es *sehr* wahrscheinlich ist, dass er mit der Bemerkung zu `time.show()` recht hat, kann man das gar nicht so sicher sagen weil Du einen *-Import machst. Das sollte man nicht. Unter anderem aus diesem Grund — man kann dann überhaupt nicht mehr so leicht sagen was es danach gibt und was nicht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Danke für die Kritik. Ich werde beim nächsten mal daran denken und als Anfänger bedanke ich mich für die Tipps. Ich habe keinen SD Karten Slot Reader vor mir, deshalb konnte ich nicht das einfach so rüber ziehen. Ehrlichgesagt bin ich auch nicht so Fit in Programmieren und habe mich gerade mal 1,5 Wochen damit beschäftigt. Ich würde mich dennoch freuen, wenn ich eine Antwort auf meine Frage bekommen würde, ob ich das ganze in meinem Code Automatisieren könnte, sodass ich durch Tastenbefehle die Richtung ändern kann.
LED_Ende wurde als Konstante festgelegt und sagt mir bis wohin ich im LED Strang die LED ansteuern möchte. strip.show() wurde aus der rpi Bibliothek importiert.
LED_Ende wurde als Konstante festgelegt und sagt mir bis wohin ich im LED Strang die LED ansteuern möchte. strip.show() wurde aus der rpi Bibliothek importiert.
Ich entschuldige mich... time.show() gehört nicht in den Code und sollte vernachlässigt werden.Cedes63a hat geschrieben: Donnerstag 12. November 2020, 16:00 Danke für die Kritik. Ich werde beim nächsten mal daran denken und als Anfänger bedanke ich mich für die Tipps. Ich habe keinen SD Karten Slot Reader vor mir, deshalb konnte ich nicht das einfach so rüber ziehen. Ehrlichgesagt bin ich auch nicht so Fit in Programmieren und habe mich gerade mal 1,5 Wochen damit beschäftigt. Ich würde mich dennoch freuen, wenn ich eine Antwort auf meine Frage bekommen würde, ob ich das ganze in meinem Code Automatisieren könnte, sodass ich durch Tastenbefehle die Richtung ändern kann.
LED_Ende wurde als Konstante festgelegt und sagt mir bis wohin ich im LED Strang die LED ansteuern möchte. strip.show() wurde aus der rpi Bibliothek importiert.
- __blackjack__
- User
- Beiträge: 14047
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Cedes63a: `LED_Ende` ist nicht das Problem, `LED_ENDE` ist undefiniert. Beziehungsweise halt falsch geschrieben. Beziehungsweise eigentlich richtig geschrieben, denn `LED_Ende` sollte als Konstante so geschrieben werden.
Per SD-Karte wäre ja auch noch reichlich umständlich. Normalerweise macht man das über das Netzwerk, beispielsweise per SCP, oder man erstellt auf dem Raspi eine Freigabe über die man dann vom PC aus zugreifen kann.
Per SD-Karte wäre ja auch noch reichlich umständlich. Normalerweise macht man das über das Netzwerk, beispielsweise per SCP, oder man erstellt auf dem Raspi eine Freigabe über die man dann vom PC aus zugreifen kann.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari