我正在使用一个基于覆盆子的系统来控制一些东西。目前我只是在打开和关闭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做我想要的,但这将限制进一步的开发)
感谢@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()
它就像我想要的那样工作