Python-调度程序阻止中断

时间:2019-05-01 14:46:52

标签: python raspberry-pi scheduling gpio

我正在使用基于覆盆子的系统来控制某些东西。目前,我只是通过打开和关闭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精确地完成了我想做的事情,但这将限制进一步发展)

1 个答案:

答案 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() 

它就像我想要的那样工作