وقتی همزمان چند کار دارید (مثلاً چشمک زدن LED، خواندن سنسور و پاسخ به درخواستهای وب) نوشتن همه در یک while True ساده بهسرعت پیچیده میشود. ماژول uasyncio نسخهٔ سبکشدهٔ asyncio پایتون است و امکان اجرای «همزمانِ ظاهری» چند وظیفه را بدون نیاز به رشتههای واقعی (threading) فراهم میکند.
مبانی async/await
import uasyncio as asyncio
from machine import Pin
led = Pin(2, Pin.OUT)
async def blink_task():
while True:
led.value(not led.value())
await asyncio.sleep_ms(500)
async def sensor_task():
counter = 0
while True:
counter += 1
print("خواندن شمارهٔ", counter)
await asyncio.sleep(2)
async def main():
asyncio.create_task(blink_task())
asyncio.create_task(sensor_task())
while True:
await asyncio.sleep(10)
asyncio.run(main())
بهجای time.sleep() که کل پردازنده را متوقف میکند، در uasyncio از await asyncio.sleep() استفاده میکنیم تا وظایف دیگر بتوانند در همان لحظه اجرا شوند.
پروژهٔ پایانی: پنل کوچک خانهٔ هوشمند
در این پروژهٔ جمعبندی، مفاهیم فصلهای قبل را ترکیب میکنیم: خواندن سنسور DHT22 (فصل ۳)، نمایش وضعیت روی OLED (فصل ۴)، اتصال Wi-Fi و ارسال داده با MQTT (فصل ۵)، و اجرای همزمان وظایف با uasyncio.
import uasyncio as asyncio
import dht, network
from machine import Pin, I2C
import ssd1306
from umqtt.simple import MQTTClient
sensor = dht.DHT22(Pin(15))
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
async def read_and_display():
while True:
try:
sensor.measure()
t, h = sensor.temperature(), sensor.humidity()
oled.fill(0)
oled.text("Dama: {}C".format(t), 0, 10)
oled.text("Rotoobat: {}%".format(h), 0, 30)
oled.show()
except OSError:
pass
await asyncio.sleep(2)
async def main():
asyncio.create_task(read_and_display())
while True:
await asyncio.sleep(10)
asyncio.run(main())
پروژهٔ پایانی: کد بالا را با بخش Wi-Fi/MQTT درس ۱۳ ترکیب کنید تا یک وظیفهٔ سوم (send_to_cloud) هر ۱۰ ثانیه دادهٔ آخرین اندازهگیری را به بروکر MQTT ارسال کند؛ همهٔ سه وظیفه باید همزمان و بدون توقف یکدیگر اجرا شوند.