Liebe Community,
das nachfolgende Python Script, mit dem sich ein Raspberry Pi herunterfahren oder neu starten lässt, möchte ich gerne mit euch teilen.
Es werden zwei GPIO-Pins verwendet. Ein Pin dient dem Input mit einem Drucktaster, ein zweiter dem Anschluss einer Status-LED.
Das Script wurde getestet auf dem Raspberry Pi Model B+ und dem Raspberry Pi 2B.
Die Funktionsweise des Scripts:
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 insgesamt drei Sekunden herunterzufahren und die LED erlischt.
Der Schaltplan am Raspberry Pi:
- 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.
Das Script:
…kann zum Beispiel unter /usr/local/bin/shutdown.py abgelegt werden und mit dem Eintrag python /usr/local/bin/shutdown.py & in die Datei /etc/rc.local (vor 'exit 0') beim booten automatisch gestartet werden.
Ausprobieren:
Das Shutdownscript muss mit superuser-Rechten gestartet werden, damit es auf den GPIO zugreifen darf: sudo python /usr/local/bin/shutdown.py
# shutdownscript shutdown.py by holzkischtle.de
# 20150707
# 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/
import RPi.GPIO as GPIO
import time
import os
sdbuttonpin = 2
ledpin = 4
timestep = 0.1
# discrete testing 10 times / second if button is held down
# 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')
os.system("sudo shutdown -h now")
def reboot():
# print('reboot')
os.system("sudo shutdown -r now")
def check_periodically(channel):
t = 0
while(t < 1):
if GPIO.input(sdbuttonpin):
# button pressed for <1sec
return 0
time.sleep(timestep)
t = t + timestep
led_on()
while(t < 3):
if GPIO.input(sdbuttonpin):
# button pressed for <3sec
reboot()
led_off()
return 0
time.sleep(timestep)
t = t + timestep
# button pressed for >=3sec
led_off()
shutdown()
# sdbuttonpin as interrupt input
GPIO.add_event_detect(sdbuttonpin, GPIO.FALLING,
callback=check_periodically, bouncetime = 200)
try:
# loop forever & wait for button to be pressed
while 1:
time.sleep(1)
except (SystemExit, KeyboardInterrupt):
GPIO.cleanup()
Alles anzeigen
Viel Spass und Erfolg beim Herunterfahren und Neustarten!
(Das Script ist ausserdem auf resources@holzkischtle veröffentlicht und beschrieben.)