שתי נוריות LED, שתי מהירויות
חלק מהיחידה תזמון ללא Delay במסלול ה-Arduino של Coddy. שיעור 4 מתוך 18.
עם delay(), שתי נוריות LED מהבהבות במהירויות שונות הן חידה: כל המתנה מעכבת את נורית ה־LED השנייה. עם millis() זה קל, כי שום דבר לא מחכה.
תן לכל משימה משתנים משלה: זמן קודם משלה ומצב משלה. אחר כך תן לכל משימה if משלה בתוך loop(). בכל לולאה, כל משימה בודקת את השעון שלה ופועלת רק כשהגיע הזמן שלה:
unsigned long redPrevious = 0;
unsigned long greenPrevious = 0;
void loop() {
unsigned long now = millis();
if (now - redPrevious >= 500) {
redPrevious = now;
// שנה את מצב נורית ה-LED האדומה
}
if (now - greenPrevious >= 200) {
greenPrevious = now;
// שנה את מצב נורית ה-LED הירוקה
}
}שתי המשימות לעולם לא מפריעות זו לזו. אפשר להוסיף שלישית ורביעית באותה הדרך: קבוצת משתנים אחת ו־if אחד לכל משימה.
לעולם אל תשתף משתנה אחד של הזמן הקודם בין שתי משימות. המשימה המהירה מאפסת אותו לעיתים קרובות כל כך, שהאיטית לעולם לא מגיעה למרווח הזמן שלה.
אתגר
קלנורית ה-LED האדומה בפין 13 כבר מתחלפת כל 500 ms. גרמו לנורית ה-LED הירוקה בפין 12 להתחלף כל 200 ms באותו הזמן:
- הוסיפו משתנים בשם
greenPreviousו-greenState - הוסיפו
ifשני בתוךloop()עבור נורית ה-LED הירוקה
לחצו על Run וצפו בשתיהן מהבהבות, ואז לחצו על Check.
נסו בעצמכם
const int redLed = 13;
const int greenLed = 12;
unsigned long redPrevious = 0;
int redState = LOW;
// הוסיפו כאן את שני המשתנים של ה-LED הירוק
void setup() {
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
}
void loop() {
unsigned long now = millis();
// ה-LED האדום מחליף מצב כל 500 ms
if (now - redPrevious >= 500) {
redPrevious = now;
if (redState == LOW) {
redState = HIGH;
} else {
redState = LOW;
}
digitalWrite(redLed, redState);
}
// גרמו ל-LED הירוק להחליף מצב כל 200 ms כאן
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תזמון ללא Delay
1millis()
שעון millis()זמנים מסוג unsigned longהבהוב ללא השהיהשתי נוריות LED, שתי מהירויותהבהוב תוך כדי החלפת מצב באמצעות כפתורנורית עם טיימרתרגלו בעצמכם: Arduino אונליין