我正在使用基于覆盆子的系统来控制某些东西。目前,我只是通过打开和关闭LED进行测试。
我的计划是:按下一个按钮以打开阀门。再次按下按钮将其关闭-但是,如果未按下该按钮,请在设置的时间后将其关闭。我当前的脚本如下:(我知道这不会在第二次按下时关闭LED)
import RPi.GPIO as GPIO # Import Raspberry Pi GPIO library
import time,sched
s = sched.scheduler(time.time, time.sleep)
def button_callback(channel):
print("Button was pushed!")
print(time.time())
GPIO.output(18,GPIO.HIGH)
s.enter(10, 1, turnoff,argument='')
s.run()
def turnoff():
print "LED off"
print(time.time())
GPIO.output(18,GPIO.LOW)
btpin=22
ledpin=18
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(btpin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(ledpin,GPIO.OUT)
GPIO.add_event_detect(btpin,GPIO.RISING,callback=button_callback)
message = input("Press enter to quit\n\n")
GPIO.cleanup()
如果我按下按钮然后不理会任何事情,则LED将在10秒后关闭。但是,如果我再次大按该按钮,则在调度程序完成之前没有任何反应,那么将记录一次新的按下操作。我以为调度程序是在后台旋转的,所以当我再次按下按钮时,回调将再次运行,因此我会收到“按钮被按下”的消息(此后发生的一切都不会产生任何影响因为GPIO 18已经很高,并且在关闭运行之后原本会发生关闭调用的计划。
是否可以使用sched库执行我想要的操作,还是必须使用其他一些技术?我知道我可以通过简单的方式(通过循环查找被按下的按钮而不是注册回调)来完成此操作,或者通过创建新线程在给定时间后拉低GPIO的可能更复杂的方式-但是我不了解sched还是有其他库可以满足我的需要-一种告诉python将来在不干扰其他情况的情况下做一些事情的方法。
(我不需要非常精确的时间-而且,这只是我打算制作更复杂的控制系统的一部分,我设法使用arduino精确地完成了我想做的事情,但这将限制进一步发展)
答案 0 :(得分:1)
感谢@stovfl的提示,我重新编写了代码的第一部分:
import time,threading
def button_callback(channel):
pin=18
print("Button was pushed!")
print(time.time())
GPIO.output(pin,GPIO.HIGH)
t = threading.Timer(10.0, turnoff)
t.start()
它就像我想要的那样工作