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