Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中按钮按下和释放之间的时间?_Python_Raspberry Pi - Fatal编程技术网

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

python中按钮按下和释放之间的时间?,python,raspberry-pi,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

为了区分长按和短按,我尝试在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)

这最终奏效了,但会很快使我的pi崩溃,因为我想我创建了一个循环。有没有其他我忽略的方法来实现这一点?

多亏了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) 

如果您注释掉/删除回调中以GPIO开头的所有内容,并更改GPIO.add_event_detect25,GPIO.RISING,callback=my_callback到GPIO.add_event_detect25,GPIO.BOTH,callback=my_callback到回调函数外,会在按下按钮和释放按钮时产生回调,那会怎么样。由于我注释掉了回调中的所有GPIO,返回的数字是微秒。这产生了按钮按下和按钮释放的回调。是的,这就是我所希望的。我会用它来做这样的事情:当你收到在按下和释放时都发生的回调时,你读取pin值来确定按钮当前是被按下还是刚刚被释放。您也可以记录时间,但仅在从以前记录的时间中减去当前时间之后。如果你自己没有弄明白是什么导致了这个恶作剧,我以后可能会发布一些工作代码!我已经编辑了我的帖子以反映新的代码。谢谢美好的不客气