پیشرفته⏱ 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
🛠️ کارگاه عملی
کارگاه عملی: با استفاده از IRQ_RISING بهجای IRQ_FALLING، رفتار متفاوت را مشاهده کنید و توضیح دهید چرا فرق میکند.
❓ مزیت اصلی استفاده از وقفه (Interrupt) نسبت به بررسی مداوم در حلقه چیست؟
طراحی و توسعه: امین شیخ نجدی — glcd.ir