ESP32 - Micropython ESP-IDF 双线教程 输入捕获KEY防抖高阶(2)

解释按键防抖的原理:

  1. 抖动现象:当机械开关(如按键)被按下或释放时,由于机械接触的不稳定性,可能会在极短的时间内产生多个快速的状态变化信号。这些状态变化信号(抖动)是不可靠的,不能直接用于程序逻辑。

  2. 防抖策略:防抖策略的核心思想是在检测到按键状态变化后,不立即响应这个变化,而是等待一段时间(防抖延时),以确保这个变化是真实的、稳定的。如果在这段时间内按键状态没有再次变化,那么可以认为这个变化是真实的,并执行相应的操作。

  3. 实现方式:在下述的代码中,我们使用了一个定时器来实现防抖。当按键状态发生变化时,我们启动一个定时器,并设置一个标志位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 
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

San_jin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值