You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

树莓派GPIO按钮脚本修改:解决持续触发及GPIO输入反转需求

解决GPIO按钮触发重复执行与输入反转问题

首先,我们来拆解你的两个核心需求:防止按钮按下后持续激活目标脚本,以及实现GPIO输入反转。下面是修改后的完整代码,之后我会一步步解释关键改动:

#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
import os

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
# 配置GPIO15为输入,同时启用内部上拉电阻(输入反转的核心设置)
GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def trigger_target_script(channel):
    # 仅在按钮按下时触发一次目标脚本
    print("检测到按钮按下,执行目标脚本...")
    os.system("python /home/pi/gpio.py")

# 绑定边缘检测:启用上拉后,按钮按下时电平从高变低,所以监听FALLING边缘
# bouncetime设为200毫秒,过滤按钮机械抖动导致的误触发
GPIO.add_event_detect(15, GPIO.FALLING, callback=trigger_target_script, bouncetime=200)

try:
    # 保持脚本持续运行,等待按钮事件
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    # 按下Ctrl+C时清理GPIO资源,避免后续警告
    GPIO.cleanup()

关键改动说明

1. 解决持续激活脚本的问题

原代码用wait_for_edge后直接执行脚本,容易因按钮抖动或循环逻辑导致重复触发。改用事件绑定的方式更可靠:

  • GPIO.add_event_detect会在检测到指定边缘时,仅调用一次回调函数trigger_target_script
  • bouncetime=200设置防抖时间,过滤按钮机械抖动带来的多次误触发信号
  • 回调函数只在按钮按下的瞬间执行一次,不会持续重复调用目标脚本

2. 实现GPIO输入反转

输入反转本质是改变触发的电平逻辑,这里通过两步实现:

  • 启用内部上拉电阻GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_UP),此时按钮未按下时GPIO15为高电平,按下后接地变为低电平
  • 监听FALLING边缘:原本的RISING是检测低→高的变化,现在改成检测高→低(对应按钮按下的动作),刚好实现输入反转的效果。如果你的按钮是接下拉电阻,可反过来设置PUD_DOWNRISING边缘。

额外优化

  • 添加try-except KeyboardInterrupt块,方便你用Ctrl+C终止脚本时自动清理GPIO资源,避免后续使用GPIO出现警告
  • 移除了原代码中冗余的变量和打印语句,让逻辑更清晰

你可以根据实际按钮的接线情况调整防抖时间(bouncetime单位为毫秒),测试时短按按钮就能验证是否只触发一次目标脚本。

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

火山引擎 最新活动