使用RP2040自制的树莓派pico—— [6/100] 使用按键控制LED灯的亮灭

目录

  • 按键消抖
    • 软件消抖
    • 定时器消抖
    • 程序延时消抖
  • main.py

按键消抖

按键的消抖是指使用软件或硬件方法去除按钮震动或松动引起的多次开关状态变动,使得程序只识别为一次开关状态变动。下面对软件消抖和硬件消抖做一下介绍:

软件消抖

软件消抖是指在程序中对按键的状态进行滤波,去除间隔过短、波动过大的状态变化。常见的软件消抖方法有定时器消抖和程序延时消抖。

定时器消抖

通过在CPU中开启一个定时器,在时间到达后再检测按钮状态,这样可以确保按钮状态已经稳定,达到软件消抖的目的。定时器消抖可以使用硬件定时器(如STM32单片机中的TIM)或者系统定时器(如Arduino中的delay()函数)。

程序延时消抖

在程序中加入一段延时,在其时间范围内检测按键状态的变化,如果变化次数不超过一定次数,则认为按键状态已经稳定,并进行单次触发。延时时间和超限次数可以根据具体实际应用情况去调节,以达到软件消抖的

main.py

以下是树莓派pico使用按键控制LED亮灭的代码,你需要有一个小按键来控制(板载的两个按键一个是重启的EN,一个是选择启动模式的BOOTSEL):

import machine

led = machine.Pin(25, machine.Pin.OUT)
button = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_DOWN)

while True:
    if button.value() == 1:
        led.value(not led.value())
        while button.value() == 1:
            pass

这份代码用起来可能会过于灵敏,因为没有按键消抖的代码,导致按下一次识别成按下了很多次

所以我建议你使用按键都用以下代码:

import machine
import time

led = machine.Pin(, machine.Pin.OUT)
button = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_DOWN)

def debounce(pin):
    state, cntr = 0, 0
    while cntr < 5:
        if pin.value() != state:
            cntr += 1
        else:
            cntr = 0
        state = pin.value()
        time.sleep_ms(5)
    return state

while True:
    if debounce(button) == 1:
        led.value(not led.value())

在以上示例代码中,我定义了一个led引脚和一个button引脚。led引脚设为输出模式,初始值为低电平;button引脚设为输入模式,带下拉电阻,以保证初始状态为低电平。

加入了按键消抖功能的定义debounce()函数,该函数返回按键当前状态。因为按键可能存在机械弹性,可能会震动多次,造成多次按下、抬起的状态。为了减少这样的情况影响,我们可以通过函数判断出按键状态稳定的次数,达到指定次数才返回状态,从而实现对按键反复触发的有效消抖。

在主程序中,调用debounce()函数获取按键状态,如果按键按下,则led引脚的电平状态取反,实现对LED的控制。

需要注意的是,在Pico开发板上,GPIO16对应程序中的16号引脚,GPIO25对应程序中的25号引脚,即我们的板载LED灯。

你可能感兴趣的:(micropython,单片机,stm32,嵌入式硬件)