Python调度程序阻止中断

2024-04-19 21:57:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我用一个基于覆盆子的系统来控制一些东西。目前,我只是通过打开和关闭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实现了我想要的功能,但这将限制进一步的开发)


Tags: 方法importledgpiotimedefcallback时间
1条回答
网友
1楼 · 发布于 2024-04-19 21:57:11

感谢@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() 

它就像我想要的那样工作

相关问题 更多 >