Как связать один датчик с асинхронным контуром, который работает до тех пор, пока вход датчика высокий, а затем повторить тот же процесс с другим датчиком? - PullRequest
0 голосов
/ 04 февраля 2019

Я нахожусь в конце моего остроумия здесь.Я использую 2 разных датчика.Когда срабатывает первый датчик, я хочу мигать желтым светодиодом один раз в секунду.Когда срабатывает второй датчик, я хочу мигать красным светодиодом два раза в секунду.Я могу сделать это по одному, и это нормально, но я не могу заставить процесс повторяться (как, например, я сработаю с первым датчиком, и будет воспроизводиться желтый светодиодный индикатор, но повторный запуск этого датчика не имеет никакого эффекта. IТакже невозможно запустить другой датчик, пока я не закрою программу и не перезапущу. Обратите внимание, что следующий код находится в Micropython на ESP8266-12E.

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, а затем отображать этот мигающий красный светодиод до тех пор, пока уровень на выводе 9 не станет низким.

Я также хотел бы, чтобы на плате отображался мигающий желтый светодиод, когда на выводе 4 высокий уровень, и аналогичным образом отображал этот мигающий желтый светодиодпока на выводе 4 не будет низкий уровень.

Я бы хотел иметь возможность одновременно запускать как красный рисунок 9, так и желтый 4 светодиодный индикатор одновременно или независимо.

В настоящее время я могу сделать только одинили другое. Плата ожидает ввода от вывода 9 или 4. Это здорово. Когда вывод 9 становится высоким, плата правильно отображает красныймигающий светодиодный рисунок.Шаблон повторяется 10 раз, и это здорово.Но затем, после того как шаблон завершится, я не смогу его снова запустить и не смогу запустить желтый мигающий светодиод.Если я начну с желтого шаблона, я не смогу перезапустить желтый шаблон и не могу запустить красный шаблон.Я должен выйти из сценария и начать заново.

Зацикливание Check_Button () не работает для меня.

Любая помощь будет очень признательна.Спасибо!

1 Ответ

0 голосов
/ 04 февраля 2019

Вы не хотите вызывать 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())
...