לחיצה שהלולאה מפספסת
חלק מהיחידה תזמון ללא 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: עם נגד pull-up, זה הרגע שבו לוחצים על הכפתור.
הפונקציה נקראת שגרת שירות פסיקה, או ISR. כדאי לשמור עליה קצרה: בלי delay() ובלי Serial.
אתגר
קלהאזעקה הזו בודקת את הכפתור רק פעם אחת בכל 2 שניות, ולכן היא מפספסת לחיצה קצרה. גרום ללחיצה להדליק את הנורית מיד:
- כתוב ISR בשם
onPress(), שמדליק את הנורית - ב־
setup(), חבר אותה לפין של הכפתור עםFALLING
השאר את המשימה האיטית בתוך loop(). הנורית נשארת דולקת אחרי לחיצה, כמו אזעקה. לחץ על 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
תרגלו בעצמכם: Arduino אונליין