按下按钮和释放python之间的时间?

时间:2016-03-17 23:41:55

标签: python raspberry-pi

我正在尝试从按下按钮开始到GPIO按下按钮结束的时间(为了区分长按和短按)。我想使用回调来立即按下按钮而不进行轮询。以下是我首先尝试的内容:

import RPi.GPIO as GPIO
import time

def my_callback(channel):
    start = time.time()
    GPIO.add_event_detect(25, GPIO.FALLING)
    end = time.time()
    elapsed = end - start
    print(elapsed)

GPIO.add_event_detect(25, GPIO.RISING, callback=my_callback)

#while other stuff is running

在运行此程序时,我得到:

  

RunTimeError:已为此GPIO通道启用了冲突边缘检测。

因为我无法进行投票,所以我尝试了:

def my_callback(channel):
    GPIO.remove.event.detect(25)
    start = time.time()
    GPIO.add_event_detect(25, GPIO.FALLING)
    end = time.time()
    elapsed = end - start
    print(elapsed)    

GPIO.add_event_detect(25, GPIO.RISING, callback=my_callback)

这只运行一次,但不可重复,因为我正在删除事件检测并重新定义它。因此,我尝试在回调中恢复事件检测:

def my_callback(channel):
    GPIO.remove.event.detect(25)
    start = time.time()
    GPIO.add_event_detect(25, GPIO.FALLING)
    end = time.time()
    elapsed = end - start
    print(elapsed) 
    GPIO.remove.event.detect(25)   
    GPIO.add_event_detect(25, GPIO.RISING, callback=my_callback)

GPIO.add_event_detect(25, GPIO.RISING, callback=my_callback)

这终于奏效了,但我会快速崩溃,因为我认为我创建了一个环回。还有另一种方法可以实现这一点,我忽略了吗?

1 个答案:

答案 0 :(得分:2)

感谢jDo,这里的代码是可行的

def my_callback(channel):
    global start
    global end
    if GPIO.input(25) == 1:
        start = time.time()
    if GPIO.input(25) == 0:
        end = time.time()
        elapsed = end - start
        print(elapsed)

  GPIO.add_event_detect(25, GPIO.BOTH, callback=my_callback, bouncetime=200)