按下按钮时 GPIO 事件检测不给出输出

2024-02-18

以下 python 脚本应该等待按钮按下,打印按钮按下消息,然后退出。

但是,当我按下按钮时,什么也没有打印。然后,当我按回车键时,脚本会打印“检测到按钮按下”然后停止。

我如何修复此代码,以便在按下按钮时打印“检测到按钮按下”?

我按照教程制作了这段代码:

#Button input detection
#by 
#Start date: 11th February 2021
#End date: 11th February 2021

#Importing GPIO andtime libraries as per usual with a python script making use of RPi GPIO
import RPi.GPIO as GPIO
import time

#Callback function to print 'Button push detected' when called
def button_callback(channel):
    print("Button push detected")
    
#Disabling annoying GPIO warnings and setting GPIO mode to board
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#GPIO event detector that detects a rising edge on pin 11
GPIO.add_event_detect(11,GPIO.FALLING,callback=button_callback)

#Command that does not stop until someone presses enter
quit = input("Press enter to quit")

#Clean up the pins used
GPIO.cleanup()

问题是您的脚本需要一个循环,等待按下按钮,以便在检测到按下按钮时,您的脚本将能够对该事件做出反应。

现在,您的脚本设置了事件检测,但随后等待输入,一旦输入完成,您的脚本就会退出。

请参阅此 Raspberry Pi 论坛帖子,https://www.raspberrypi.org/forums/viewtopic.php?t=201747 https://www.raspberrypi.org/forums/viewtopic.php?t=201747

它有一个通过按下按钮来打开和关闭 LED 的程序。

然而,在我看来,如果您希望脚本在按下按钮时结束,您可能需要更改回调函数以引发异常,而不是点亮 LED。

请参阅下面修改后的程序,其中包含一些附加注释以及注释掉的 LED 灯/不亮灯。

然而,这个修改后的程序使用了一个繁忙的循环,它不断运行直到按下按钮。使用繁忙循环虽然适用于像您这样的简单程序,但通常不是一个好主意。

另一种方法是使用GPIO.wait_for_edge()函数将暂停脚本直到按下按钮。看Raspberry Pi StackExchange - 暂停代码执行直到按下按钮 https://raspberrypi.stackexchange.com/questions/99994/pausing-code-execution-till-a-button-is-pressed这消除了繁忙的循环。

首先是繁忙循环版本。

import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

btn_input = 4;     # button to monitor for button presses.
LED_output = 17;   # LED to light or not depending on button presses.

# GPIO btn_input set up as input.
GPIO.setup(btn_input, GPIO.IN)
# GPIO.setup(LED_output, GPIO.OUT)

# handle the button event
def buttonEventHandler_rising (pin):
    # turn LED on
    # GPIO.output(LED_output,True)
    raise Exception('button pressed')
    
def buttonEventHandler_falling (pin):
    # turn LED off
    # GPIO.output(LED_output,False)
    raise Exception('button released')


# set up the event handlers so that when there is a button press event, we
# the specified call back is invoked.
# for your purposes you may only want to detect the falling
# indicating that the button was released.
# GPIO.add_event_detect(btn_input, GPIO.RISING, callback=buttonEventHandler_rising) 
GPIO.add_event_detect(btn_input, GPIO.FALLING, callback=buttonEventHandler_falling)
 
# we have now set our even handlers and we now need to wait until
# the event we have registered for actually happens.
# This is an infinite loop that waits for an exception to happen and
# and when the exception happens, the except of the try is triggered
# and then execution continues after the except statement.
try:  
    while True : pass  
except:
    GPIO.cleanup()      

另请参阅这些论坛帖子中发生的情况的解释

https://www.raspberrypi.org/forums/viewtopic.php?t=128510 https://www.raspberrypi.org/forums/viewtopic.php?t=128510

https://www.raspberrypi.org/forums/viewtopic.php?t=141520 https://www.raspberrypi.org/forums/viewtopic.php?t=141520

这篇文章是关于 python 中的异常。https://realpython.com/python-exceptions/ https://realpython.com/python-exceptions/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按下按钮时 GPIO 事件检测不给出输出 的相关文章

