Tomaten auf den Augen

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
Straggle
User
Beiträge: 13
Registriert: Sonntag 27. September 2020, 16:42

Kurze Frage:
Bin mit meinem Quelltext jetzt am Ende. Sehe den Fehler nicht.
Anbei der Quelltext. Wieso wird mir der Text Next niht in der Konsole angezeigt, bzw. wieso wir die in range(90) Schleife nach 9 Sekunden nicht mit der Consolenausgabe Next neu gestartet?

Code: Alles auswählen

import RPi.GPIO as GPIO
import time
import sys
import termios
import tty

inkey_buffer = 1

def inkey():
    fd=sys.stdin.fileno()
    remember_attributes=termios.tcgetattr(fd)
    tty.setraw(sys.stdin.fileno())
    character=sys.stdin.read(inkey_buffer)
    termios.tcsetattr(fd,termios.TCSADRAIN, remember_attributes)
    return character

#GPIO Modus (BOARD / BCM)
GPIO.setmode(GPIO.BCM)

#Warnungen ausschalten
GPIO.setwarnings(False)

#GPIO Pin Belegung
ROT = 17
GRUEN = 22
Hupe = 13

#Richtung der GPIO-Pins
GPIO.setup(ROT, GPIO.OUT) #rot
GPIO.setup(GRUEN, GPIO.OUT) #gruen
GPIO.setup(Hupe, GPIO.OUT) #Hupe

while 1:
    print("Start2")
    GPIO.output(ROT, True)
    GPIO.output(GRUEN, False)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(10)
    GPIO.output(ROT, False)
    GPIO.output(GRUEN, True)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    print ("for g schleife")
    for g in range(90):
        sys.stdin.flush()
        key = inkey()
        if key == 's' :
            break
        else:
            time.sleep(0.1)
    print ("Next")
Bin für jede Hilfe dankbar. o)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Das `as` bei `import` ist zum Umbenennen da, GPIO wird aber gar nicht umbenannt. Was hast Du Dir dabei gedacht, das so zu schreiben?
Warnungen sind dazu da, dass man sie behebt, nicht dass man sie ignoriert. Dazu muß am Ende des Programms aber auch verläßlich GPIO.cleanup aufgerufen werden, am Besten in einem finally-Block.
`inkey_buffer` scheint eine Konstante zu sein, sollte also auch als solche geschrieben werden.
`Hupe` ist aus dem Grund auch falsch geschrieben.
Es gibt True in Python, eine Endlosschleife sollte man also nicht mit 1 schreiben.
`inkey` wartet so lange, bis eine Taste gedrückt wurde. Du mußt also 90 Tasten drücken, bevor es weitergeht.
Straggle
User
Beiträge: 13
Registriert: Sonntag 27. September 2020, 16:42

Ok, hab vielleicht zu wenig Infos gebracht.
Der Ursprümgliche Code lautet:

Code: Alles auswählen

import RPi.GPIO as GPIO
import time
import sys
import termios
import tty

inkey_buffer = 1

def inkey():
    fd=sys.stdin.fileno()
    remember_attributes=termios.tcgetattr(fd)
    tty.setraw(sys.stdin.fileno())
    character=sys.stdin.read(inkey_buffer)
    termios.tcsetattr(fd,termios.TCSADRAIN, remember_attributes)
    return character

#GPIO Modus (BOARD / BCM)
GPIO.setmode(GPIO.BCM)

#Warnungen ausschalten
GPIO.setwarnings(True)

#GPIO Pin Belegung
ROT = 17
GELB = 27
GRUEN = 22
Hupe = 13
AB = 5
CD = 6
LED = 4

#LED-Leuchte init
l = False

#Richtung der GPIO-Pins
GPIO.setup(ROT, GPIO.OUT) #rot
GPIO.setup(GELB, GPIO.OUT) #gelb
GPIO.setup(GRUEN, GPIO.OUT) #gruen
GPIO.setup(Hupe, GPIO.OUT) #Hupe
GPIO.setup(AB, GPIO.OUT) #AB
GPIO.setup(CD, GPIO.OUT) #CD
GPIO.setup(LED, GPIO.OUT) #LED-Strahler

