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

时间:2019-07-18 10:23:49

标签: raspberry-pi interrupt gpio


您能告诉我在无尽的脚本中捕获 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

因为我的按钮在GPIO4上,所以引脚号为4。 仍然始终使用代码或 @ 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)

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

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用中断?

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)

答案 1 :(得分:0)

看看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)