ספירת לחיצות באמצעות פסיקות
חלק מהיחידה תזמון ללא Delay במסלול ה-Arduino של Coddy. שיעור 15 מתוך 18.
כפי שראית ביחידת הקלט, כפתורים מרעידים: במשך כמילישנייה המגעים נוגעים, נפרדים ונוגעים שוב, גם בלחיצה וגם בשחרור. פסיקה מזהה כל נגיעה, ולכן ISR של FALLING שמוסיף 1 סופר לחיצה אחת כמה פעמים.
ISR לא יכול לבצע סינון רעידות באמצעות delay(): delay() זקוקה לפסיקה של השעון עצמו, והפסיקות מושהות בזמן שרץ ISR. במקום זאת, השתמשו בשעון. זכרו מתי התרחשה הלחיצה האחרונה שנספרה, והתעלמו מכל ירידה שמתרחשת מוקדם מדי אחריה:
unsigned long lastPress = 0;
void onPress() {
unsigned long now = millis();
if (now - lastPress >= 200) {
presses = presses + 1;
lastPress = now;
}
}אפשר לקרוא ל־millis() בתוך ISR: היא מחזירה את הזמן שבו ה־ISR התחיל. בחרו חלון זמן ארוך יותר מלחיצה, כך שהרעידות בזמן השחרור ייכללו בו, וקצר יותר מהמרווח בין שתי לחיצות מהירות. 200 ms מתאים לאנשים.
אתגר
בינוניהמונה הזה סופר כל לחיצה כמה פעמים. הוסף השהיית debounce בתוך onPress():
- הוסף משתנה
unsigned long lastPress - ספור ירידה רק אם עברו לפחות 200 ms מאז
lastPress, ואז שמור את הזמן ב-lastPress
לחץ על Run, לחץ על הכפתור כמה פעמים ועקוב אחר הספירה, ואז לחץ על Check.
נסו בעצמכם
const int buttonPin = 2;
volatile int presses = 0;
int shown = 0;
void onPress() {
// כל ירידה באות שבפין נספרת, גם קפיצות מגע: יש לסנן אותן כאן
presses = presses + 1;
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}
void loop() {
// הדפס את הספירה בכל פעם שהיא משתנה
if (presses != shown) {
shown = presses;
Serial.println(shown);
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תזמון ללא Delay
תרגלו בעצמכם: Arduino אונליין