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

تا اینجا در تمام برنامه‌ها از حلقهٔ while True برای بررسی مداوم وضعیت پایه‌ها استفاده کرده‌ایم (به این روش Polling می‌گویند). اما این روش برای رویدادهای سریع یا نامنظم بهینه نیست. راه‌حل بهتر، استفاده از وقفه‌ها (Interrupts) است: تابعی که فقط دقیقاً در لحظهٔ وقوع یک رویداد (مثل فشردن دکمه) اجرا می‌شود.

ثبت یک وقفهٔ سخت‌افزاری

PYTHON
from machine import Pin
from time import sleep

led = Pin(2, Pin.OUT)
button = Pin(4, Pin.IN, Pin.PULL_UP)

def on_button_press(pin):
    led.value(not led.value())
    print("دکمه فشرده شد!")

button.irq(trigger=Pin.IRQ_FALLING, handler=on_button_press)

while True:
    print("برنامه اصلی همچنان در حال اجراست...")
    sleep(1)
⚠️ هشدار

تابع وقفه (ISR) باید بسیار کوتاه و سریع باشد؛ از عملیات سنگین مثل sleep طولانی یا شبکه درون آن خودداری کنید.

تایمرهای نرم‌افزاری

کلاس Timer به شما اجازه می‌دهد یک تابع را در بازه‌های زمانی مشخص، بدون مسدود کردن برنامهٔ اصلی، اجرا کنید.

PYTHON
from machine import Timer, Pin

led = Pin(2, Pin.OUT)
timer = Timer(0)

def blink(t):
    led.value(not led.value())

timer.init(period=500, mode=Timer.PERIODIC, callback=blink)

# برنامهٔ اصلی آزاد است کارهای دیگری انجام دهد
while True:
    pass
استفاده از وقفه دکمه برای تغییر وضعیت LED باز کردن در Wokwi ↗

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

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

کارگاه عملی: با استفاده از IRQ_RISING به‌جای IRQ_FALLING، رفتار متفاوت را مشاهده کنید و توضیح دهید چرا فرق می‌کند.

❓ مزیت اصلی استفاده از وقفه (Interrupt) نسبت به بررسی مداوم در حلقه چیست؟
طراحی و توسعه: امین شیخ نجدیglcd.ir