Raspberry Pi Safe Reboot and Shutdown Button a learn.sparkfun.com tutorial
Available online at: http://sfe.io/t1171
Introduction
Pulling the plug on your Raspberry Pi... is a bad idea! This can result in a corrupt microSD card and file system. Normally, we can use the menu bar from the GUI or type a command in the terminal window to safely shutdown the Pi. If you are looking for a quicker solution (especially if you are using a headless setup), have no fear! You can safely reboot or shut down your Raspberry Pi using a general purpose button and a Python script!
Required Materials
To follow along with this tutorial, you will need the following materials. You may not need everything though depending on what you have and your setup. Add it to your cart, read through the guide, and adjust the cart as necessary.
Suggested Reading
We would also recommend taking a look at the following tutorials if you aren't familiar with them.
Raspberry Pi 4 Kit Hookup Guide
March 14, 2020
Qwiic pHAT for Raspberry Pi Hookup Guide
May 23, 2019
Serial Terminal Basics
Python Programming Tutorial: Getting Started with the Raspberry Pi
How to Run a Raspberry Pi Program on Startup
Hardware Hookup
The connection is quick. If you have not already, simply stack the Qwiic pHAT v2.0 on top of your Raspberry Pi's GPIO header. If you are using an enclosure, you may need to have additional pair of stackable headers for a secure connection. The image below shows the pHAT v2.0 connecting to a Pi 3 with the help of stackable headers.
For the scope of this tutorial, we'll using a desktop setup with a monitor, keyboard, and mouse to easily configure your Raspberry Pi. If you have not already, connect the necessary peripherals and power up your Pi!
Example 1: Safe Shutdown
For those familiar with the text based command line, we can shutdown the Pi using the following command.
language:bash
sudo shutdown -h -now
The following example loads a Python script at startup and safely shuts down the Raspberry Pi using that command when the button connected to GPIO17 is pressed.
Example Code
On your Raspberry Pi, download the Python script by pressing the button below.
You can also copy the code and paste it in a text editor. Just make sure to name this file as safe_shutdown_Pi.py and remember the location that the file was saved.
language:python
# safe_shutdown_Pi.py
#
# -----------------------------------------------------------------------------
# Raspberry Pi Safe Shutdown Python Script
# -----------------------------------------------------------------------------
# WRITTEN BY: Ho Yun "Bobby" Chan
# @ SparkFun Electronics
# DATE: 3/31/2020
#
# Based on code from the following blog and tutorials:
#
# Kevin Godden
# https://www.ridgesolutions.ie/index.php/2013/02/22/raspberry-pi-restart-shutdown-your-pi-from-python-code/
#
# Pete Lewis
# https://learn.sparkfun.com/tutorials/raspberry-pi-stand-alone-programmer#resources-and-going-further
#
# Shawn Hymel
# https://learn.sparkfun.com/tutorials/python-programming-tutorial-getting-started-with-the-raspberry-pi/experiment-1-digital-input-and-output
#
# ==================== DESCRIPTION ====================
#
# This python script takes advantage of the Qwiic pHat v2.0's
# built-in general purpose button to safely reboot/shutdown you Pi:
#
# 1.) If you press the button momentarily, the Pi will shutdown.
#
# ========== TUTORIAL ==========
# For more information on running this script on startup,
# check out the associated tutorial to adjust your "rc.local" file:
#
# https://learn.sparkfun.com/tutorials/
#
# ========== PRODUCTS THAT USE THIS CODE ==========
#
# Feel like supporting our work? Buy a board from SparkFun!
#
# Qwiic pHAT v2.0
# https://www.sparkfun.com/products/15945
#
# You can also use any button but you would need to wire it up
# instead of stacking the pHAT on your Pi.
#
# LICENSE: This code is released under the MIT License (http://opensource.org/licenses/MIT)
#
# Distributed as-is; no warranty is given
#
# -----------------------------------------------------------------------------
import time
import RPi.GPIO as GPIO
# Pin definition
shutdown_pin = 17
# Suppress warnings
GPIO.setwarnings(False)
# Use "GPIO" pin numbering
GPIO.setmode(GPIO.BCM)
# Use built-in internal pullup resistor so the pin is not floating
GPIO.setup(shutdown_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# modular function to shutdown Pi
def shut_down():
print "shutting down"
command = "/usr/bin/sudo /sbin/shutdown -h now"
import subprocess
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output = process.communicate()[0]
print output
# Check button if we want to shutdown the Pi safely
while True:
# For troubleshooting, uncomment this line to output buton status on command line
#print GPIO.input(shutdown_pin)
if GPIO.input(shutdown_pin)== False:
shut_down()
Setting Up the Path
This will be saved in your Downloads folder. Once downloaded, you'll need to move the Python script to the /home/pi. To do that, open the command line. Move to the Downloads folder with the following command.
language:bash
cd Downloads
We'll use the mv Linux command to move the file to a certain location (in this case /home/pi) with the following command:
language:bash
mv shutdown_Pi.py /home/pi
Just to make sure that the file was moved correctly, use the change directory command to move back up a level:
language:bash
cd ..
Followed by the list command to see what's in the path. If you look closely at the images above, it was used to verify what was in the location. You should notice the shutdown_Pi.py file in the location.
language:bash
ls
Modify rc.local
How to Run a Raspberry Pi Program on Startup
September 18, 2018
With the terminal still open, type the following command:
language:bash
sudo nano /etc/rc.local
Scroll down using the ↓ button on your keyboard, and just before the exit 0
line, enter the following:
language:bash
python /home/pi/safe_shutdown_Pi.py &
Save and exit by pressing CTRL + X on your keyboard, followed by y when prompted, and then hit Enter. To ensure that the changes take effect, type the following command.
language:bash
sudo reboot
What You Should See
After rebooting, hit the GPIO17 button on the Qwiic pHAT v2.0. This should shutdown the Pi. You'll notice the monitor disconnect if you have one attached but make sure to give it a few more seconds to finish shutting down before removing power. The green status LED on the Pi will stop blinking when it is completely shutdown.
You can now safely remove power from the Pi. To power your Pi again, just insert the power connector back into the Pi.
Example 2: Safe Reboot and Shutdown
Sweet. But what if you wanted more functionality from just one button? How about we add a condition to distinguish between a momentary button press to reboot or when it is pressed for a certain period of time to shutdown? We can reboot the Pi by switching from the halt (-h
) to reboot (-r
) command.
language:bash
sudo shutdown -r -now
The following example loads another Python script on startup. The Raspberry Pi will safely reboot or shutdown with the commands depending on how long we press on the button connected to GPIO17.
Example Code
On your Raspberry Pi, download the Python script by clicking on the button below.
You can also copy the code and paste it in a text editor. Just make sure to name this file as safe_restart_shutdown_Pi.py and remember the location that the file was saved.
language:python
# safe_restart_shutdown_Pi.py
#
# -----------------------------------------------------------------------------
# Raspberry Pi Safe Restart and Shutdown Python Script
# -----------------------------------------------------------------------------
# WRITTEN BY: Ho Yun "Bobby" Chan
# @ SparkFun Electronics
# DATE: 3/31/2020
#
# Based on code from the following blog and tutorials:
#
# Kevin Godden
# https://www.ridgesolutions.ie/index.php/2013/02/22/raspberry-pi-restart-shutdown-your-pi-from-python-code/
#
# Pete Lewis
# https://learn.sparkfun.com/tutorials/raspberry-pi-stand-alone-programmer#resources-and-going-further
#
# Shawn Hymel
# https://learn.sparkfun.com/tutorials/python-programming-tutorial-getting-started-with-the-raspberry-pi/experiment-1-digital-input-and-output
#
# ==================== DESCRIPTION ====================
#
# This python script takes advantage of the Qwiic pHat v2.0's
# built-in general purpose button to safely reboot/shutdown you Pi:
#
# 1.) If you press the button momentarily, the Pi will reboot.
# 2.) Holding down the button for about 3 seconds the Pi will shutdown.
#
# ========== TUTORIAL ==========
# For more information on running this script on startup,
# check out the associated tutorial to adjust your "rc.local" file:
#
# https://learn.sparkfun.com/tutorials/
#
# ========== PRODUCTS THAT USE THIS CODE ==========
#
# Feel like supporting our work? Buy a board from SparkFun!
#
# Qwiic pHAT v2.0
# https://www.sparkfun.com/products/15945
#
# You can also use any button but you would need to wire it up
# instead of stacking the pHAT on your Pi.
#
# LICENSE: This code is released under the MIT License (http://opensource.org/licenses/MIT)
#
# Distributed as-is; no warranty is given
#
# -----------------------------------------------------------------------------
import time
import RPi.GPIO as GPIO
# Pin definition
reset_shutdown_pin = 17
# Suppress warnings
GPIO.setwarnings(False)
# Use "GPIO" pin numbering
GPIO.setmode(GPIO.BCM)
# Use built-in internal pullup resistor so the pin is not floating
GPIO.setup(reset_shutdown_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# modular function to restart Pi
def restart():
print "restarting Pi"
command = "/usr/bin/sudo /sbin/shutdown -r now"
import subprocess
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output = process.communicate()[0]
print output
# modular function to shutdown Pi
def shut_down():
print "shutting down"
command = "/usr/bin/sudo /sbin/shutdown -h now"
import subprocess
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output = process.communicate()[0]
print output
while True:
# For troubleshooting, uncomment this line to output buton status on command line
#print GPIO.input(reset_shutdown_pin)
if GPIO.input(reset_shutdown_pin) == False:
counter = 0
while GPIO.input(reset_shutdown_pin) == False:
counter += 1
time.sleep(0.5)
# long button press
if counter > 4:
shut_down()
#if short button press, restart!
restart()
Setting Up the Path
This will be saved in your Downloads folder again. Once downloaded, you'll need to move the Python script to the /home/pi. To do that, open the command line. Move to the Downloads folder with the following command.
language:bash
cd Downloads
We'll use the mv
Linux command to move the file with the following command once again:
language:bash
mv safe_restart_shutdown_Pi.py /home/pi
Just to make sure that the file was moved correctly, use the change directory command to move back up a level:
language:bash
cd ..
Followed by the list command:
language:bash
ls
Modify rc.local
How to Run a Raspberry Pi Program on Startup
September 18, 2018
With the terminal still open, type the following command again:
language:bash
sudo nano /etc/rc.local
Scroll down using the ↓ button on your keyboard, and just before the exit 0
line, adjust the file name for safe_restart_shutdown_Pi.py:
language:bash
python /home/pi/safe_restart_shutdown_Pi.py &
Save and exit by pressing CTRL + X on your keyboard, followed by y when prompted, and then hit Enter
To ensure that the changes take effect, type the following command.
language:bash
sudo reboot
What You Should See
After rebooting, hit the GPIO17 button momentarily on the qwiic pHAT v2.0. This should reboot the Pi.
Press and hold GPIO17 button a little longer to initiate the shutdown command. You'll need to give it a few seconds for the Pi to shutdown. You'll notice the monitor disconnect first if you have one attached. At this point, you should be good to remove your finger off the button. Again, you will want to observe the green status LED on the Pi. The LED will stop blinking when the Pi is completely shutdown. You can now safely remove power from the Pi.
Resources & Going Further
For more resources, check out the links below:
- eLinux.org Wiki: Wake from Halt - For certain versions, you can wake the Pi up by shorting pins together rather than disconnecting the power supply. However, caution is advised as these GPIO pins are adjacent to the power pins.
Need some inspiration for your next project? Check out the Pi AVR Programmer! We implement a shutdown code after programming and testing boards.
Raspberry Pi Stand-Alone Programmer
March 8, 2018
Pi AVR Programmer HAT Hookup Guide
July 26, 2018
Or check out some of these related tutorials:
Getting Started with the Raspberry Pi Zero Wireless
How to Run a Raspberry Pi Program on Startup
Qwiic Atmospheric Sensor (BME280) Hookup Guide
Basic Servo Control for Beginners
learn.sparkfun.com | CC BY-SA 3.0 | SparkFun Electronics | Niwot, Colorado