הבהוב ללא השהיה
חלק מהיחידה תזמון ללא Delay במסלול ה-Arduino של Coddy. שיעור 3 מתוך 18.
delay() עוצרת את כל הסקץ׳. בזמן שההבהוב ממתין 500 ms, שום דבר אחר ב־loop() לא רץ: לחיצה על כפתור בזמן הזה לא מזוהה עד שההמתנה מסתיימת.
הפתרון הוא לעולם לא להמתין. תנו ל־loop() לרוץ שוב ושוב, במהירות רבה, ובכל פעם השוו את השעון לרגע שבו ה־LED השתנה לאחרונה. עד שיחלפו 500 ms, אל תעשו דבר. לאחר מכן שנו את ה־LED ושמרו את הרגע החדש:
const unsigned long interval = 500;
unsigned long previousMillis = 0; // מתי ה-LED שינה מצב בפעם האחרונה
void loop() {
unsigned long now = millis();
if (now - previousMillis >= interval) {
previousMillis = now; // זכור את הרגע הזה
// שנה כאן את מצב ה-LED
}
// כל דבר אחר כאן מתבצע אלפי פעמים בשנייה
}now - previousMillis הוא הזמן שעבר מאז השינוי האחרון. כדי להחליף את מצב ה־LED, שמרו את מצבו במשתנה, int redState = LOW;, הפכו אותו באמצעות if/else וכתבו אותו באמצעות digitalWrite(redLed, redState);.
אם תשכחו לעדכן את previousMillis, התנאי יישאר נכון אחרי 500 ms הראשונות, כך שה־LED ישתנה בכל לולאה וייראה חצי דולק.
אתגר
בינונינורית ה-LED הצהובה צריכה לפעול בהתאם ללחצן, אבל היא מגיבה באיחור כי קריאות delay() של נורית ה-LED האדומה עוצרות את הלולאה. כתבו מחדש את הבהוב הנורית האדומה באמצעות millis():
- השאירו את החלק של הלחצן כפי שהוא
- כל 500 ms, החליפו את מצב נורית ה-LED האדומה בפין 13
- אל תשתמשו ב-
delay()בשום מקום
לחצו על Run, החזיקו את הלחצן וצפו בשתי הנוריות, ואז לחצו על Check.
נסו בעצמכם
const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;
void setup() {
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// נורית ה-LED הצהובה מגיבה ללחצן. השאירו את החלק הזה כפי שהוא.
if (digitalRead(buttonPin) == LOW) {
digitalWrite(yellowLed, HIGH);
} else {
digitalWrite(yellowLed, LOW);
}
// נורית ה-LED האדומה מהבהבת, אבל כל קריאה ל-delay() עוצרת את השורות שלמעלה
// למשך חצי שנייה. כתבו מחדש את החלק הזה באמצעות millis().
digitalWrite(redLed, HIGH);
delay(500);
digitalWrite(redLed, LOW);
delay(500);
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תזמון ללא Delay
תרגלו בעצמכם: Arduino אונליין