上手树莓派 Pico 案例之按键消抖【CircuitPython】

591 阅读2分钟

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

我的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("开始运行")