Raspberry Pi Shutdown-Script in Python
Den Raspberry Pi mit einem Hardware-Taster rebooten oder herunterfahren
Im Folgenden wird ein in Python geschriebenes Shutdownscript vorgestellt, mittels dessen sich ein Raspberry Pi auf einfache Weise mit einem Druckknopf herunterfahren oder neu starten lässt.
Funktionsweise
Wird ein Druckknopf am Raspberry Pi länger als eine Sekunde gehalten (LED leuchtet auf) und sofort wieder losgelassen, startet der Pi neu.
Lässt man den Knopf nicht wieder los, beginnt der Pi sich nach drei Sekunden herunterzufahren und die LED erlischt.
Beschreibung des Schaltplans
Die erforderliche Beschaltung am Raspberry Pi ist einfach:
- Der im Beispiel verwendete Pin GPIO2 wird über einen Druckknopf und den Widerstand R1 mit Masse verbunden.
R1 muss niedrig genug sein, um GPIO2 gegen R3 auf LOW ziehen zu können.
Hier wurde R1=470Ω gewählt. - Eine Status-LED wird mit dem Vorwiderstand R2 zwischen Masse und GPIO4 verbunden.
Im Beispiel wurde auch für R2 470Ω gewählt. - Der Pull-Up Widerstand R3 hält Pin GPIO2 auf 3,3V, solange der Schalter nicht betätigt wird.
Die GPIO-Pins 2 und 3 im Raspberry Pi Model B+ und Raspberry Pi 2 sind intern mit einem 1,8kΩ Widerstand ausgestattet, sodass R3 in diesem Fall nicht extern beschaltet werden muss.
Der Python code
Das nachfolgende Script kann z.B. unter /usr/local/bin/shutdown.py
abgelegt werden.
Das Shutdownscript muss mit superuser-Rechten gestartet werden, damit es auf den GPIO zugreifen darf: sudo python /usr/local/bin/shutdown.py
Um beim Booten des Raspberry Pis automatisch gestartet zu werden, genügt der Eintrag python /usr/local/bin/shutdown.py &
in die Datei /etc/rc.local (vor 'exit 0'). Den Ampersand '&' nicht vergessen, sonst bleibt der Pi beim booten stehen.
Shutdownscript 'shutdown.py':
# shutdownscript shutdown.py by holzkischtle.de # 20150714 # sdbuttonpin (GPIO-Pin) pulled low for # - <1sec : nothing happens # - >1sec, <3sec: reboot # - >3sec : shutdown # LED lights up after 1 sec # hardware setup: # - pushbutton + R470 between GND & sdbuttonpin # - R10K as pullup between 3V3 & sdbuttonpin # (RPi has R1K8 pull-up resistors on GPIO Pins 2&3) # - LED + R470 between GND & ledpin # 2 possibilities to auto-run script at boot-time: # 1: add line to /etc/rc.local: # 'python /usr/local/bin/shutdown.py &' # 2: add line to crontab of root via "sudo crontab -e": # '@reboot sudo python /usr/local/bin/shutdown.py' # Tested on Raspberry Pi Model B+ & Raspberry Pi 2 Model B # helpful resources: # http://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/ # http://www.forum-raspberrypi.de/Thread-shutdown-reboot-script-python # https://docs.python.org/3.4/tutorial/modules.html # https://www.python.org/dev/peps/pep-0324/ (subprocess) # http://legacy.python.org/dev/peps/pep-0008/ (style guide) # http://wiki.ubuntuusers.de/pep8 import RPi.GPIO as GPIO import subprocess from time import sleep from signal import pause sdbuttonpin = 2 ledpin = 4 timestep = 0.1 # discrete testing 10 times / second if button is held down def init_gpio(): # use GPIO pin numbering GPIO.setmode(GPIO.BCM) # set sdbuttonpin as input #GPIO.setup(sdbuttonpin, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(sdbuttonpin, GPIO.IN) # set ledpin as output GPIO.setup(ledpin, GPIO.OUT, initial=GPIO.LOW) def led_on(): GPIO.output(ledpin, 1) def led_off(): GPIO.output(ledpin, 0) def shutdown(): #print('shutdown') subprocess.call(["shutdown", "-h", "now"]) def reboot(): #print('reboot') subprocess.call(["shutdown", "-r", "now"]) def check_periodically(channel): timecounter = 0 while timecounter < 1: if GPIO.input(sdbuttonpin): # button pressed for <1sec return sleep(timestep) timecounter = timecounter + timestep led_on() while timecounter < 3: if GPIO.input(sdbuttonpin): # button pressed for <3sec led_off() reboot() return sleep(timestep) timecounter = timecounter + timestep # button pressed for >=3sec led_off() shutdown() def init_and_listen(): init_gpio() # sdbuttonpin as interrupt input GPIO.add_event_detect(sdbuttonpin, GPIO.FALLING, callback=check_periodically, bouncetime=200) try: #keep script running pause() except (SystemExit, KeyboardInterrupt): GPIO.cleanup() if __name__ == "__main__": init_and_listen()
Fragen?
Bei Fragen oder Anregungen erfreut sich Holzkischtle.de über jeden Kontakt.
Gewährleistung
Es wird keine Gewährleistung auf Funktionalität oder im schlimmsten Fall auftretende Schäden durch Verwendung dieser Anleitung und der zugehörigen Software gegeben. Die Verwendung der hier bereitgestellten Informationen geschieht auf eigene Gefahr. Alle GPIO Anschlüsse sind auf 3,3V ausgelegt. Höhere Spannungen oder das Kurzschliessen von Pins können den Pi zerstören.