def notfall():
    sys.stdin.flush()
    GPIO.output(ROT, True)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, False)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    GPIO.output(AB, False)
    GPIO.output(CD, False)
    time.sleep(10)

def Trefferaufnahme():
    key = inkey()
    if key == 't' :
        sys.stdin.flush()
    else:
        time.sleep(0.2)
        Trefferaufnahme()

def Lichtan():
    GPIO.output(LED, True)

def Lichtaus():
    GPIO.output(LED, False)

def ende():
    GPIO.output(ROT, False)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, False)
    GPIO.output(AB, False)
    GPIO.output(CD, False)
    GPIO.output(Hupe, False)
    GPIO.cleanup()
    exit()

def umschalten2():
    print("Start2")
    GPIO.output(ROT, True)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, False)
    GPIO.output(AB, True)
    GPIO.output(CD, False)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(10)
    GPIO.output(ROT, False)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, True)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    print ("for g schleife")
    for g in range(90):
        sys.stdin.flush()
        key = inkey()
        if key == 's' :
            break
        elif key == 'e' :
            notfall()
            ende()
        else:
            time.sleep(0.1)
    print ("Next")
    GPIO.output(GRUEN, False)
    GPIO.output(ROT, False)
    GPIO.output(GELB, True)
    for g in range(300):
        key = inkey()
        if key == 's' :
            sys.stdin.flush()
            break
        elif key == 'e' :
            sys.stdin.flush()
            notfall()
            ende()
        else:
            time.sleep(0.1)
    GPIO.output(ROT, True)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, False)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    GPIO.output(AB, False)
    GPIO.output(CD, True)
    time.sleep(20)
    GPIO.output(ROT, False)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, True)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    for g in range(900):
        key = inkey()
        if key == 's' :
            sys.stdin.flush()
            break
        elif key == 'e' :
            sys.stdin.flush()
            notfall()
            ende()
        else:
            time.sleep(0.1)
    GPIO.output(GRUEN, False)
    GPIO.output(ROT, False)
    GPIO.output(GELB, True)
    for g in range(300):
        key = inkey()
        if key == 's' :
            sys.stdin.flush()
            break
        elif key == 'e' :
            sys.stdin.flush()
            notfall()
            ende()
        else:
            time.sleep(0.1)
    GPIO.output(ROT, True)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, False)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    Trefferaufnahme()
    GPIO.output(ROT, True)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, False)
    GPIO.output(AB, False)
    GPIO.output(CD, True)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(10)
    GPIO.output(ROT, False)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, True)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    for g in range(900):
        key = inkey()
        if key == 's' :
            sys.stdin.flush()
            break
        elif key == 'e' :
            sys.stdin.flush()
            notfall()
            ende()
        else:
            time.sleep(0.1)
    GPIO.output(GRUEN, False)
    GPIO.output(ROT, False)
    GPIO.output(GELB, True)
    for g in range(300):
        key = inkey()
        if key == 's' :
            sys.stdin.flush()
            break
        elif key == 'e' :
            sys.stdin.flush()
            notfall()
            ende()
        else:
            time.sleep(0.1)
    GPIO.output(ROT, True)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, False)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    GPIO.output(AB, True)
    GPIO.output(CD, False)
    time.sleep(20)
    GPIO.output(ROT, False)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, True)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    for g in range(900):
        key = inkey()
        if key == 's' :
            sys.stdin.flush()
            break
        elif key == 'e' :
            sys.stdin.flush()
            notfall()
            ende()
        else:
            time.sleep(0.1)
    GPIO.output(GRUEN, False)
    GPIO.output(ROT, False)
    GPIO.output(GELB, True)
    for g in range(300):
        key = inkey()
        if key == 's' :
            sys.stdin.flush()
            break
        elif key == 'e' :
            sys.stdin.flush()
            notfall()
            ende()
        else:
            time.sleep(0.1)
    GPIO.output(ROT, True)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, False)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    time.sleep(0.5)
    GPIO.output(Hupe, True)
    time.sleep(0.5)
    GPIO.output(Hupe, False)
    Trefferaufnahme()

