You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配PyQt5秒表程序以支持GPIO按键输入

实现思路指导:PyQt5计时器对接GPIO硬件按键

一、GPIO基础配置与依赖准备

  • 选用RPi.GPIO或gpiod库(推荐后者,适配现代Linux系统)操作GPIO引脚
  • 初始化GPIO时设置BCM引脚编号模式(与你给出的引脚编号匹配)
  • 针对不同按键的电平特性配置引脚:
    • 启动按键(start_pins):设置为上拉输入(常态HIGH,按下时LOW)
    • 重置按键(reset_pins):设置为下拉输入(常态LOW,按下时HIGH)
    • 紧急停止按键(stop_pin):根据锁存式按键的实际电平逻辑,配置为上拉/下拉输入,需处理状态保持

二、引脚与计时器的映射关联

  • 将start_pins、reset_pins按顺序与11个StopWatch实例一一绑定,确保顺序对应工位1到工位11:
    start_pins = [14,15,18,23,24,25,8,7,12,10,11]
    reset_pins = [4,17,27,22,10,9,11,5,6,13,19]
    # 在MainWindow初始化时绑定对应关系
    for idx, timer in enumerate(self.timers):
        timer.start_pin = start_pins[idx]
        timer.reset_pin = reset_pins[idx]
    
  • 紧急停止引脚为全局控制,直接在MainWindow中处理

三、GPIO事件监听与Qt事件循环兼容

  • 避免阻塞Qt主循环,使用GPIO库的边缘触发中断替代轮询:
    • 启动按键:监听FALLING边缘(HIGH→LOW,对应按下动作)
    • 重置按键:监听RISING边缘(LOW→HIGH,对应按下动作)
    • 紧急停止按键:监听BOTH边缘,捕获锁存状态变化
  • 通过QMetaObject.invokeMethod将GPIO中断回调转到Qt主线程执行,避免跨线程操作UI:
    def start_button_callback(pin):
        target_timer = next(t for t in self.timers if t.start_pin == pin)
        QMetaObject.invokeMethod(target_timer, "start", Qt.QueuedConnection)
    

四、按键逻辑适配原程序规则

  • 启动按键:触发时直接调用对应StopWatch的start()方法,原方法已处理运行状态判断,无需额外修改
  • 重置按键:
    • 回调中先判断对应计时器的可重置状态(比如读取is_running或参考原程序的重置按钮启用逻辑),仅满足条件时调用reset()
    • 重置完成后,暂时移除该引脚的中断监听,直到下一次启动按键触发后重新添加,对应原程序“重置后不可再次点击”的规则
  • 紧急停止按键:
    • 回调中遍历所有StopWatch实例,调用stop()方法
    • 记录按键锁存状态,避免重复触发停止操作

五、原程序的小调整建议

  • 移除StopWatch类中的按钮组件(start_button、stop_button、reset_button)及相关布局代码,保留核心计时、状态控制方法
  • 将原按钮的启用/禁用逻辑,替换为GPIO中断的添加/移除逻辑,比如重置后移除对应重置引脚的监听,启动时恢复监听

内容的提问来源于stack exchange,提问作者user12485898

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:25:05