按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
我的Pi Pico需要一个类似播放Play()的实现,这样就可以控制程序执行还是暂停了。想起来了本科学的按键消抖这个概念。自己就简单写了一个Play()实现的demo。如下文所示
程序说明
- 按一下,开灯
- 再按一下,关灯
- 再按一下,开灯
- 再按一下,关灯
- 再按一下,开灯
- 再按一下,关灯
- 再按一下,开灯
- 再按一下,开灯
- 等等
也就是说,每一次按按键,led的值都会反转一次。
- 当led的值为亮时,开始执行程序。
- 当led的值为灭时,暂停执行程序。
当然这里的例子中,执行程序就是打印输出。
Python相关知识
- 取反
在matlab中,bool类型变量的取反是 ~,即变量 a 若为 True,则 ~a 为 False.
但是在Python中,~是按位取反,因为 True 等价于 1,而False等价于0,所以若变量 a 为 True (即 a = 1), 则 ~a 并不等于 False,而是 -2 (因为a=11111110是-2的补码)。
如果我们想对 变量 a 取反,需要用如下方法:a = bool(1-a) 或者 a = not a
- 不等于
python中不等于的表示方法:Python的表达式写法与【C/C++】类似,不等于符号是【!=】, 代码为:
if a!=b:
print "a不等于b"
源代码
# 按键消抖
import time
import board
import digitalio
led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.GP24)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
while True:
time.sleep(0.2)
if not button.value:
led.value = not led.value
if led.value:
print("正在运行")
else:
print("未开启")
优化
长按情况下不会出现反复开关,只有当手松起后才执行反转led
# 按键消抖【优化】
import time
import board
import digitalio
led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.GP24)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
while True:
if not button.value:
time.sleep(0.1)
if button.value:
led.value = not led.value
if led.value:
print("开始运行")