Menu
CoddyTech
flag Ar iconالعربيةdown icon

ضغطة يفوتها التكرار

جزء من قسم التوقيت دون delay في رحلة Arduino على Coddy. الدرس 12 من 18.

يكون البرنامج أحيانًا مشغولًا بمهمة بطيئة أو بـdelay() طويلة. تفوّت حلقة تقرأ الزر بين المهام فقط ضغطةً تبدأ وتنتهي أثناء إحدى هذه المهام.

يحلّ المقاطعة هذه المشكلة: عندما يتغير أحد الأطراف، توقف اللوحة ما تفعله، وتشغّل دالة تختارها، ثم تتابع. تراقب الشريحة الطرف بنفسها، حتى أثناء delay().

void onPress() {
  digitalWrite(ledPin, HIGH);
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}

تأخذ attachInterrupt() ثلاثة أشياء: المقاطعة الخاصة بالطرف (تجدها digitalPinToInterrupt(buttonPin))، والدالة التي ستُشغَّل، والتوقيت. تشير FALLING إلى اللحظة التي ينتقل فيها الطرف من HIGH إلى LOW: مع مقاومة سحب لأعلى، تكون هذه لحظة الضغط على الزر.

تُسمّى الدالة روتين خدمة المقاطعة، أو ISR. اجعلها قصيرة: لا تستخدم delay() ولا Serial.

challenge icon

التحدي

سهل

يفحص هذا المنبّه زره مرة واحدة فقط كل ثانيتين، لذا لا يستجيب للضغطة السريعة. اجعل الضغط على الزر يضيء مؤشر LED فورًا:

  • اكتب ISR باسم onPress()، لتشغيل مؤشر LED
  • في setup()، اربطه برجل الزر باستخدام FALLING

أبقِ المهمة البطيئة في loop(). يظل مؤشر LED مضاءً بعد الضغط، مثل المنبّه. اضغط على Run، ثم اضغط على الزر، ثم Check.

جرّب بنفسك

const int ledPin = 13;
const int buttonPin = 2;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  // اربط المقاطعة هنا
}

void loop() {
  // المهمة البطيئة: أبقها كما هي
  Serial.println("working");
  delay(2000);

  // هذا يفحص الزر مرة واحدة فقط كل 2 ثانية،
  // لذا لن تُرصد الضغطة القصيرة
  if (digitalRead(buttonPin) == LOW) {
    digitalWrite(ledPin, HIGH);
  }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس التوقيت دون delay

تدرّب بنفسك: Playground لـ Arduino