پیشرفته⏱ 25 دقیقه مطالعه

وقتی هم‌زمان چند کار دارید (مثلاً چشمک زدن LED، خواندن سنسور و پاسخ به درخواست‌های وب) نوشتن همه در یک while True ساده به‌سرعت پیچیده می‌شود. ماژول uasyncio نسخهٔ سبک‌شدهٔ asyncio پایتون است و امکان اجرای «هم‌زمانِ ظاهری» چند وظیفه را بدون نیاز به رشته‌های واقعی (threading) فراهم می‌کند.

مبانی async/await

PYTHON
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.

PYTHON
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())
نمونهٔ پایه برای پروژهٔ پایانی (OLED + سنسور) باز کردن در Wokwi ↗

این یک شبیه‌سازی واقعی و قابل اجراست؛ روی دکمه پخش (▶) در Wokwi بزنید تا کد روی برد مجازی ESP32 اجرا شود.

🛠️ کارگاه عملی

پروژهٔ پایانی: کد بالا را با بخش Wi-Fi/MQTT درس ۱۳ ترکیب کنید تا یک وظیفهٔ سوم (send_to_cloud) هر ۱۰ ثانیه دادهٔ آخرین اندازه‌گیری را به بروکر MQTT ارسال کند؛ همهٔ سه وظیفه باید هم‌زمان و بدون توقف یکدیگر اجرا شوند.

❓ در uasyncio، به‌جای time.sleep() از چه دستوری استفاده می‌کنیم تا وظایف دیگر مسدود نشوند؟
طراحی و توسعه: امین شیخ نجدیglcd.ir