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

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

جزء من قسم التوقيت دون 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