Menu
CoddyTech

الهبوط والصعود والتغيّر

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

يحتوي Uno على منفذين يمكنهما إطلاق مقاطعة: المنفذ 2 والمنفذ 3. يجب توصيل الزر الذي يحتاج إلى مقاطعة بأحدهما. داخل الشريحة، هما المقاطعتان 0 و1، لذا دع digitalPinToInterrupt() يحوّل المنفذ إلى رقمه. يطلب attachInterrupt(3, ...) المقاطعة 3، وهي غير موجودة في Uno، ولن يحدث شيء.

يحدد الجزء الأخير من attachInterrupt() التغيير الذي يجب الاستجابة له:

  • FALLING: ينتقل المنفذ من HIGH إلى LOW (مع مقاومة سحب لأعلى، عند الضغط)
  • RISING: ينتقل المنفذ من LOW إلى HIGH (عند رفع الإصبع)
  • CHANGE: أيٌّ منهما

مع CHANGE، تعمل ISR عند الضغط وعند رفع الإصبع. تقرأ المنفذ لمعرفة أيّهما حدث:

void onChange() {
  if (digitalRead(buttonPin) == LOW) {
    // انخفض مستواه
  } else {
    // ارتفع مستواه
  }
}

attachInterrupt(digitalPinToInterrupt(buttonPin), onChange, CHANGE);
challenge icon

التحدي

سهل

الزر موصول بالمنفذ 3، وloop() مشغولة بمهمة بطيئة. اجعل LED على المنفذ 13 يتبع الزر فورًا:

  • في onChange()، اقرأ حالة الزر: تؤدي LOW إلى إضاءة LED، وتؤدي HIGH إلى إطفائه
  • اربط onChange() بمنفذ الزر باستخدام CHANGE

اضغط Run، ثم اضغط مطولًا على الزر وحرره، ثم اضغط Check.

جرّب بنفسك

const int ledPin = 13;
const int buttonPin = 3;

// تُنفَّذ في كل مرة تتغير فيها حالة طرف الزر.
void onChange() {
  // أضئ مصباح LED عند الضغط على الزر، وأطفئه عند تركه
}

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  // اربط onChange() بطرف الزر هنا
}

void loop() {
  // المهمة البطيئة: اتركها كما هي
  Serial.println("working");
  delay(2000);
}
quiz iconاختبر نفسك

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

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

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