Не получается заставить uasyncio работать в микро python скрипте для PyBoard - PullRequest
2 голосов
/ 19 марта 2020

Я разрабатываю новый хранитель времени / счета для стола для аэрохоккея, используя PyBoard в качестве базы. Я планирую использовать TM1627 (4x7seg) для отображения времени, поворотный датчик с кнопкой для установки времени, IR и пару 7segs для подсчета очков, ИК-датчики-отражатели для goallines и реле для управления вентилятором.

Я зацикливаюсь на попытке разделить часы на отдельные потоки, сосредотачиваясь на чтении датчиков. Я подумал, что я мог бы использовать uasyncio, чтобы красиво все разделить, но я не могу понять, куда поместить директивы, чтобы раскрутить нить для часов и, в конечном итоге, датчиков.

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

До попытки асинхронизации c все, у меня были хорошо работающие поворотный кодер и таймер. Теперь не так много.

from rotary_irq_pyb import RotaryIRQ
from machine import Pin
import tm1637
import utime
import uasyncio

async def countdown(cntr):
    # just init min/sec to any int > 0
    min = sec = 99
    enableColon = True        
    while True:
        # update the 4x7seg with the time remaining
        min = abs(int((cntr - utime.time()) / 60))
        sec = (cntr - utime.time()) % 60
        #print(str(), str(sec), sep=':' )
        enableColon = not enableColon  # alternately blink the colon
        tm.numbers(min, sec, colon = enableColon)
        if(min + sec == 0):  # once both reach zero, break  
            break
        await uasyncio.sleep(500)

X1 = pyb.Pin.board.X1
X2 = pyb.Pin.board.X2
Y1 = pyb.Pin.board.Y1
Y2 = pyb.Pin.board.Y2
button = pyb.Pin(pyb.Pin.board.X3, pyb.Pin.IN)

r = RotaryIRQ(pin_num_clk=X1, 
              pin_num_dt=X2, 
              min_val=3, 
              max_val=10, 
              reverse=False, 
              range_mode=RotaryIRQ.RANGE_BOUNDED)

tm = tm1637.TM1637(clk = Y1, dio = Y2)
val_old = val_new = 0

while True: 
    val_new = r.value()
    if(val_old != val_new):
        val_old = val_new
        print(str(val_new))
    if(button.value()):  # save value as minutes
        loop = uasyncio.get_event_loop()
        endTime = utime.time() + (60 * val_new) 
        loop.create_task(countdown(endTime))
        r.close() # Turn off Rotary Encoder
        break

#loop = uasyncio.get_event_loop()
#loop.create_task(countdown(et))
#loop.run_until_complete(countdown(et))

Я уверен, что это что-то простое, но это первый не-CLI python скрипт, который я сделал, поэтому я уверен, что есть куча глупые ошибки. Любая помощь будет оценена.

...