如何将一个传感器链接到只要传感器输入为高的异步循环,然后对另一个传感器重复相同的过程?

时间:2019-02-03 21:25:44

标签: asynchronous python-asyncio esp8266 micropython

我在这里机智。我正在使用2个不同的传感器。触发第一个传感器时,我想每秒闪烁黄色LED一次。当第二个传感器被触发时,我想每秒闪烁红色LED两次。我可以一次执行一个操作,这没关系,但是我无法重复该过程(例如,我将触发第一个传感器,黄色的LED模式将播放,但再次触发该传感器无效。除非我关闭程序并重启,否则无法触发其他传感器。请注意,以下代码位于ESP8266-12E的Micropython中。

import uasyncio as asyncio
import machine
import time
import os

# Yellow LED: Pin 15
Y_LED = machine.PWM(machine.Pin(15))
Y_LED.freq(300)

# Red LED: Pin 2
R_LED = machine.PWM(machine.Pin(2))
R_LED.freq(300)

H2_1 = machine.Pin(9, machine.Pin.IN, machine.Pin.PULL_UP)

H2_2 = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_UP)

async def FlashRed():
  for i in range (20):
    R_LED.duty(1023)
    await asyncio.sleep(0.5)
    R_LED.duty(0)
    await asyncio.sleep(0.5)

async def FlashYellow():
  for i in range (10):
    Y_LED.duty(1023)
    await asyncio.sleep(1)
    Y_LED.duty(0)
    await asyncio.sleep(1)    

loop = asyncio.get_event_loop()

def Check_Button():
  while True:
    if H2_1.value():
      loop.create_task(FlashRed())
      loop.run_forever()
    if H2_2.value():
      loop.create_task(FlashYellow())
      loop.run_forever()
    time.sleep(0.1)

while True:
    Check_Button()

我希望电路板在第9针为高电平时显示闪烁的红色LED,然后在第9针为低电平时显示闪烁的红色LED。

我还希望主板在引脚4处于高电平时显示闪烁的黄色LED,同样地,在引脚4处于低电平时显示闪烁的黄色LED。

我希望能够同时或独立触发引脚9红色模式和引脚4黄色LED模式。

目前,我只能做一个。开发板等待来自引脚9或4的输入,这很棒。当引脚9变为高电平时,开发板正确显示红色闪烁的LED模式。图案重复10次,非常好。但是,在图案完成后,我无法再次启动它,也无法启动黄色闪烁的LED图案。如果我从黄色模式开始,则无法重新启动黄色模式,也无法启动红色模式。我必须退出脚本并重新开始。

循环Check_Button()对我不起作用。

任何帮助都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

如果您还有更多事情要做,您不想调用run_forever,因为即使创建的任务完成后,它也将永远运行循环。

我无法测试,但是您可以尝试执行以下操作:

async def Check_Button():
    while True:
        if H2_1.value():
            loop.create_task(FlashRed())
        if H2_2.value():
            loop.create_task(FlashYellow())
        await asyncio.sleep(0.1)

loop.run_until_complete(Check_Button())