「要是 Raspberry Pi 有關機按鍵,不知道有多好。上次因為忘了下指令關機,就直接把電源拔掉,結果害 SD 卡上的資料損壞,OS 重灌還算小事,更嚴重的是搞了好幾天的程式跟設定檔全沒了。」
事前準備
- Raspberry Pi * 1
- 按鈕開關 (Power Switch Button) * 1
- 杜邦線 (Dupont line),規格是公對母 * 2
按鈕開關就選順手好按、接線方便為主就可以了,造型或大小就看各人喜好。
杜邦線很容易買,因為我們要接兩支 GPIO 腳,所以兩條就夠了。
也可以直接買現成的電腦 Power 或 Reset 開關線,我是直接拆故障 PC 機殼的開關來用。
連接硬體線路
我們把其中一條杜邦線母頭插在 Raspberry Pi 的 GPIO 3,公頭黏在按鈕開關的正極;另一條線的母頭插在 GPIO 3 上方的 Ground 接地,再把公頭黏在按鈕開關的負極。
這是 Raspberry Pi Model A / B 的 GPIO 的腳位圖。
這是 Raspberry Pi Zero / A+ / B+ / 2B / 3B 的腳位圖。
GPIO 3 是正極,通常是接有顏色的線,GND 是負極,習慣上會用白色的線。
輸入程式指令
新增一支 Python 程式來讓 GPIO 讀取 Power 開關的動作。
sudo vi /usr/local/bin/halt.py
輸入下列程式碼。
##### 我是分隔線 #####
#!/usr/bin/env python
# Import Libraries
import RPi.GPIO as GPIO
import subprocess
# Define GPIO Pin Number
gpioPin=3
# Define GPIO Function
GPIO.setmode(GPIO.BCM)
GPIO.setup(gpioPin, GPIO.IN)
GPIO.wait_for_edge(gpioPin, GPIO.FALLING)
# Command
subprocess.call(['shutdown', '-h', 'now'], shell=False)
##### 我是分隔線 #####
新增一支 Shell Script 讓我們方便管理。
sudo vi /etc/init.d/listening-for-shutdown.sh
輸入下列程式碼。
##### 我是分隔線 #####
#! /bin/sh
### BEGIN INIT INFO
# Provides: listen-for-shutdown.py
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
case "$1" in
start)
echo "Starting listening-for-shutdown"
sudo python /usr/local/bin/halt.py &
;;
stop)
echo "Stopping listening-for-shutdown"
sudo killall python
;;
*)
echo "Usage: service listening-for-shutdown {start|stop}"
exit 1
;;
esac
exit 0
##### 我是分隔線 #####
讓程式在開機後自動啟動。
sudo update-rc.d listening-for-shutdown.sh defaults
也可以手動啟動服務。
sudo /etc/init.d/listening-for-shutdown.sh start
功能實測
有圖有真相,我們直接看一下實際使用的狀況。
我從 Mac 這邊一直 ping 它的 IP,可以看到本來是沒有回應,開機起來之後,才收到回應的封包;接著按下按鈕,它開始執行關機指令,所以就又變成 ping 不到了。
同場加映:改成 Reset 鍵
其實這個動作超級簡單,看得懂 Linux 指令的朋友應該都辦得到。
在 Python 程式碼的最後一行,執行的就是關機指令,我們只要把「-h」改成「-r」就行了。
subprocess.call(['shutdown', '-r', 'now'], shell=False)
參考資料
圖片來源
- https://pixabay.com/
- http://www.itweba.com/zh-TW/category/12mm-/A0201.html
- https://ezprice.com.tw/s/%E9%96%8B%E9%97%9C%E7%B7%9A/price/
更新紀錄
- 2017/03/13 發文。
謝謝提供這有用的訊息,請問是否可以用來開機?
回覆刪除很遺憾,答案是「不行」...
刪除因為這個關機功能的原理是啟動一個背景服務在等到按鈕的動作,所以沒開機的狀況,當然沒有任何服務來運作。
要實現開機的功能也很簡單,就直接用帶開關的 USB Hub 就可以啦,樹莓派偵測到有電源時,就會開機啦!
如果關機後在沒有移除PI的電源時按下還是會啟動PI
回覆刪除