def umschalten4():
        GPIO.output(ROT, True)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, False)
        GPIO.output(AB, True)
        GPIO.output(CD, False)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        time.sleep(0.5)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        time.sleep(10)
        GPIO.output(ROT, False)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, True)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        for g in range(2100):
            key = inkey()
            if key == 's' :
                sys.stdin.flush()
                break
            elif key == 'e' :
                sys.stdin.flush()
                notfall()
                ende()
            else:
                time.sleep(0.1)

        GPIO.output(GRUEN, False)
        GPIO.output(ROT, False)
        GPIO.output(GELB, True)
        for g in range(300):
            key = inkey()
            if key == 's' :
                sys.stdin.flush()
                break
            elif key == 'e' :
                sys.stdin.flush()
                notfall()
                ende()
            else:
                time.sleep(0.1)

        GPIO.output(ROT, True)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, False)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        time.sleep(0.5)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        GPIO.output(AB, False)
        GPIO.output(CD, True)
        time.sleep(20)
        GPIO.output(ROT, False)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, True)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        for g in range(2100):
            key = inkey()
            if key == 's' :
                sys.stdin.flush()
                break
            elif key == 'e' :
                sys.stdin.flush()
                notfall()
                ende()
            else:
                time.sleep(0.1)

        GPIO.output(GRUEN, False)
        GPIO.output(ROT, False)
        GPIO.output(GELB, True)
        for g in range(300):
            key = inkey()
            if key == 's' :
                sys.stdin.flush()
                break
            elif key == 'e' :
                sys.stdin.flush()
                notfall()
                ende()
            else:
                time.sleep(0.1)

        GPIO.output(ROT, True)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, False)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        time.sleep(0.5)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        time.sleep(0.5)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        Trefferaufnahme()
        GPIO.output(ROT, True)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, False)
        GPIO.output(AB, False)
        GPIO.output(CD, True)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        time.sleep(0.5)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        time.sleep(10)
        GPIO.output(ROT, False)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, True)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        for g in range(2100):
            key = inkey()
            if key == 's' :
                sys.stdin.flush()
                break
            elif key == 'e' :
                sys.stdin.flush()
                notfall()
                ende()
            else:
                time.sleep(0.1)

        GPIO.output(GRUEN, False)
        GPIO.output(ROT, False)
        GPIO.output(GELB, True)
        for g in range(300):
            key = inkey()
            if key == 's' :
                sys.stdin.flush()
                break
            elif key == 'e' :
                sys.stdin.flush()
                notfall()
                ende()
            else:
                time.sleep(0.1)

        GPIO.output(ROT, True)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, False)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        time.sleep(0.5)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        GPIO.output(AB, True)
        GPIO.output(CD, False)
        time.sleep(20)
        GPIO.output(ROT, False)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, True)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        for g in range(2100):
            key = inkey()
            if key == 's' :
                sys.stdin.flush()
                break
            elif key == 'e' :
                sys.stdin.flush()
                notfall()
                ende()
            else:
                time.sleep(0.1)

        GPIO.output(GRUEN, False)
        GPIO.output(ROT, False)
        GPIO.output(GELB, True)
        for g in range(300):
            key = inkey()
            if key == 's' :
                sys.stdin.flush()
                break
            elif key == 'e' :
                sys.stdin.flush()
                notfall()
                ende()
            else:
                time.sleep(0.1)

        GPIO.output(ROT, True)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, False)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        time.sleep(0.5)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        time.sleep(0.5)
        GPIO.output(Hupe, True)
        time.sleep(0.5)
        GPIO.output(Hupe, False)
        Trefferaufnahme()

def start2():
    for d in range(6):
        umschalten2()

def start4():
    for d in range(6):
        umschalten4()

#Startabfrage (Menu)
print ("2 = 2 Minuten \n")
print ("4 = 4 Minuten \n")
print ("e = Notfall \n")
print ("s = Schuetzen fertig \n")
print ("t = Trefferaufnahme fertig \n")
print ("l = Lichtschalter \n")
while 1:
    key = inkey()
    if key in ['2','4','e','l']:
        if key == '2':
            sys.stdin.flush()
            start2()
        elif key == '4':
            sys.stdin.flush()
            start4()
        elif key == 'e':
            sys.stdin.flush()
            notfall()
            ende()
        elif key == 'l':
            sys.stdin.flush()
            if l == False:
                l = True
                Lichtan()
            else:
                sys.stdin.flush()
                l = False
                Lichtaus()
    else:
        time.sleep(0.2)

Hiermit kann mit e der Notfallmodus ausgelöst werden und das Programm sauber beendet werden, während sie Ampel grün oder gelb ist.
Mein Problem ist im Moment nur das in der ersten umschalten2() -> in range Schleife nicht automatisch auf den else Zweig gesprungen wird, ohne das eine Taste gedrückt wird.
Ursprünglich war mein gedanke, das bei nichtdrücken einer Taste nur 0.1 Sec. gewartet wird bis der Counter der in range Schleife weiter zählt.
Meine Frage also: Wie bekomm ich ein weiterzählen, ohne TAstendruck nach 0.1 Sekunden hin?
Gruß,
Torsten
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du select.select in inkey mit dem Filedescriptor von stdin und einem timeout von 0.1 Sekunden machst. Dann kehrt das zurück, auch wenn keine Taste gelesen wurde.

Oder du stellst um auf pygame, da kannst du Tasten abfragen ohne zu blockieren.

Und ein Rat: es ist ein klassischer Fehler zu glauben weil man 90 mal 0.1 Sekunde gewartet hat, dass dann 9 Sekunden vergangen wären. Das stimmt nicht. Das warten ist immer mindestens so lang, aber gerne auch länger. Du musst immer dir konkret verflossene Zeit messen.
Straggle
User
Beiträge: 13
Registriert: Sonntag 27. September 2020, 16:42

Sirius3 hat geschrieben: Sonntag 27. September 2020, 18:27 Das `as` bei `import` ist zum Umbenennen da, GPIO wird aber gar nicht umbenannt. Was hast Du Dir dabei gedacht, das so zu schreiben?
Warnungen sind dazu da, dass man sie behebt, nicht dass man sie ignoriert. Dazu muß am Ende des Programms aber auch verläßlich GPIO.cleanup aufgerufen werden, am Besten in einem finally-Block.
`inkey_buffer` scheint eine Konstante zu sein, sollte also auch als solche geschrieben werden.
`Hupe` ist aus dem Grund auch falsch geschrieben.
Es gibt True in Python, eine Endlosschleife sollte man also nicht mit 1 schreiben.
`inkey` wartet so lange, bis eine Taste gedrückt wurde. Du mußt also 90 Tasten drücken, bevor es weitergeht.
Das as hab ich wegen meiner Schreibfaulheit benutzt, um anstatt RPi.GPIO nur GPIO schreiben zu müssen.
Warnungen sind aktiv im ursprünglichen Skript.
Das mit der Hupe hab ich nicht ganz verstanden, aber sie funktioniert.
Den inkey_buffer hab ich mir von folgender Seite gemopst, um das Rad nicht neu erfinden zu müssen:
https://forum-raspberrypi.de/forum/thre ... it-python/
Habe mittlerweile 1 durch true ersetzt.
Auf die eigentliche Frage, hab ich leider nur gesagt bekommen ich muss 90x eine Taste drücken.
Das ist leider nicht sehr hilfreich, da ich das bereits mit dem print befehl selbst herausgefunden hatte.

