独立于其他命令每5分钟运行一部分代码

时间:2016-08-12 09:06:25

标签: python raspberry-pi3

我想打开,保持打开状态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)

3 个答案:

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

您可以将此逻辑放在不同的线程中。将停止冻结您的程序,不会影响它的工作流程。