الهبوط والصعود والتغيّر
جزء من قسم التوقيت دون 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);التحدي
سهلالزر موصول بالمنفذ 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);
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس التوقيت دون delay
تدرّب بنفسك: Playground لـ Arduino