标题:
树莓派 SAKS 扩展板实用应用 之 树莓派关机键
[打印本页]
作者:
look_w
时间:
2018-12-14 15:23
标题:
树莓派 SAKS 扩展板实用应用 之 树莓派关机键
本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。
树莓派是精简版的微型电脑,连电源开关都精简掉了。要完成正常的关机和重启的操作,需要通过终端输入关机和重启命令才行。当树莓派没有配备显示器时,登录 SSH 关机更显得颇为麻烦。现在既然有了 SAKS 扩展板,为什么不用上面的轻触开关来实现一个关机和重启的按键功能呢?
本例程中涉及到的 SAKS 扩展板引脚编号如下:
功能
注释
BOARD
编码
BCM
编码
wiringPi
编码
开关组
KEY-K1
轻触开关(右)
16
23
4
LED排灯
LED-D8
LED(黄)
26
7
11
LED-D9
LED(红)
24
8
10
我们将要实现的功能,是将 SAKS 扩展板的 K1 轻触开关改造成树莓派的关机和重启键,同时配以两个 LED 来指示操作状态。
轻触开关1次,进入重启倒计时,黄色 LED 闪烁,倒计时为10秒,倒计时结束后立刻重启。
在重启倒计时过程中再次轻触开关1次,由重启倒计时切换到关机倒计时,红色 LED 闪烁,倒计时结束后立刻关机。
在关机倒计时过程中,再次轻触开关1次,取消倒计时,LED 停止闪烁,系统恢复正常运行。
这样一个按键配上两个 LED 就能实现关机、重启、取消指令的操作了。实现代码如下:
#!/usr/bin/env python# coding=utf-8import RPi.GPIO as GPIOimport timeimport os,sysimport signal#定义关机键和关机状态指示灯的GPIO引脚GPIO.setmode(GPIO.BCM)pin_btn = 23pin_led_reboot = 7pin_led_halt = 8#初始化SAKS上相应按键和LED的状态,按键内部上拉、LED不亮GPIO.setup(pin_btn, GPIO.IN, pull_up_down = GPIO.PUD_UP)GPIO.setup(pin_led_reboot, GPIO.OUT, initial = GPIO.HIGH)GPIO.setup(pin_led_halt, GPIO.OUT, initial = GPIO.HIGH)#初始化按下关机键的次数press_times = 0#按下关机键后等待并倒数10次count_down = 10led_on_reboot = 0led_on_halt = 0def onPress(channel): global press_times, count_down print('pressed') press_times += 1 if press_times > 3: press_times = 1 #重启模式 if press_times == 1: GPIO.output(pin_led_reboot, 0) GPIO.output(pin_led_halt, 1) print('system will restart in %s' % (count_down)) #关机模式 elif press_times == 2: GPIO.output(pin_led_reboot, 1) GPIO.output(pin_led_halt, 0) print('system will halt in %s' % (count_down)) #模式取消 elif press_times == 3: GPIO.output(pin_led_reboot, 1) GPIO.output(pin_led_halt, 1) print 'cancel' count_down = 10#设置按键检测,检测到按下时调用 onPress 函数GPIO.add_event_detect(pin_btn, GPIO.FALLING, callback = onPress, bouncetime = 500)try: while True: #重启模式 if press_times == 1: if count_down == 0: print "start restart" os.system("shutdown -r -t 5 now") sys.exit() led_on_reboot = not led_on_reboot #黄色 LED 闪烁 GPIO.output(pin_led_reboot, led_on_reboot) #关机模式 if press_times == 2: if count_down == 0: print "start shutdown" os.system("shutdown -t 5 now") sys.exit() led_on_halt = not led_on_halt #红色 LED 闪烁 GPIO.output(pin_led_halt, led_on_halt) if press_times == 1 or press_times == 2: count_down -= 1 print "%s second" % (count_down) time.sleep(1)except KeyboardInterrupt: print('User press Ctrl+c, exit;')finally: GPIO.cleanup()接下来运行。
sudo python powerbutton.py将这个脚本设为开机启动,编辑 rc.local:
vim /etc/rc.local在 exit 0 所在行之前插入一行,文件路径需根据实际自行修改:
python /home/pi/powerbutton.py &后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注!
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0