Menu
CoddyTech

מכונת מצבים של רמזור

חלק מהיחידה תזמון ללא Delay במסלול ה-Arduino של Coddy. שיעור 10 מתוך 18.

רמזור הוא מכונת מצבים: הוא נמצא תמיד במצב אחד (ירוק, צהוב או אדום), כל מצב נמשך פרק זמן קבוע, וכל מצב יודע איזה מצב מגיע אחריו:

  • GREEN: ירוק דולק; אחרי 2 s, עוברים ל-YELLOW
  • YELLOW: צהוב דולק; אחרי 1 s, עוברים ל-RED
  • RED: אדום דולק; אחרי 2 s, עוברים ל-GREEN

כל שורה הופכת ל-case אחד:

case GREEN:
  setLights(HIGH, LOW, LOW);
  if (now - lightStart >= 2000) {
    light = YELLOW;
    lightStart = now;
  }
  break;

גם עם delay(2000) האור היה עובד, אבל שום דבר אחר לא היה יכול לרוץ. עם millis(), כל מעבר דרך loop() נמשך מיקרו־שניות, כך שללוח יש זמן לבצע משימות אחרות: כאן, נורית LED של מצב שמהבהבת כל הזמן כדי להראות שהבקר פועל.

challenge icon

אתגר

בינוני

נורית ה־LED של המצב בפין 13 כבר מהבהבת, וה־enum ו־lightStart מוכנים. כתבו את רמזור התנועה בתור switch (light), עם case אחד לכל אור:

  • ירוק 2 s, צהוב 1 s, אדום 2 s, ואז שוב ירוק
  • נורית אחת בכל פעם, באמצעות setLights()
  • בלי delay(), כדי שנורית ה־LED של המצב תמשיך להבהב

לחצו על Run, ואז על Check.

נסו בעצמכם

const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;
const int statusLed = 13;   // נורית ה-LED של הלוח עצמו

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;   // מתי נדלק האור הנוכחי

unsigned long statusPrevious = 0;
int statusState = LOW;

void setup() {
  pinMode(greenLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(statusLed, OUTPUT);
}

void setLights(int green, int yellow, int red) {
  digitalWrite(greenLed, green);
  digitalWrite(yellowLed, yellow);
  digitalWrite(redLed, red);
}

void loop() {
  unsigned long now = millis();

  // נורית ה-LED של המצב מחליפה מצב כל 250 ms, כדי להראות שהבקר פועל
  if (now - statusPrevious >= 250) {
    statusPrevious = now;
    if (statusState == LOW) {
      statusState = HIGH;
    } else {
      statusState = LOW;
    }
    digitalWrite(statusLed, statusState);
  }

  // הרמזור: פקודת switch (light) עם case אחד לכל אור
  // ירוק 2 s, צהוב 1 s, אדום 2 s, ואז שוב ירוק
}
quiz iconבחנו את עצמכם

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

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

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