Python:在GPIO PIN状态变化时维护操作计时器



我有一个相当奇怪的脚本挑战。我有一个提取单元,我正在尝试通过Python脚本和常规继电器来控制。继电器使用GPIO BCM引脚15连接到我的RPI 3模型B,它是接地的,并从PI的VCC引脚接收5V。到目前为止,一切都很好。我已经测试了继电器,并按预期的是关闭并打开。

我编写的脚本有一个部分,该部分定义了在继续执行下一个操作之前必须暂停的时间。每个操作都给出一个名称"封闭和打开"。这两个操作必须持续21600秒(6小时)。结束操作(提取器打开)结束后,开放操作(提取器关闭)开始,我想尝试使用脚本巧妙。

我想做的是在更改引脚15的状态时保持"打开"操作的计数器。1分钟),然后必须再次关闭300秒(5分钟)。我试图弄清楚它,但似乎每当我更改PIN的状态时,都会停止打开操作的计数器,并且脚本停止运行或失败。

我似乎无法弄清楚如何在开放操作中保持计时器计数长达21600秒,而我更改引脚15的状态。请参见下面,这是我几个月来运行的脚本。它运行良好,但是我现在想通过上述来改进它。

使您知道,PI在带有plexi-window的电盒中无头运行,以便我可以看到继电器状态。我已经设置了脚本以使用RC.Local在启动时自动运行的脚本。自动运行的第一个脚本是一个GPIO清理脚本,该脚本将继电器状态重置为打开的状态(没有电流流),以防万一,由于某种原因它是关闭的(通常不是)。然后,提取器脚本运行,其余的就是历史记录。除非继电器感到困惑(有时它们会这样),否则我不会重新启动PI,并且即使开放操作已经开始,他们也会开始表现得很奇怪,这意味着PIN 15的状态会改变告诉接力赛(Haven)弄清楚了),但它只会发生每隔几周一次,但这是另一天的对话。现在,我想了解如何编辑此脚本以在开放操作计数器继续前进时打开(1分钟)和关闭(5分钟)的提取器单元。

当闭合操作再次启动时,提取器单元可以运行整个6小时。社区的任何帮助将不胜感激。谢谢大家。

#   !/usr/bin/python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#   init list with pin numbers
pinList = [15]
#   Loop through pins and set mode and state to 'high'.
for i in pinList: 
    GPIO.setup(i, GPIO.OUT) 
    GPIO.output(i, 1) 
#   time to sleep between operations in the main loop
Closed = 21600
Open = 21600
#   main loop
while True:
    GPIO.output(15, 0)
    print "Closed"  
    time.sleep(Closed); 
    GPIO.output(15, 1)
    print "Open"
    time.sleep(Open);

ps ...我知道引脚状态"低或0"表示没有电流流动,因此应打开继电器。相反,引脚状态"高或1"表示电流流动,因此继电器应关闭。这里不是这种情况。通过此继电器,低平均值闭合和高意味着打开。这使我感到困惑,尽管我可能误解了低和高的实际含义。

您有两个选项,两个过程信号在等待一段时间继续进行另一个操作时:

1个嵌套环

尝试做

之类的事情
while True:
    print "Closed"
    for ii in range(0,Closed):
        GPIO.output(15, 0)
        time.sleep(1); 
        #if HERE COMES YOUR CHECK FOR WHATEVER YOU WANT EXACTLY:
        #    DO SOMETHING
    print "Open"
    for ii in range(0,Open):
        GPIO.output(15, 1)
        time.sleep(1);
        #if HERE COMES YOUR OTHER CHECK FOR WHATEVER YOU WANT EXACTLY:
        #    DO SOMETHING

2线程

线程是一些背景过程,它们会自动运行。查看一些类似线程的教程。

然后您介绍一个线程,

  • 睡眠封闭秒
  • 将引脚15切换为
  • 睡眠秒
  • 将PIN15切换到OFF

此线程启动一次,您的主循环可以关心其他何处。

side备注

还有另一个有趣的概念称为中断。您基本上可以定义一个函数,该函数在某个事件发生时将执行(例如,当更改读数引脚的状态=按钮时)。这可能是一个开始划线的好例子。

最新更新