The Raspberry Pi is a great little computer, but it suffers from the fact that there is neither an ACPI-like shutdown button nor a power LED. Fortunately, both of these issues can be remedied using the GPIO-port. Here is a little python script based on the work of flipdot that does both. Details are in the script.
# This script will wait for a button to be pressed and then shutdown # the Raspberry Pi. # It will also turn on a LED once the Rapspberry Pi has finished # booting which will flash to acknowledge the button press and remain # on as long as the Raspberry Pi remains operational. # REMEMBER: you will need resistors between the button and the LED # and the naked pins or you will damage your Raspberry Pi! # You can run this script automatically by adding the line # python [FILENAME_OF_THIS_SCRIPT] & # to your /etc/rc.local # http://kampis-elektroecke.de/?page_id=3740 # http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio # https://pypi.python.org/pypi/RPi.GPIO # http://spaceblogs.org/flipdot/2013/06/shut-down-your-raspberry-pi-on-button-press-and-add-reset-function/ import RPi.GPIO as GPIO import time import os # set pin numbers. Pin layouts (looking at the board so that the pin in the ede of the boad is top left): # pins in parentheses are commonly used specific purposes #(board Raspberry Pi 1 model B rev 2.0): # +5V | +5V | GND |(14)| (15)| 18 | GND | 23 | 24 | GND | 25 | (8)| (7) # +3.3V | (2)| (3) | (4)| GND | 17 | 27 | 22 | +3.3V | (10)| (9)|(11)| GND # +5V | 28 | 30 | GND # +3.3V | 29 | 31 | GND # # Raspberry Pi 2 model B rev 1.1 # +5V | +5V | GND |(14)| (15)| 18 | GND | 23 | 24 | GND | 25 | (8)| (7) |(1)| GND | 12 | GND | 16 | 20 | 21 # +3.3V | (2)| (3) | (4)| GND | 17 | 27 | 22 | +3.3V | (10)| (9)|(11)| GND |(0)| 5 | 6 | 13 | 19 | 26 | GND # #HifiBerry Digi and AMp use GPIO 2,3,28,29,30,31 #HifiBerry DAC+, Digi+, Amp+ use GPIO 2,3,18,19,20,21 ButtonPin=23 LEDpin=24 # set how often to check if the button is really pressed. # TimeInterval in seconds. TimesChecked=3 TimeInterval=0.2 # Since we use powers beyond the author's control, we need to suppress warnings GPIO.setwarnings(False) # we will use the pin numbering of the SoC, so our pin numbers in the code are # the same as the pin numbers on the gpio headers GPIO.setmode(GPIO.BCM) # ButtonPin will be input and will have his pull up resistor activated # so we only need to connect a button to ground GPIO.setup(ButtonPin, GPIO.IN, pull_up_down = GPIO.PUD_UP) # LEDpin is configured as output #GPIO.setmode(GPIO.BOARD) GPIO.setup(LEDpin, GPIO.OUT) def blink(cycles, period, pin): for n in range(0, cycles): GPIO.output(pin, GPIO.HIGH) time.sleep(period/2) GPIO.output(pin, GPIO.LOW) time.sleep(period/2) # ISR: if our button is pressed, we will have a falling edge on ButtonPin # this will trigger this interrupt: def Int_shutdown(channel): for n in range(0,TimesChecked): time.sleep(TimeInterval) # print(GPIO.input(ButtonPin)) if (GPIO.input(ButtonPin)): # print 'exiting loop' break # shutdown our Raspberry Pi # print 'loop complete' # print(n) if n==TimesChecked-1: # print 'System will shut down now.' # blink a few times blink(3, 0.6, LEDpin) os.system("sudo shutdown -h now") # Now we are programming ButtonPin as an interrupt input # it will react on a falling edge and call our interrupt routine "Int_shutdown" GPIO.add_event_detect(ButtonPin , GPIO.FALLING, callback = Int_shutdown, bouncetime = 2000) # Blink slowly a few times when booting blink(2, 1.2, LEDpin) # Turn on the LED as a power LED GPIO.output(LEDpin,GPIO.HIGH) # do nothing while waiting for button to be pressed while 1: time.sleep(3600)