Menu
CoddyTech

מצבים בעלי שמות עם enum

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

מצב שממוספר 0, 1 ו־2 עובד, אבל if (mode == 2) לא אומר מה המשמעות של 2. enum נותן לכל מספר שם:

enum State { READY, RUNNING, DONE };
State state = READY;

השורה הראשונה יוצרת טיפוס חדש, State, שהערכים היחידים שלו הם READY, RUNNING ו־DONE. מתחת לפני השטח הם עדיין 0, 1 ו־2, אבל השמות מציינים מה המשמעות של כל אחד מהם. השורה השנייה יוצרת משתנה מהטיפוס הזה.

enum ו־switch מתאימים זה לזה: case אחד לכל מצב.

switch (state) {
  case READY:
    // מה READY עושה, ומתי הוא עובר לשלב הבא
    break;
  case RUNNING:
    // ...
    break;
}

כדי לעבור למצב חדש, הגדר את state וזכור מתי הוא התחיל: state = DONE; stateStart = millis();. לאחר מכן, כל מצב מודד את משכו באמצעות millis() - stateStart. דרך הכתיבה הזאת של סקץ׳ נקראת מכונת מצבים.

challenge icon

אתגר

בינוני

למכונה יש שלושה מצבים. הקוד עבור READY נכתב עבורך: נורית ה־LED הירוקה דולקת, ולחיצה מפעילה את המכונה. הוסף את שני המקרים האחרים:

  • RUNNING: נורית ה־LED הצהובה דולקת. לאחר 2000 ms, כבה אותה ועבור ל־DONE.
  • DONE: נורית ה־LED האדומה דולקת. לאחר 1000 ms, כבה אותה וחזור ל־READY.

שמור את stateStart בכל שינוי. לחץ על Run, לחץ על הכפתור, ואז לחץ על Check.

נסו בעצמכם

const int buttonPin = 2;
const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;

enum State { READY, RUNNING, DONE };
State state = READY;

unsigned long stateStart = 0;   // מתי התחיל המצב הנוכחי

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

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

  switch (state) {
    case READY:
      digitalWrite(greenLed, HIGH);
      if (digitalRead(buttonPin) == LOW) {
        digitalWrite(greenLed, LOW);
        state = RUNNING;
        stateStart = now;
      }
      break;

    // הוסף מקרה RUNNING: הדלק את הנורית הצהובה; לאחר 2000 ms, כבה אותה ועבור ל-DONE

    // הוסף מקרה DONE: הדלק את הנורית האדומה; לאחר 1000 ms, כבה אותה וחזור ל-READY
  }
}
quiz iconבחנו את עצמכם

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

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

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