Python: GPIO 引脚状态改变时保持操作定时器
Python: Maintain operation timer while GPIO pin state changes
我有一个相当奇怪的脚本挑战。我有一个提取单元,我试图通过 Python 脚本和一个常规继电器来控制。继电器使用 GPIO BCM 引脚 15 连接到我的 RPi 3 Model B,它接地并从 pi 的 VCC 引脚接收 5V。到目前为止,一切都很好。我已经测试了继电器,它按预期关闭和打开。
我写的脚本有一个部分定义了在进行下一个操作之前必须暂停的时间长度。每个操作都有一个名称 "closed and open"。两次操作都必须持续 21600 秒(6 小时)。当关闭操作(提取器打开)结束时,打开操作(提取器关闭)开始,我想在那里尝试使用脚本。
我想做的是在更改引脚 15 的状态时保持 "open" 操作的计数器。因此,当打开操作计数到 21600 秒时,我希望抽取器打开60 秒(1 分钟),然后必须再次关闭 300 秒(5 分钟)。我试图弄清楚,但似乎任何时候我改变引脚的状态,它都会停止打开操作的计数器并且脚本停止 运行ning 或失败。
我似乎无法弄清楚如何在打开操作中保持计时器计数到 21600 秒,同时我更改引脚 15 的状态。请看下面,这是我一直在使用的脚本 运行宁几个月。它运作良好,但我现在想通过执行上述操作来改进它。
所以你知道,pi 运行s 无头在一个带有 plexi-window 的电箱中,这样我就可以看到继电器状态。我已经使用 rc.local 在启动时自动将脚本设置为 运行 ,效果很好。 运行s 自动执行的第一个脚本是一个 GPIO 清理脚本,它将继电器的状态重置为打开(无电流),以防由于某种原因它被关闭(通常不会)。然后是提取器脚本 运行s,剩下的就是历史了。我永远不会重新启动 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...我理解引脚状态 'low or 0' 表示没有电流流动,因此继电器应该打开。相反,引脚状态 'high or 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 个线程
线程是一些后台进程,运行 自动执行。查看一些线程教程,例如 this one.
然后你会介绍一个线程,
- 休眠关闭秒数
- 打开引脚 15
- 睡开秒
- 关闭 pin15
这个线程启动一次,然后你的主循环就可以关心其他的事情了。
旁注
还有一个有趣的概念叫做中断。您基本上可以定义一个函数,该函数在特定事件发生时执行(例如,当读取引脚的状态发生变化时 = 按下按钮)。
This 可能是开始使用中断的一个很好的例子。
我有一个相当奇怪的脚本挑战。我有一个提取单元,我试图通过 Python 脚本和一个常规继电器来控制。继电器使用 GPIO BCM 引脚 15 连接到我的 RPi 3 Model B,它接地并从 pi 的 VCC 引脚接收 5V。到目前为止,一切都很好。我已经测试了继电器,它按预期关闭和打开。
我写的脚本有一个部分定义了在进行下一个操作之前必须暂停的时间长度。每个操作都有一个名称 "closed and open"。两次操作都必须持续 21600 秒(6 小时)。当关闭操作(提取器打开)结束时,打开操作(提取器关闭)开始,我想在那里尝试使用脚本。
我想做的是在更改引脚 15 的状态时保持 "open" 操作的计数器。因此,当打开操作计数到 21600 秒时,我希望抽取器打开60 秒(1 分钟),然后必须再次关闭 300 秒(5 分钟)。我试图弄清楚,但似乎任何时候我改变引脚的状态,它都会停止打开操作的计数器并且脚本停止 运行ning 或失败。
我似乎无法弄清楚如何在打开操作中保持计时器计数到 21600 秒,同时我更改引脚 15 的状态。请看下面,这是我一直在使用的脚本 运行宁几个月。它运作良好,但我现在想通过执行上述操作来改进它。
所以你知道,pi 运行s 无头在一个带有 plexi-window 的电箱中,这样我就可以看到继电器状态。我已经使用 rc.local 在启动时自动将脚本设置为 运行 ,效果很好。 运行s 自动执行的第一个脚本是一个 GPIO 清理脚本,它将继电器的状态重置为打开(无电流),以防由于某种原因它被关闭(通常不会)。然后是提取器脚本 运行s,剩下的就是历史了。我永远不会重新启动 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...我理解引脚状态 'low or 0' 表示没有电流流动,因此继电器应该打开。相反,引脚状态 'high or 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 个线程
线程是一些后台进程,运行 自动执行。查看一些线程教程,例如 this one.
然后你会介绍一个线程,
- 休眠关闭秒数
- 打开引脚 15
- 睡开秒
- 关闭 pin15
这个线程启动一次,然后你的主循环就可以关心其他的事情了。
旁注
还有一个有趣的概念叫做中断。您基本上可以定义一个函数,该函数在特定事件发生时执行(例如,当读取引脚的状态发生变化时 = 按下按钮)。 This 可能是开始使用中断的一个很好的例子。