ESP32 - Micropython ESP-IDF 双线教程 输入捕获KEY防抖高阶
解释按键防抖的原理:
-
抖动现象:当机械开关(如按键)被按下或释放时,由于机械接触的不稳定性,可能会在极短的时间内产生多个快速的状态变化信号。这些状态变化信号(抖动)是不可靠的,不能直接用于程序逻辑。
-
防抖策略:防抖策略的核心思想是在检测到按键状态变化后,不立即响应这个变化,而是等待一段时间(防抖延时),以确保这个变化是真实的、稳定的。如果在这段时间内按键状态没有再次变化,那么可以认为这个变化是真实的,并执行相应的操作。
-
实现方式:在下述的代码中,我们使用了一个定时器来实现防抖。当按键状态发生变化时,我们启动一个定时器,并设置一个标志位
debounce_active
来标记防抖过程正在进行。如果在定时器超时之前按键状态再次发生变化,我们取消当前的定时器并重新启动一个新的定时器。只有在定时器超时后,才认为按键状态已经稳定,并执行相应的操作(例如反转LED状态)。
输入捕获防抖实现 ESP32-Micropython
优化后的代码
from machine import Pin, Timer
import utime
# 假设LED连接到GPIO 2
LED_PIN = 2
# 假设按键连接到GPIO 0
BUTTON_PIN = 0
# 防抖延时时间(毫秒)
DEBOUNCE_TIME_MS = 50
# LED引脚状态
led_state = False
# 按键防抖标志
debounce_active = False
# 按键防抖回调函数
def debounce_callback(timer):
global debounce_active, led_state
debounce_active = False
# 按键状态稳定后,执行LED反转操作
led_state = not led_state
led_pin.value(led_state)
# 按键中断服务例程
def button_irq(pin):
global debounce_active
# 如果防抖定时器正在运行,则重置它
if debounce_active:
debounce_timer.deinit() # 停止定时器
# 重新启动防抖定时器
debounce_timer.init(period=DEBOUNCE_TIME_MS / 1000, mode=Timer.ONE_SHOT, callback=debounce_callback)
debounce_active