Taster geschlossen / offen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    >hier< hat meigrafd einen Code geschrieben über dem man mit einem Taster den Pi ausschalten kann.
    Jetzt habe ich mal versucht das ganze mit einen längeren Tastendruck ablaufen zu lassen.
    Dazu sollen zwei Zeiten verglichen werden. Die erste Zeit beim drücken und die zweite beim loslassen.
    Leider geht es bei:

    Code
    if GPIO.input(shutdownPin) == GPIO.HIGH:


    aber erst los wenn ich den Taster loslasse und damit bekomme ich ja die zweite Zeit nicht.

    Wie bekomme ich das hin, das der Code schon beim drücken startet und nicht erst beim loslassen?

    Danke

  • RISING = Änderung von LOW auf HIGH
    FALLING = Änderung von HIGH auf LOW

    Wenn du sowohl den RISING als auch FALLING Zustand bemerken möchtest musst du GPIO.BOTH verwenden, also:[code=php]GPIO.add_event_detect(shutdownPin, GPIO.BOTH, callback=Interrupt_event, bouncetime=150)[/php]

    Wenn du bewirken willst, das ein Taster für eine gewisse Zeit gedrückt sein muss bevor eine Aktion ausgeführt wird, kannst du das wie folgt lösen:

    [code=php]
    #special function time (in sec) for Taster pin
    SpecialTime = 5

    def Interrupt_event(pin):
    global triggerTime
    if GPIO.input(shutdownPin) == GPIO.HIGH:
    triggerTime = time()
    elif GPIO.input(shutdownPin) == GPIO.LOW:
    triggerTime = time() - triggerTime
    if triggerTime >= SpecialTime:
    print "special Taster"
    # ...shutdown...
    else:
    print "normal Taster"
    # ...reboot...
    [/php]

    Die Nutzung von global ist nicht so schön, aber in diesem Fall imho die einzige (einfache) Möglichkeit.

  • Super Danke!

    Habe es jetzt so gemacht:
    [code=php]
    #!/usr/bin/python
    #
    # v0.2
    #
    # -*- coding: utf-8 -*-
    import RPi.GPIO as GPIO
    import time, signal
    from subprocess import call
    #------------------------------------------------------------------------
    # use the raspi board pin number
    GPIO.setmode(GPIO.BOARD)
    # use the gpio number
    #GPIO.setmode(GPIO.BCM)

    #special function time (in sec) for Taster pin
    SpecialTime = 5 # min. zu drueckende Zeit in Sekunden
    shutdownPin = 5 # with GPIO.BOARD, pin#5 is gpio3
    ledPin = 7 # with GPIO.BOARD, pin#7 is gpio4

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

    GPIO.setup(ledPin, GPIO.OUT)
    GPIO.output(ledPin, True)
    try:
    GPIO.setup(shutdownPin, GPIO.IN, pull_up_down = PULL)
    except RuntimeWarning:
    GPIO.setup(shutdownPin, GPIO.IN)

    def Interrupt_event(pin):
    #Zeit = time.strftime("%d.%m.%Y %H:%M:%S")
    #print "{} -> GPIO {} ausgeloest!".format(Zeit, pin)
    global start
    global ende
    global zeit
    if GPIO.input(shutdownPin) == GPIO.LOW:
    start = time.time()
    print "Taster jetzt gedrueckt", start
    elif GPIO.input(shutdownPin) == GPIO.HIGH:
    ende = time.time()
    print "Taster nicht mehr gedrueckt", ende
    zeit = ende - start
    print "Zeit die Taster gedrueckt wurde", zeit
    if zeit >= SpecialTime:
    print "jetzt wird der Raspberry Pi runtergefahren"
    #flash led
    GPIO.output(ledPin, False)
    time.sleep(.1)
    GPIO.output(ledPin, True)
    time.sleep(.1)
    GPIO.output(ledPin, False)
    time.sleep(.1)
    GPIO.output(ledPin, True)
    #run command
    call('poweroff', shell=False)

    try:
    GPIO.add_event_detect(shutdownPin, GPIO.BOTH, callback=Interrupt_event, bouncetime=150)
    #keep script running
    signal.pause()
    except (KeyboardInterrupt, SystemExit):
    print "\nQuit\n"
    GPIO.cleanup()
    [/php]

    Einmal editiert, zuletzt von mex_ (25. Februar 2015 um 23:10)

  • Hm du brauchst keine 3 Variablen global setzen. Gewöhn dir das bitte gleich wieder ab.

    Guck dir noch mal mein obiges Beispiel an. Ich komme mit nur einer einzigen global gesetzten Variable aus. Woran liegt das? ;)

    Also noch mal zurück zum Anfang und gewöhn dir das setzen von global bitte gar nicht erst an, es war hier nur die einfachste Möglichkeit aber sollte generell vermieden werden.

  • Hallo,

    habe wieder etwas Zeit gefunden und versucht die Code mit einer globalen Variablen laufen zu lassen.
    Leider geht es nicht so wie es soll.
    Wenn der Taster unter 5 Sekunden gedrückt wird passiert noch nicht. Wird aber ca. 10 Sekunden später der Taster noch einmal kurz gedrückt fährt der Pi runter.
    Er rechnet immer die Zeit vom ersten drücken bis zum zweiten Drücken und nicht die Dauer wann der Taster gedrückt wird.

    Warum?

    [code=php]
    #!/usr/bin/python
    #
    # v0.2
    #
    # -*- coding: utf-8 -*-
    import RPi.GPIO as GPIO
    import time, signal
    from subprocess import call
    #------------------------------------------------------------------------
    # use the raspi board pin number
    GPIO.setmode(GPIO.BOARD)
    # use the gpio number
    #GPIO.setmode(GPIO.BCM)

    #special function time (in sec) for Taster pin
    SpecialTime = 5 # min. zu drueckende Zeit in Sekunden
    shutdownPin = 5 # with GPIO.BOARD, pin#5 is gpio3
    ledPin = 7 # with GPIO.BOARD, pin#7 is gpio4

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

    GPIO.setup(ledPin, GPIO.OUT)
    GPIO.output(ledPin, True)
    try:
    GPIO.setup(shutdownPin, GPIO.IN, pull_up_down = PULL)
    except RuntimeWarning:
    GPIO.setup(shutdownPin, GPIO.IN)

    def Interrupt_event(pin):
    #Zeit = time.strftime("%d.%m.%Y %H:%M:%S")
    #print "{} -> GPIO {} ausgeloest!".format(Zeit, pin)
    global triggerTime
    if GPIO.input(shutdownPin) == GPIO.LOW:
    triggerTime = time.time()
    print "Taster jetzt gedrueckt", triggerTime
    elif GPIO.input(shutdownPin) == GPIO.HIGH:
    triggerTime = time.time() - triggerTime
    print "Zeit die Taster gedrueckt wurde", triggerTime
    if triggerTime >= SpecialTime:
    print "jetzt wird der Raspberry Pi runtergefahren"
    #flash led
    GPIO.output(ledPin, False)
    time.sleep(.1)
    GPIO.output(ledPin, True)
    time.sleep(.1)
    GPIO.output(ledPin, False)
    time.sleep(.1)
    GPIO.output(ledPin, True)
    #run command
    call('poweroff', shell=False)
    #else:
    #call('reboot', shell=False)

    try:
    GPIO.add_event_detect(shutdownPin, GPIO.BOTH, callback=Interrupt_event, bouncetime=150)
    #keep script running
    signal.pause()
    except (KeyboardInterrupt, SystemExit):
    print "\nQuit\n"
    GPIO.cleanup()
    [/php]

Jetzt mitmachen!

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