Menu
CoddyTech

החלפת מצבים באמצעות כפתור

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

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

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

void nextMode() {
  switch (mode) {
    case OFF:
      mode = ON;
      Serial.println("ON");
      break;
    // ... וכן הלאה, עד ש-FAST חוזר ל-OFF
  }
}

הסקץ' קורא ל־nextMode() פעם אחת בכל לחיצה. מסננים את רעידות הכפתור כפי שלמדתם ביחידת הקלטים: כשהקריאה משתנה, פועלים בהתאם, ואז ממתינים 20 ms עד שהמגעים מתייצבים. פקודת switch שנייה על mode קובעת את ה־LED.

challenge icon

אתגר

בינוני

הכפתור וה־LED נכתבו עבורך. כתוב את nextMode() כך שכל לחיצה תעביר למצב הבא ותדפיס את שמו: OFF, ON, BLINK, FAST, ואז שוב OFF.

לחץ על Run, לחץ על הכפתור כמה פעמים, ואז על Check.

נסו בעצמכם

const int ledPin = 13;
const int buttonPin = 2;

enum Mode { OFF, ON, BLINK, FAST };
Mode mode = OFF;

bool wasPressed = false;
unsigned long blinkPrevious = 0;
int ledState = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

// עובר למצב הבא ומדפיס את שמו.
void nextMode() {
  // מקרה אחד לכל מצב: הגדר את המצב הבא, הדפס את שמו, בצע break
}

// משנה את מצב ה-LED בכל interval מילישניות.
void blinkEvery(unsigned long interval) {
  unsigned long now = millis();
  if (now - blinkPrevious >= interval) {
    blinkPrevious = now;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
  }
}

void loop() {
  // 1. לחיצה (לאחר סינון ריצוד) קוראת ל-nextMode()
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      nextMode();
    }
    wasPressed = pressed;
    delay(20);   // אפשר למגעים להתייצב
  }

  // 2. המצב קובע מה ה-LED עושה
  switch (mode) {
    case OFF:
      digitalWrite(ledPin, LOW);
      break;
    case ON:
      digitalWrite(ledPin, HIGH);
      break;
    case BLINK:
      blinkEvery(500);
      break;
    case FAST:
      blinkEvery(100);
      break;
  }
}
quiz iconבחנו את עצמכם

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

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

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