我正在使用带有MicroPython的ESP8266(Wemos D1 mini)在OLED上显示我的实际时间,其中包括我当地气象站的秒数和温度。
代码片段
try:
while True:
now = utime.localtime()
hour = str(now[3])
minu = str(now[4])
secs = str(now[5])
actualtime = hour + ":" + minu + ":" + secs
#clear OLED and display actualtime
oled.fill(0)
oled.textactualtime, 0, 0)
#every 30 seconds get data from api
if secs == '30':
data = get_from_api(url)
oled.text("Temperature: "+data["temp"]+ " C", 0, 45)
oled.show()
sleep(1)
每分钟我都在尝试通过url请求获取实际温度。 问题在于此操作可能需要花费几秒钟的时间,然后我的时钟冻结了,无法每秒钟显示时间。
如何在单独的进程/并行进程中获取此类数据以不减慢我的循环速度。
答案 0 :(得分:1)
有几种方法可以做到这一点。
一种选择可能是使用Timer
更新您的信息。
https://docs.micropython.org/en/latest/esp8266/quickref.html#timers
它可能看起来像这样。请注意, 这不是工作代码 ,因为我只是复制并重新排列了您问题中的代码:
from machine import Timer
import micropython
data = None
def update_oled(_):
now = utime.localtime()
hour = str(now[3])
minu = str(now[4])
secs = str(now[5])
actualtime = hour + ":" + minu + ":" + secs
#clear OLED and display actualtime
oled.fill(0)
oled.textactualtime, 0, 0)
if data != None:
oled.text("Temperature: "+data["temp"]+ " C", 0, 45)
oled.show()
def schedule_update_oled(_):
micropython.schedule(update_oled, 0)
timer = Timer(-1)
timer.init(period=1000, mode=Timer.PERIODIC, callback=schedule_update_oled)
try:
while True:
data = get_from_api(url)
sleep(30)
except KeyboardInterrupt:
timer.deinit()
注意,计时器是一个中断,因此在回调中包含太多代码不是一个好主意。您可能还需要使用schedule
。
https://docs.micropython.org/en/latest/reference/isr_rules.html#using-micropython-schedule
另一种选择是使用将代码分解为不同的流: