Python 每5分钟独立于其他命令运行一部分代码
我想打开,保持打开6秒,每5分钟关闭一个继电器,而其余代码正常运行 例如:Python 每5分钟独立于其他命令运行一部分代码,python,raspberry-pi3,Python,Raspberry Pi3,我想打开,保持打开6秒,每5分钟关闭一个继电器,而其余代码正常运行 例如: GPIO.output(18, 1) sleep(6) GPIO.output(18, 0) sleep(300) 但是在这个延迟中没有rest程序堆栈。我的Python代码是: import RPi.GPIO as GPIO from time import sleep GPIO.setmode(GPIO.BOARD) GPIO.setup(13, GPIO.IN, GPIO.PUD_UP) GPIO.setup(
GPIO.output(18, 1)
sleep(6)
GPIO.output(18, 0)
sleep(300)
但是在这个延迟中没有rest程序堆栈。我的Python代码是:
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BOARD)
GPIO.setup(13, GPIO.IN, GPIO.PUD_UP)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(37, GPIO.OUT)
Hologram = '/home/pi/Hologram/Hologram.mp4'
from subprocess import Popen
firstTimeOpen=0
while True:
doorIsOpen = GPIO.input(13)
if doorIsOpen==0 and firstTimeOpen == 0:
firstTimeOpen=1
GPIO.output(7, 0)
GPIO.output(37, 0)
sleep(0.5)
if doorIsOpen==1 and firstTimeOpen == 1:
GPIO.output(7, 1)
GPIO.output(37, 1)
omxp = Popen(['omxplayer' ,Hologram])
sleep(87)
GPIO.output(7, 0)
GPIO.output(37, 0)
firstTimeOpen=0
sleep(0.5)
您可以将此逻辑放在不同的线程中。将停止冻结您的程序,并且不会影响其工作流程 线程提供了一种方便的方法。我通常创建一个
threading.Thread
子类,它的run
方法是在单独的线程中运行的代码。所以你会想要一些类似的东西:
class BackgroundRunner(threading.thread):
def run(self):
while True:
GPIO.output(18, 1)
sleep(6)
GPIO.output(18, 0)
sleep(300)
然后,在开始运行主代码之前,使用
bg_runner = BackgroundRunner()
bg_runner.start()
除了建议的线程方法外,还可以使用python信号模块使用中断。中断比线程便宜,线程可能更适合您选择的平台 您可以在此处找到更多示例: 例如:
import signal, os
def handler(signum, frame):
print 'Signal handler called with signal', signum
handler.counter += 1
if not handler.counter % (300 / 6):
GPIO.output(18, 0)
else:
GPIO.output(18, 1)
handler.counter = 0
signal.signal(signal.ITIMER_REAL, handler)
signal.setitimer(signal.ITIMER_REAL, 0, 6)
这并不能回答这个问题。一旦你赢得了足够的声誉,你就可以对任何帖子发表评论。相反,提供不需要提问者澄清的答案。不幸的是,我是Python新手,我不知道如何才能做到这一点。你能告诉我之后代码是如何形成的吗?我上面的答案表示非常抱歉没有为代码提供答案。我当时无法写这篇文章,这是一个非常直截了当的问题。如果你通过谷歌搜索和你的代码,你会自己找到答案。下次请小心,先自己试试。signal.signal(signal.ITIMER\u REAL,handler)value错误:信号号超出范围