Adding an On/Off switch to your Raspberry Pi
Interrupts
Using an interrupt-based script is the best way to enable the soft shutdown feature of the Pi Supply switch. Using interrupts improves the efficiency of the code and minimizes load on the CPU compared with the while loop. The code for the interrupt method is shown in Listing 1. See the comments in the listing for a description of what the code is doing.
Listing 1
Interrupt Method
01 # Import the modules to send commands to the system and access GPIO pins
02 from subprocess import call
03 import RPi.GPIO as gpio
04
05 # Define a function to keep script running
06 def loop():
07 raw_input()
08
09 # Define a function to run when an interrupt is called
10 def shutdown(pin):
11 call('halt', shell=False)
12
13 gpio.setmode(gpio.BOARD) # Set pin numbering to board numbering
14 gpio.setup(7, gpio.IN) # Set up pin 7 as an input
15 gpio.add_event_detect(7, gpio.RISING, callback=shutdown, bouncetime=200) # Set up an interrupt to look for button presses
16
17 loop() # Run the loop function to keep script running
while Loop
A while loop is a basic fundamental of almost every programming language in existence, and it is a very useful tool. The code in Listing 2 has the same end result as the interrupt-based script – it allows the safe shutdown of your Rasp Pi, but it does so in a significantly more resource-hungry way. On the other hand, the while loop is a more basic piece of code that is perhaps easier to understand. Although I recommend using the interrupt-based code, I include the while loop approach also, because it works fine, and some people might prefer to use this code (or at least play with it and try to get their head around how it works).
Listing 2
while Loop
01 # Import the libraries to use time delays, send os commands and access GPIO pins
02 import RPi.GPIO as GPIO
03 import time
04 import os
05
06 GPIO.setmode(GPIO.BOARD) # Set pin numbering to board numbering
07 GPIO.setup(7, GPIO.IN) # Setup pin 7 as an input
08 while True: # Setup a while loop to wait for a button press
09 if(GPIO.input(7)): # Setup an if loop to run a shutdown command when button press sensed
10 os.system("sudo shutdown -h now") # Send shutdown command to os
11 break
12 time.sleep(1) # Allow a sleep time of 1 second to reduce CPU usage
Buy this article as PDF
Pages: 8
(incl. VAT)





.gif)