我有一个相当好奇的脚本挑战。我有一个提取单元,我试图通过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'意味着电流正在流动,因此应该关闭继电器。这不是这种情况。使用此继电器,低电平表示闭合,高电平表示断开。这让我很困惑,虽然我可能误解了低和高的实际含义。
答案 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这样的线程的教程。
然后你会引入一个线程,
这个线程启动一次,你的主循环可以关心其他的事情。
旁注
还有另一个有趣的概念叫做中断。您基本上可以定义一个函数,该函数在某个事件发生时执行(例如,当读取引脚的状态改变=按下按钮时)。 This可能是开始中断的好例子。