Mehrere GPIO`s mit Ausschaltverzögerung nutzen

  • Hallo, ich möchte gerne den PI für meine Hausautomatisierung nutzen.
    Das Ziel ist es mehrere Jalousien gleichzeitig zu bedienen.

    Zum Beispiel starte ich zuerst den GPIO10 für 30 Sek. und direkt danach GPIO13 ebenfalls für 30 Sek.

    Ich habe es bis jetzt mit time.sleep versucht, es geht bei mehreren Befehlen in die Hose.

    Ich benötige soetwas wie

    Schalte den GPIO10 für 30 Sek. an. Könnte mir jemand helfen?

    Mein Code bis jetzt:

    elif line == 'Q1 Taster':
    self.send('on\n')
    GPIO.output(Q1,GPIO.HIGH)
    time.sleep(30) #30sek
    GPIO.output(Q1,GPIO.LOW)


    elif line == 'Q2 Taster':
    self.send('on\n')
    GPIO.output(Q2,GPIO.HIGH)
    time.sleep(30) #30sek
    GPIO.output(Q2,GPIO.LOW)

    • Offizieller Beitrag
    Code
    GPIO.output(Q1,GPIO.HIGH) 
    time.sleep(30) #30sek 
    GPIO.output(Q1,GPIO.LOW)

    Schaltet doch den GPIO für 10sek auf High?

    Bitte code tags benutzen

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Einmal editiert, zuletzt von dbv (25. März 2015 um 21:15)

  • Hallo zusammen,

    gehört jetzt nicht hierher, aber in Icon genügt dafür eine Zeile:

    Code
    GPIO(Q1, 1, 30000)

    Hat halt jede Programmiersprache so ihre Vorteile. ;)

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (25. März 2015 um 23:01)


  • Das Ziel ist es mehrere Jalousien gleichzeitig zu bedienen.

    Zum Beispiel starte ich zuerst den GPIO10 für 30 Sek. und direkt danach GPIO13 ebenfalls für 30 Sek.

    Dann wäre "time.sleep" die falsche Wahl, denn dann wird das Script für diese Zeit blockiert und kann nichts anderes mehr machen.

    Eine mögliche Lösung wäre einen Timer in einem separaten Thread ausführen zu lassen... Das Script selbst ist ein Thread, dort schaltest du den GPIO auf HIGH und startest anschließend einen threading.Timer welcher nach Ablauf von dir definierten Sekunden ausgeführt wird und da wird der GPIO dann wieder auf LOW gestellt. Der Timer wird dann automatisch beendet.

    Grundfunktion siehe > hier < oder > hier <

    Würde dir empfehlen dafür eine Funktion zu definieren, welche den GPIO auf HIGH stellt und den Timer startet. An die Timer Funktion übergibst du dann noch den GPIO.
    Da ich aber nicht den Rest deines Codes kenne, kann ich nicht genau sagen wo du das einbauen musst...

    Ich empfehle dir aber auch Interrupts zu verwenden, das ist für Taster präziser, läuft ebenfalls in einem Thread und verursacht auch nicht so viel CPU Last wie es aber zB. eine while Schleife täte. Mit einer while wird das Script daran gehindert sich zu beenden, um das also ohne while zu verhindern nutze ich 'signal'.

    [code=php]
    import RPi.GPIO as GPIO
    import threading
    import signal

    #------------------------------------------------------------------------

    #GPIO pins
    tasterRauf = 5
    tasterRunter = 6
    rolloRauf = 17
    rolloRunter = 11

    # Times (in sec)
    timeRauf = 30
    timeRunter = 30

    # only one of following:
    PULL = GPIO.PUD_DOWN #GPIO -> GND
    #PULL = GPIO.PUD_UP #GPIO -> 3V3

    # to use RaspberryPi gpio numbers
    GPIO.setmode(GPIO.BCM)

    #------------------------------------------------------------------------

    # set up GPIO input channels
    GPIO.setup(tasterRauf, GPIO.IN, pull_up_down = PULL)
    GPIO.setup(tasterRunter, GPIO.IN, pull_up_down = PULL)

    # set up GPIO output channels
    GPIO.setup(rolloRauf, GPIO.OUT)
    GPIO.setup(rolloRunter, GPIO.OUT)


    def timedRequest(pin):
    print "{} wird abgeschaltet".format(pin)
    GPIO.output(pin, False)

    def interrupt_event(pin):
    if pin == tasterRauf:
    print "Fahre Rollo rauf"
    GPIO.output(rolloRauf, True)
    t = threading.Timer(timeRauf, timedRequest, rolloRauf)
    t.start() # after ... seconds "timedRequest" will be executed
    elif pin == tasterRunter:
    print "Fahre Rollo runter"
    GPIO.output(rolloRunter, True)
    t = threading.Timer(timeRunter, timedRequest, rolloRunter)
    t.start() # after ... seconds "timedRequest" will be executed

    try:
    GPIO.add_event_detect(tasterRauf, GPIO.RISING, callback=interrupt_event, bouncetime=150)
    GPIO.add_event_detect(tasterRunter, GPIO.RISING, callback=interrupt_event, bouncetime=150)

    #keep script running
    signal.pause()
    except (KeyboardInterrupt, SystemExit):
    GPIO.cleanup()
    print "\nQuit\n"
    [/php]

    //EDIT:

    Ggf musst du noch speichern ob gerade schon das Rollo hoch oder runter gefahren wird damit man den Vorgang nicht mit einem anderen Tasterdruck stören kann oder noch einen weiterer Timer gestartet wird.
    Das kannst du mit einem Dictionary erreichen:

    Spoiler anzeigen

    [code=php]
    import RPi.GPIO as GPIO
    import threading
    import signal

    #------------------------------------------------------------------------

    #GPIO pins
    tasterRauf = 5
    tasterRunter = 6
    rolloRauf = 17
    rolloRunter = 11

    # Times (in sec)
    timeRauf = 30
    timeRunter = 30

    # only one of following:
    PULL = GPIO.PUD_DOWN #GPIO -> GND
    #PULL = GPIO.PUD_UP #GPIO -> 3V3

    # to use RaspberryPi gpio numbers
    GPIO.setmode(GPIO.BCM)

    #------------------------------------------------------------------------

    # set up GPIO input channels
    GPIO.setup(tasterRauf, GPIO.IN, pull_up_down = PULL)
    GPIO.setup(tasterRunter, GPIO.IN, pull_up_down = PULL)

    # set up GPIO output channels
    GPIO.setup(rolloRauf, GPIO.OUT)
    GPIO.setup(rolloRunter, GPIO.OUT)

    # http://www.tutorialspoint.com/python/python_dictionary.htm
    status = {}
    status[rolloRauf] = 0
    status[rolloRunter] = 0

    def timedRequest(pin):
    print "{} wird abgeschaltet".format(pin)
    GPIO.output(pin, False)
    status[pin] = 0

    def interrupt_event(pin):
    if pin == tasterRauf and not (status[rolloRauf] == 1) and not (status[rolloRunter] == 1):
    print "Fahre Rollo rauf"
    GPIO.output(rolloRauf, True)
    status[rolloRauf] = 1
    t = threading.Timer(timeRauf, timedRequest, rolloRauf)
    t.start() # after ... seconds "timedRequest" will be executed
    elif pin == tasterRunter and not (status[rolloRunter] == 1) and not (status[rolloRauf] == 1):
    print "Fahre Rollo runter"
    GPIO.output(rolloRunter, True)
    status[rolloRunter] = 1
    t = threading.Timer(timeRunter, timedRequest, rolloRunter)
    t.start() # after ... seconds "timedRequest" will be executed

    try:
    GPIO.add_event_detect(tasterRauf, GPIO.RISING, callback=interrupt_event, bouncetime=150)
    GPIO.add_event_detect(tasterRunter, GPIO.RISING, callback=interrupt_event, bouncetime=150)

    #keep script running
    signal.pause()
    except (KeyboardInterrupt, SystemExit):
    GPIO.cleanup()
    print "\nQuit\n"
    [/php]ungetestet!

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!