CircuitPython换挡器按键无法保持按下状态问题求助
换挡器按键持续按住问题解决
你制作换挡器时需要挂入档位后模拟按键持续按下,但当前代码里的keyboard.send()方法只会触发一次按键按下并立即释放,无法实现持续按住的效果。
问题根源
keyboard.send(code)等价于先调用keyboard.press(code)再立刻调用keyboard.release(code),所以只会产生一次短暂的按键信号,而不是持续按住。要实现持续按住,必须手动控制按键的按下和释放时机,同时跟踪按键状态避免重复操作。
解决方案步骤
- 给每个换挡按键添加上拉电阻:实际硬件中换挡按键通常是按下时接地,所以设置
pull = digitalio.Pull.UP,此时按键未按下时value为True,按下时为False(逻辑需对应调整) - 为每个按键维护状态变量,记录当前键盘按键是否处于按住状态
- 循环中检测换挡按键的状态变化,对应执行按下或释放操作
修改后的完整代码
import time import board import digitalio import usb_hid from adafruit_hid.keycode import Keycode from adafruit_hid.keyboard import Keyboard keyboard = Keyboard(usb_hid.devices) # 定义换挡按键并配置上拉输入 btn_pins = [board.GP0, board.GP1, board.GP2, board.GP3, board.GP4, board.GP5, board.GP6, board.GP7, board.GP8] shift_buttons = [] for pin in btn_pins: btn = digitalio.DigitalInOut(pin) btn.direction = digitalio.Direction.INPUT btn.pull = digitalio.Pull.UP # 上拉电阻,未按下时value为True,按下为False shift_buttons.append(btn) # 对应每个换挡按键的键盘码(可替换为你需要的按键编码) key_codes = [Keycode.A, Keycode.B, Keycode.C, Keycode.D, Keycode.E, Keycode.F, Keycode.G, Keycode.H, Keycode.I] # 初始化按键状态:False表示未按住对应键盘按键 key_held = [False] * len(shift_buttons) while True: for i in range(len(shift_buttons)): btn = shift_buttons[i] current_key = key_codes[i] # 换挡按键被按下且对应键盘按键未被按住 if not btn.value and not key_held[i]: keyboard.press(current_key) key_held[i] = True # 换挡按键松开且对应键盘按键处于按住状态 elif btn.value and key_held[i]: keyboard.release(current_key) key_held[i] = False time.sleep(0.01) # 短暂延迟降低CPU占用
代码说明
- 用列表批量管理按键和对应键盘码,减少重复代码
key_held列表跟踪每个键盘按键的按住状态,防止循环中重复调用press()导致异常- 若你的硬件是下拉触发(未按下时
value为False),只需将判断逻辑中的not btn.value改为btn.value即可
内容的提问来源于stack exchange,提问作者mitko
相关产品推荐
相关产品推荐

