Я разрабатываю новый хранитель времени / счета для стола для аэрохоккея, используя 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 скрипт, который я сделал, поэтому я уверен, что есть куча глупые ошибки. Любая помощь будет оценена.