陪你一起玩树莓派-按键

在控制电路中,设备的启停、参数的设置都离不开按键操作,所以按键的处理也是很重要的一个环节。

常用按键

一、在本节课中我们会讲到两个重要的概念

1、中断处理

中断就是CPU正常运行期间,由于内、外部事件引起的CPU暂时停止正在运行的程序,去执行该内部事件或外部事件的引起的服务中去,服务执行完毕后再返回断点处继续执行的情形。这样的中断机制极大的提高了CPU运行效率。

2、按键防抖

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。

按键的消抖,可用硬件或软件两种方法:

硬件消抖

在键数较少时可用硬件方法消除键抖动。

软件消抖

如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

二、实验前准备

1、面包板 x 1

2、轻触按键 x 2

3、10K电阻 x 2

4、杜邦线若干

5、发光二极管 x 1

三、原理图

注意:上一节我们的led的正极是接在gpio.18上,通过gpio.18 设置为高电平点亮。本节我们的led正极接在3.3v上,通过gpio.18设置低电平点亮.

按键说明:2个按键一端接在3.3v上,另一端分别接在GPIO.05和GPIO.06上,同时用两个10K的电阻从GPIO端接到GND上(用作下拉电阻)

四、实验目的

1、通过一个按键控制led亮灭

2、通过两个按键控制led的亮灭

五、程序代码

1、一个按键控制

#!/usr/bin/python3
# 导入树莓派GPIO库,为了方便操作,我们定义一个GPIO的别名
import RPi.GPIO as GPIO
import time
key_up = 6
key_down = 5
led = 18
global ledStatus
ledStatus = True
def init():
# 设置GPIO的引脚编码方式,这里我们选用BCM编码方式,相应的引脚也要按BCM设置
GPIO.setmode(GPIO.BCM)
# 设置忽略警告信息
GPIO.setwarnings(False)


# 定义按键引脚
# 设置按键对应的GPIO为输入模式并且设置为下拉模式
GPIO.setup(key_up, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(key_down, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
# 设置led引脚,设置GPIO为输出模式
GPIO.setup(led, GPIO.OUT)
# 按键设置中断,第一个参数:gpio编号,第二个:触发方式,第三个:回调方法,第四个:软件消抖时间
GPIO.add_event_detect(key_up, GPIO.RISING, callback=on_key_up, bouncetime=200)
GPIO.add_event_detect(key_down, GPIO.RISING, callback=on_key_down, bouncetime=200)
# 按键回调方法
def on_key_up(channel):
print('up')
global ledStatus
ledStatus = not ledStatus
GPIO.output(led, ledStatus)
def on_key_down(channel):
print('down')
# 初始化
init()
GPIO.output(led, GPIO.HIGH)
try:
while 1:
pass
except Exception as e:
print(e)

2、两个按键控制

#!/usr/bin/python3
# 导入树莓派GPIO库,为了方便操作,我们定义一个GPIO的别名
import RPi.GPIO as GPIO
import time
key_up = 6
key_down = 5
led = 18
def init():
# 设置GPIO的引脚编码方式,这里我们选用BCM编码方式,相应的引脚也要按BCM设置


GPIO.setmode(GPIO.BCM)
# 设置忽略警告信息
GPIO.setwarnings(False)
# 定义按键引脚
# 设置按键对应的GPIO为输入模式并且设置为下拉模式
GPIO.setup(key_up, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(key_down, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
# 设置led引脚,设置GPIO为输出模式
GPIO.setup(led, GPIO.OUT)
# 按键设置中断,第一个参数:gpio编号,第二个:触发方式,第三个:回调方法,第四个:软件消抖时间
GPIO.add_event_detect(key_up, GPIO.RISING, callback=on_key_up, bouncetime=200)
GPIO.add_event_detect(key_down, GPIO.RISING, callback=on_key_down, bouncetime=200)
# 按键回调方法
def on_key_up(channel):
print('up')
GPIO.output(led, 0)
def on_key_down(channel):
print('down')
GPIO.output(led, 1)
init()
GPIO.output(led, GPIO.HIGH)
try:
while 1:
pass
except Exception as e:
print(e)

GPIO.RISING 的意思是上升沿触发

boundcetime=200的意思是不检测200毫秒内的触发,这个就是防抖关键

关注我,陪你一起玩树莓派

欢迎大家把玩树莓派遇到的问题留言,我会一一解答。

下一节,我们一块学习PWM