我想打开,保持打开状态6秒钟,每5分钟关闭一个继电器,其余代码正常运行。
例如:
GPIO.output(18, 1)
sleep(6)
GPIO.output(18, 0)
sleep(300)
但没有其他程序堆栈在此延迟。我的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)
答案 0 :(得分:4)
线程提供了一种方便的方法。我通常创建一个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()
答案 1 :(得分:3)
除了建议的线程方法,您还可以使用python信号模块使用中断。中断比线程更便宜,这可能更适合您选择的平台。
您可以在此处找到更多示例:https://docs.python.org/2/library/signal.html
举个例子:
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)
答案 2 :(得分:0)
您可以将此逻辑放在不同的线程中。将停止冻结您的程序,不会影响它的工作流程。