Python:在GPIO引脚状态改变时保持操作定时器

时间:2016-12-03 11:25:43

标签: python-2.7 raspberry-pi raspbian gpio

我有一个相当好奇的脚本挑战。我有一个提取单元,我试图通过Python脚本和常规中继来控制。继电器通过GPIO BCM引脚15连接到我的RPi 3型号B,它接地并从pi的VCC引脚接收5V电压。到现在为止还挺好。我测试了继电器,它按预期关闭并打开。

我编写的脚本有一个部分,用于定义在继续下一个操作之前必须暂停的时间长度。每个操作都有一个名称"关闭并打开"。两种操作都必须持续21600秒(6小时)。当关闭的操作(提取器打开)结束时,打开操作(提取器关闭)开始,我想尝试使用脚本变得聪明。

我想做的是保持"打开"当我更改引脚15的状态时,操作计数器。因此,当打开操作计数达到21600秒时,我希望提取器打开60秒(1分钟),然后它必须再次关闭300秒(5分钟)。我试图找出它,但似乎任何时候我改变引脚的状态,它会停止打开操作的计数器,脚本停止运行或失败。

我无法弄清楚如何在打开操作中保持定时器计数达21600秒,同时我更改了针脚15的状态。请参阅下文,这是我一直在运行的脚本几个月。它运作良好,但我现在想通过上述方法来改进它。

所以你知道,pi在一个带有plexi窗口的电箱中无头,所以我可以看到继电器状态。我已经设置脚本在启动时使用rc.local自动运行,它完美地运行。自动运行的第一个脚本是GPIO清理脚本,它会重置要打开的中继状态(无电流),以防由于某种原因它被关闭(通常不会)。然后运行提取器脚本,其余的是历史记录。我不会重新启动pi,除非继电器混淆(有时他们会这样做)并且他们开始表现得非常奇怪,即使开启操作已经开始仍然保持关闭,这意味着15号针的状态将改变,告诉继电器打开(避风港)想出来了)但它只发生在每隔几周一次,但这是另一天的对话。现在,我想了解如何编辑此脚本以在打开操作计数器继续运行时(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 ......我知道pin状态为低或0'意味着没有电流流动,所以继电器应该打开。相反,pin状态为高或1'意味着电流正在流动,因此应该关闭继电器。这不是这种情况。使用此继电器,低电平表示闭合,高电平表示断开。这让我很困惑,虽然我可能误解了低和高的实际含义。

1 个答案:

答案 0 :(得分:0)

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

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个帖子

线程是一些自动运行的后台进程。查看一些像this one这样的线程的教程。

然后你会引入一个线程,

  • 睡觉关闭秒
  • 将引脚15切换为
  • 睡觉开放秒钟
  • 将pin15切换为关闭

这个线程启动一次,你的主循环可以关心其他的事情。

旁注

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