Skip to content

Instantly share code, notes, and snippets.

@bboyho
Last active March 19, 2021 18:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bboyho/fc5144b4d0b93487529869f63650430a to your computer and use it in GitHub Desktop.
Save bboyho/fc5144b4d0b93487529869f63650430a to your computer and use it in GitHub Desktop.
# safe_shutdown_interrupt_Pi.py
#
# -----------------------------------------------------------------------------
# Raspberry Pi Safe Shutdown Python Script
# -----------------------------------------------------------------------------
# WRITTEN BY: Ho Yun "Bobby" Chan
# @ SparkFun Electronics
# MODIFIED: 3/18/2021
# 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
#
# Ben Croston raspberry-gpio-python module
# https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/
#
# ==================== DESCRIPTION ====================
#
# This python script takes advantage of the Qwiic pHat v2.0's
# built-in general purpose button to safely shutdown you Pi:
#
# 1.) If you press the button momentarily, the Pi will shutdown.
#
# This example also takes advantage of interrupts so that it uses a negligible
# amount of CPU. This is more efficient since it isn't taking up all of the Pi's
# processing power.
#
# ========== 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/raspberry-pi-safe-reboot-and-shutdown-button
#
# ========== 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 #Python Package Reference: https://pypi.org/project/RPi.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
# if using a momentary push button without a resistor.
#GPIO.setup(shutdown_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Use Qwiic pHAT's pullup resistor so that the pin is not floating
GPIO.setup(shutdown_pin, GPIO.IN)
# 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)
# wait for a button press with switch debounce on the falling edge so that this script
# is not taking up too many resources in order to shutdown the Pi safely
channel = GPIO.wait_for_edge(shutdown_pin, GPIO.FALLING, bouncetime=200)
if channel is None:
print('Timeout occurred')
else:
print('Edge detected on channel', channel)
# For troubleshooting, uncomment this line to output button status on command line
#print('GPIO state is = ', GPIO.input(shutdown_pin))
shut_down()
# 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/raspberry-pi-safe-reboot-and-shutdown-button
#
# ========== 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
# if using a momentary push button without a resistor.
#GPIO.setup(shutdown_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Use Qwiic pHAT's pullup resistor so that the pin is not floating
GPIO.setup(shutdown_pin, GPIO.IN)
# 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:
#short delay, otherwise this code will take up a lot of the Pi's processing power
time.sleep(0.5)
# For troubleshooting, uncomment this line to output buton status on command line
#print('GPIO state is = ', GPIO.input(shutdown_pin))
if GPIO.input(shutdown_pin)== False:
shut_down()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment