python中按钮按下和释放之间的时间?
为了区分长按和短按,我尝试在GPIO上从按钮按下开始到按钮按下结束的时间。我想使用回调来立即按下按钮,而不进行轮询。以下是我首先尝试的: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
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值来确定按钮当前是被按下还是刚刚被释放。您也可以记录时间,但仅在从以前记录的时间中减去当前时间之后。如果你自己没有弄明白是什么导致了这个恶作剧,我以后可能会发布一些工作代码!我已经编辑了我的帖子以反映新的代码。谢谢美好的不客气