Das ganze soll als Polling alle 0.1 Sekunden abgefragt werden. Nach 90 Sekunden soll dann das Programm mit dem nächsten Schritt fortfahren.
Mittlerweile erscheint mir dieser Teilquelltext etwas geschickter jedoch ist auch hier das Problem dass ich 900x eine Tase drücken muss.

Code: Alles auswählen

   
    RPi.GPIO.output(HUPE, False)
    for w in range(900):
        key = inkey()
        if key == 'e':
            notfall()
            ende()
        elif key == 's':
            sys.stdin.flush()
            jump1()
        else: time.sleep(0.1)
    RPi.GPIO.output(GRUEN, False)
    RPi.GPIO.output(ROT, False)
    RPi.GPIO.output(GELB, True)
    for w in range(300):
        key = inkey()
        if key == 'e':
            notfall()
            ende()
        elif key == 's':
            sys.stdin.flush()
            jump1()
        else:
            time.sleep(0.1)
    jump1()
    
def jump1():
.
.
.

Da ich heute zum ersten mal mit Python gearbeitet habe bitte ich dennoch um Nachsicht mit Leichtsinnsfehlern, etc.
Habe mich vorher nur mit 8051, Microcontroller uns C beschäftigt gehabt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Da hat es so viel mehrfach kopierten Code, dass man kaum was versteht.
`Trefferaufnahme` hat einen rekursiven Aufruf, der so nicht sein sollte. Sowas löst man mit einer Schleife.
`exit` hat in einem ordentlichen Programm nichts verloren, wie es z.B. in `ende` vorkommt.

Hier mal ein bißchen aufgeräumt:

Code: Alles auswählen

from RPi import GPIO
import time
import sys
import termios
import tty

ROT = 17
GELB = 27
GRUEN = 22
HUPE = 13
AB = 5
CD = 6
LED = 4

def inkey(timeout=None):
    fd=sys.stdin.fileno()
    remember_attributes=termios.tcgetattr(fd)
    tty.setraw(sys.stdin.fileno())
    attributes = termios.tcgetattr(fd)
    if timeout is not None:
        attributes[-1][termios.VMIN] = 0
        attributes[-1][termios.VTIME] = timeout
    termios.tcsetattr(fd,termios.TCSADRAIN, attributes)
    character=sys.stdin.read(1)
    termios.tcsetattr(fd,termios.TCSADRAIN, remember_attributes)
    return character

def initialize():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(ROT, GPIO.OUT) #rot
    GPIO.setup(GELB, GPIO.OUT) #gelb
    GPIO.setup(GRUEN, GPIO.OUT) #gruen
    GPIO.setup(HUPE, GPIO.OUT) #HUPE
    GPIO.setup(AB, GPIO.OUT) #AB
    GPIO.setup(CD, GPIO.OUT) #CD
    GPIO.setup(LED, GPIO.OUT) #LED-Strahler

def rot_hupe(three=False):
    GPIO.output(ROT, True)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, False)
    GPIO.output(HUPE, True)
    time.sleep(0.5)
    GPIO.output(HUPE, False)
    time.sleep(0.5)
    GPIO.output(HUPE, True)
    time.sleep(0.5)
    GPIO.output(HUPE, False)
    if three:
        time.sleep(0.5)
        GPIO.output(HUPE, True)
        time.sleep(0.5)
        GPIO.output(HUPE, False)

def gelb():
    GPIO.output(GRUEN, False)
    GPIO.output(GELB, True)
    GPIO.output(ROT, False)

def gruen_hupe():
    GPIO.output(ROT, False)
    GPIO.output(GELB, False)
    GPIO.output(GRUEN, True)
    GPIO.output(HUPE, True)
    time.sleep(0.5)
    GPIO.output(HUPE, False)

