Menu
CoddyTech

לחיצה שהלולאה מפספסת

חלק מהיחידה תזמון ללא 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.

challenge icon

אתגר

קל

האזעקה הזו בודקת את הכפתור רק פעם אחת בכל 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);
  }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תזמון ללא Delay

תרגלו בעצמכם: Arduino אונליין