gpt4 book ai didi

python - 通过webiopi退出python中的连续循环

转载 作者:太空宇宙 更新时间:2023-11-03 17:18:43 25 4
gpt4 key购买 nike

我正在使用 webiopi,我基本上想要发生的是,当网页加载时,一个追逐一些 LED 的空闲循环运行。然后,当有人按下网站上的按钮时,它将停止空闲循环。

这是我到目前为止所拥有的:

import webiopi
import time

GPIO = webiopi.GPIO

LIGHT1 = 2
LIGHT2 = 3
LIGHT3 = 4

def setup():
GPIO.setFunction(LIGHT1, GPIO.OUT)
GPIO.setFunction(LIGHT2, GPIO.OUT)
GPIO.setFunction(LIGHT3, GPIO.OUT)

a=0

def loop():
webiopi.sleep(1)

@webiopi.macro
def stopLoop():
print("Stopping Loop");
global a
a = 1
return a

@webiopi.macro
def idleLoop():
print("Entering idleLoop");
while (a==0):
GPIO.digitalWrite(LIGHT1, GPIO.HIGH)
time.sleep(0.05)
GPIO.digitalWrite(LIGHT2, GPIO.HIGH)
GPIO.digitalWrite(LIGHT1, GPIO.LOW)
time.sleep(0.05)
GPIO.digitalWrite(LIGHT3, GPIO.HIGH)
GPIO.digitalWrite(LIGHT2, GPIO.LOW)
time.sleep(0.05)

所以,我可以让它运行idleLoop,并且我连接了一个按钮来发送stopLoop的命令,我可以看到它通过POST进行,但是在PI上的调试窗口中,我只看到它进入idleLoop,但永远不会进入stopLoop。我不确定是否必须编写中断或多线程,但我只需要一些指导。谢谢!

最佳答案

您处于单线程应用程序中..这意味着一旦您进入idleLoop(),机器(或者至少您的程序)就无法执行任何其他操作,包括处理您的网络请求以退出空闲循环,因为它一直在闪烁 LED 灯并处于 sleep 状态。

处理这个问题的方法是让启动和停止 LED 的函数仅设置一个全局变量然后退出......例如

blink_enabled = Trueblink_enabled = False

类似于:

blink_enabled = False

def loop():
webiopi.sleep(1)
if blink_enabled:
blink_once()

def blink_once():
GPIO.digitalWrite(LIGHT1, GPIO.HIGH)
time.sleep(0.05)
GPIO.digitalWrite(LIGHT2, GPIO.HIGH)
GPIO.digitalWrite(LIGHT1, GPIO.LOW)
time.sleep(0.05)
GPIO.digitalWrite(LIGHT3, GPIO.HIGH)
GPIO.digitalWrite(LIGHT2, GPIO.LOW)
time.sleep(0.05)

@webiopi.macro
def stopLoop():
blink_enabled = False

@webiopi.macro
def idleLoop():
blink_enabled = True

这将允许在每次眨眼之间处理其他任务,例如处理网络请求。在每次眨眼期间,其他事情的处理都会被阻塞一点..这使得这段代码不太理想..但它向您展示了正确的方向。在像这样的协作多任务环境中第一,你永远不能阻塞循环,你必须尽快完成你的任务并返回。如果你不这样做,其他一切都会等待。

从代码的外观来看,loop() 似乎在循环,并且您的宏函数彼此独立执行......但事实并非如此。它们相互来回传递控制权,并且一次只有其中一个运行。

理想情况下,执行此操作的方法是根本不使用 time.sleep(),而是记下(在变量中)上次更改 LED 的时间...并检查 Loop() 以查看更改了多少时间已过..如果时间不够,则不执行任何操作,下次再检查。一旦经过足够的时间,将 LED 翻转到下一个状态并重置计时器。这是解决此类问题的经典方法..称为“状态机”方法。

当你调用 sleep() 时,一切都会停止,所以你想避免这种情况。

关于python - 通过webiopi退出python中的连续循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33400886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com