def notfall():
    rot_hupe(three=True)
    GPIO.output(AB, False)
    GPIO.output(CD, False)
    time.sleep(10)

def trefferaufnahme():
    while inkey() != 't':
        pass

def wait_for_stop(timeout):
    stop_time = time.monotonic() + timeout
    while stop_time >= time.monotonic():
        key = inkey(timeout=1)
        if key == 's':
            break
        elif key == 'e':
            raise KeyboardInterrupt("Notfall")

def umschalten(timeout, is_ab):
    GPIO.output(AB, is_ab)
    GPIO.output(CD, not is_ab)
    rot_hupe()
    time.sleep(10)
    gruen_hupe()
    wait_for_stop(timeout - 30)
    gelb()
    wait_for_stop(30)
    rot_hupe(not is_ab)

def start(timeout):
    for d in range(6):
        umschalten(timeout, is_ab=True)
        umschalten(timeout, is_ab=False)
        trefferaufnahme()

def main():
    try:
        initialize()
        #Startabfrage (Menu)
        print("2 = 2 Minuten \n")
        print("4 = 4 Minuten \n")
        print("e = Notfall \n")
        print("s = Schuetzen fertig \n")
        print("t = Trefferaufnahme fertig \n")
        print("l = Lichtschalter \n")
        licht_an = False
        while True:
            sys.stdin.flush()
            key = inkey()
            if key == '2':
                start(2 * 60)
            elif key == '4':
                start(4 * 60)
            elif key == 'e':
                break
            elif key == 'l':
                licht_an = not licht_an
                GPIO.output(LED, licht_an)
    finally:
        notfall()
        GPIO.output(ROT, False)
        GPIO.output(GELB, False)
        GPIO.output(GRUEN, False)
        GPIO.output(AB, False)
        GPIO.output(CD, False)
        GPIO.output(HUPE, False)
        GPIO.cleanup()

if __name__ == '__main__':
    main()
Zuletzt geändert von Sirius3 am Sonntag 27. September 2020, 21:40, insgesamt 3-mal geändert.
Straggle
User
Beiträge: 13
Registriert: Sonntag 27. September 2020, 16:42

Danke, hätte ich nicht erwartet eine fertigen Code zu bekommen.
Werde mir den morgen in Ruhe mal ansehen.
Ist mir jetzt zu spät. Sitze schon seid heute morgen 10 Uhr da dran.

Vielden Dank nochmal für die schnell und unkomplizierte Hilfe. :D
Straggle
User
Beiträge: 13
Registriert: Sonntag 27. September 2020, 16:42

Hallo zusammen,
kann mir von euch jemand eine laienverständliche Seite für den termios.VMIN etc. nennen?
Bei dem umgebauten Quellcode spring die Ampael nämlich von grün sofort wieder auf rot, ohne die timeout Zeit abzuwarten.
Ich würde auch einen korregierten Quellcode nehmen.
Ist KEINE Hausaufgabe oder Schularbeit. Versuche gerade damit die Ampelanlage auf dem Bogenschießplatz meines Vereins wieder flott zu bekommen.
Würde mich allerdings auch freuen, wenn ich das am Ende kapiert habe, da ich vor habe mirch mit Python und QT zu beschäftigen.

Gruß,
Torsten
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Das termios-Zeugs sollte eigentlich gar keine Rolle spielen, da das eigentliche Warten durch time.monotonic sichergestellt wird:

Code: Alles auswählen

def wait_for_stop(timeout):
    stop_time = time.monotonic() + timeout
    while stop_time >= time.monotonic():
        key = inkey(timeout=1)
        if key == 's':
            break
        elif key == 'e':
            raise KeyboardInterrupt("Notfall")
Straggle
User
Beiträge: 13
Registriert: Sonntag 27. September 2020, 16:42

Danke für die Erklärungen und Hilfe beim Code. Nach ein paar kleineren Anpassungen läuft das Programm jetzt, wie ich es mir vorgestellt habe.👍🏻
Antworten