Menu
CoddyTech

שתי נוריות 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 אחד לכל משימה.

לעולם אל תשתף משתנה אחד של הזמן הקודם בין שתי משימות. המשימה המהירה מאפסת אותו לעיתים קרובות כל כך, שהאיטית לעולם לא מגיעה למרווח הזמן שלה.

challenge icon

אתגר

קל

נורית ה-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 כאן
}
quiz iconבחנו את עצמכם

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

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

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