Raspberry Pi mit langen Tastendruck herunterfahren

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Benutzeravatar
Dennis89
User
Beiträge: 1124
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

die '3000' sind Millisekunden, das ergibt deine gewünschten 3 Sekunden.
Die '3' bei mir ist der GPIO 3 Pin, das entspricht der Pin-Nummer 5, siehe:
https://gpiozero.readthedocs.io/en/stable/recipes.html Absatz 2.2

Die Zeit, die man den Button gedrückt halten muss ist mit 'time=' angegeben, das ist bei mir jetzt 2 Sekunden. Kann man ja beliebig anpassen.
Der Code ist vom selben Link, Absatz 2.8.

Wenn du das verwenden möchtest, in dem Link Absatz 1.1 steht wie du gpiozero installierst. Das ist übrigends eine tolle Bibliothek mit guter und meiner Meinung nach verständlicher Doku.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Ok ich versuche mich mal das durch zu arbeiten evtl. klappt es ja damit.
Ist halt nur komisch das der Dienst immer verschwindet wen ich die kontakte verwende, das ist bei meinem alten script ohne timer nicht passiert
Benutzeravatar
Dennis89
User
Beiträge: 1124
Registriert: Freitag 11. Dezember 2020, 15:13

Nachtrag:

Der Fehler war nur ein Tippfehler, es muss heißen 'GPIO.RISING' anstatt 'GPIO_RISING'
Ich hatte allerdings noch eine Fehlermeldung wegen Berechtigungen bekommen, dann den Shutdown-Befehl abgeändert und es ging:

Code: Alles auswählen

#!/usr/bin/env python3
from RPi import GPIO
from subprocess import run

BUTTON_PIN = 5
TIMEOUT = 3000 # ms

def main():
    try:
        GPIO.setmode(GPIO.BCM)
        # GPIO5 (pin 29) set up as input. It is pulled up to stop false signals
        GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        while True:
            # wait for the pin to be sorted with GND and, if so, halt the system
            GPIO.wait_for_edge(BUTTON_PIN, GPIO.FALLING)
            channel = GPIO.wait_for_edge(BUTTON_PIN, GPIO.RISING, timeout=TIMEOUT)
            if channel is None:
                print("Shutting down...")
                run(["sudo", "shutdown", "-h", "0"])
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()
Grüße und viel Spass beim probieren
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Ah... damit hat es jetzt geklappt

Code: Alles auswählen

from gpiozero import Button
from subprocess import check_call
from signal import pause

def shutdown():
    check_call(['sudo', 'poweroff'])
shutdown_button = Button(3, hold_time=2)
shutdown_button.when_held = shutdown

pause()
Antworten