2016-12-03 27 views
0

我有一个相当好奇的脚本挑战。我有一个提取单元,我试图通过Python脚本和常规中继来控制。继电器使用GPIO BCM引脚15连接到我的RPi 3型号B,它接地,并从PI的VCC引脚接收5V。到现在为止还挺好。我已经测试过继电器,并按照预期关闭和打开。Python:在GPIO引脚状态发生变化时保持操作定时器

我写的脚本有一个部分,它定义了在继续下一步操作之前必须暂停的时间长度。每个操作都被命名为“关闭并打开”。这两项操作必须持续21600秒(6小时)。当关闭操作(提取器开启)结束时,开放操作(提取器关闭)开始,并且我想尝试使用脚本来获得灵巧。

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

当我改变引脚15的状态时,我似乎无法弄清楚如何保持计时器计数高达21600秒,在打开的操作中。请看下面,这是我一直在运行的脚本个月。它运作良好,但我现在想通过上述方法来改进它。

为了让您知道,pi在一个带有plexi-window的电箱中无头运行,以便我可以看到接力状态。我已经设置脚本在启动时使用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 ......我明白,引脚状态'低或0'意味着没有电流流动,所以继电器应该打开。相反,引脚状态为“高电平”或“1”表示电流正在流动,继电器应关闭。这里不是这种情况。有了这个继电器,低意味着关闭,高意味着打开。这使我感到困惑,尽管我可能误解了低和高的实际含义。

回答

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

您woud引入一个线程然后,这

  • 睡闭秒
  • 开关销15上
  • 睡觉打开秒
  • 开关引脚15为关闭

此线程开始一次,然后你的主循环可以关心其他的话。

侧此言

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

+0

感谢Markus,我现在只是回应道歉。工作生活平衡出轨时,时间过得很快。您的输入非常有帮助:-) – Safjoe

相关问题