在无尽的脚本中捕获 GPIO 低状态的最佳方法

Best way to catch Low State of GPIO in an endless script


你能告诉我在无休止的脚本中捕获 GPIO 的低状态(或更准确地说是下降沿)的最佳方法是什么吗?
明确地说,我将 运行 这个 脚本在启动时 (在 bg 中)以及每次用户按下按钮时(连接到这个 GPIO) 这会将此引脚置于 低电平状态 。我想检测它们中的每一个并在每次推送时执行操作。
我已经有了这段代码,但它会消耗很多 CPU 我想...我需要像中断一样的东西:

import RPi.GPIO as GPIO

#Set GPIO numbering scheme to pinnumber
GPIO.setmode(GPIO.BCM)
#setup pin 4 as an input
GPIO.setup(4,GPIO.IN)

# To read the state
While true:
   state = GPIO.input(4)
   if state:
      print('on')
   else:
      print('off')

编辑

Here the pinout by BCM or BOARD, I will work with BCM

如您所知,pin 号是 4,因为我的按钮在 GPIO4 上。 还是一直用你的代码下车,或者用 @jp-jee

的代码不断检测边缘事件

编辑

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

GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.IN)

def Callback(channel):
      print('pushed')

GPIO.add_event_detect(4, GPIO.FALLING, callback = Callback, bouncetime = 300)

while(True):
   time.sleep(1)

现在我的代码打印总是在释放按钮时按下,而当我按下它时什么都不打印...

你试过使用中断吗?

import time
import RPi.GPIO as GPIO

GPIO.setup(4, GPIO.IN)

def Callback(channel):
   state = GPIO.input(channel)
   if state:
      print('on')
   else:
      print('off')

GPIO.add_event_detect(4, GPIO.FALLING, callback = Callback, bouncetime = 300)  

while(True):
   time.sleep(1)

看看the documentation of raspberry-gpio-python

您想要的是 GPIO.add_event_detect(channel, GPIO.RISING) 结合回调函数。 由于您使用的是按钮,因此还需要考虑弹跳。

最后,你会得到这样的结果(取自链接网站):

def my_callback(channel):
    print('This is a edge event callback function!')

GPIO.add_event_detect(channel, GPIO.FALLING, callback=my_callback, bouncetime=200)