随机推荐

  • apache Spark sql 中的缓存表

    来自 Spark 官方document http spark apache org docs latest sql programming guide html caching data in memory 它说 Spark SQL 可以通
  • 如何在 Javascript 循环中重新绘制 HTML 元素?

    我有一些 Javascript 可以在 HTML 元素上 动画 颜色变化 如下所示 var element document getElementById someid while i lt 255 element style color
  • 仅通过 GDI+ 和 DotNet 指定大小来创建 Dib

    我最近刚刚发现 GDI 中不同构造函数之间的差异 去 var bmp new Bitmap width height pixelFormat 创建 DDB 设备相关位图 而 var bmp new Bitmap someFile 创建 DI
  • 字符串必须正好是一个字符长

    我有一个我认为很简单的问题 由于某种原因 以下代码生成异常 字符串必须恰好是一个字符长 int n 0 foreach char letter in charMsg Get the integral value of the charact
  • 2D 循环卷积与卷积 FFT [Matlab/Octave/Python]

    我试图理解 FTT 和卷积 互相关 理论 因此我创建了以下代码来理解它 代码是 Matlab Octave 但我也可以用 Python 来完成 In 1D x 5 6 8 2 5 y 6 1 3 5 1 x1 x zeros 1 4 y1
  • Android DataBinding 泄漏内存

    我正在使用数据绑定并且我已经声明了lateinit var对于绑定以及当我要使用不同的片段 Leaky canary 显示泄漏时 Fragment class HomeFragment BottomNavViewHostBaseFragme
  • SemaphoreSlim.WaitAsync 延续代码

    我的理解await关键字是下面的代码await合格的语句在完成后将作为该语句的延续运行 因此以下两个版本应该产生相同的输出 public static Task Run SemaphoreSlim sem TraceThreadCount
  • VSCode 中的 Python 路径

    我在 Mac OSX 10 14 2 上安装了 Anaconda 发行版 有了它 我安装了 VSCode 我将用它来编写 python 脚本 最近 我更新了 Anaconda 中的一些环境 VSCode 用于其集成终端的 python 路径
  • 为不同语言生成不同的 docpad 集合

    我想调整我的多语言 DocPad 博客 以便以 ru md 结尾的页面进入 ru 目录 以 en md 结尾的页面进入 en 目录 假设这是初始结构 src pages page1 ru md page1 en md page2 ru md
  • 如何检查json数组是否有值?

    我正在使用条件 if obj2 getString patronCheckoutInfo equals null 但它不适用于数组获取值的情况 例如 情况 1 当 json 获取 patronCheckoutInfo 的值时 ErrorMe
  • Python中的时间范围重叠算法

    我有一个包含不同 ID 开始日期和结束日期的列表 让我们说 5 d datetime 2010 9 19 0 0 0 d datetime 2010 9 19 0 5 10 6 d datetime 2010 9 19 0 0 0 d da
  • 如何在远程存储库上运行 Git 命令

    我正在尝试编写一个简单的 PHP 应用程序 它将使用终端命令从远程 Git 存储库检索一些信息 我不想创建本地工作副本或存储库 我只想从远程存储库读取信息 浏览树 提交历史记录 文件差异 下载文件 因此它将是只读连接 我需要做的是运行一系列
  • 标准加密文件格式有哪些?

    我对加密文件格式有点困惑 假设我想使用 AES 256 加密文件 我通过加密算法运行该文件 现在有了一个加密字节流 显然 我可以将该字节流写入文件 但任何第三方加密应用程序都不会理解它 因为它不期望只是原始的加密字节流 我可以将其写入什么文
  • 控制台应用程序中的命令行当前工作目录[重复]

    这个问题在这里已经有答案了 可能的重复 如何找出我的控制台应用程序在 C 中运行的目录 https stackoverflow com questions 97312 how do i find out what directory my
  • 如何对齐和居中输入字段?

    我有一个 HTML 表单 输入字段已经居中 但它们没有垂直对齐 我想让所有标签和输入垂直对齐 以便所有标签都在同一垂直线上 并且所有输入都在同一垂直线上 到目前为止 我所拥有的只是 div 内的字段 div class container
  • 更好的 Django 管理 ManyToMany 字段小部件

    我找到了 Django Admin 的默认设置models ManyToManyField小部件使用起来很麻烦 这是HTML 选择 http www htmlcodetutorial com forms SELECT MULTIPLE ht
  • mysql.server 启动时出现 PID 错误?

    我刚刚尝试使用自制程序 在 Mac OS X 10 6 上 安装 MySQL 但我在第一个障碍时遇到了问题 当尝试手动启动服务器 mysql server start 时 出现以下错误 ERROR Manager of pid file q
  • 在 CSS 中将内部 div 与右下对齐

    将我的内部 div 放在右下角的最简单方法是什么 div style width 200px height 200px border 3px FF6666 solid div style font weight bold text alig
  • 使用 RxJS 从多个 API 调用构建数据

    我试图更好地了解如何使用 RxJS 运算符来解决我遇到的特定问题 我实际上有两个问题 但它们很相似 我正在从 API 端点获取一堆文档 api v3 folders folderId documents我已经设置了具有执行此操作的功能的服务
  • 按下按钮时 GPIO 事件检测不给出输出

    以下 python 脚本应该等待按钮按下 打印按钮按下消息 然后退出 但是 当我按下按钮时 什么也没有打印 然后 当我按回车键时 脚本会打印 检测到按钮按下 然后停止 我如何修复此代码 以便在按下按钮时打印 检测到按钮按下 我按照教程制作了