החלפת מצבים באמצעות כפתור
חלק מהיחידה תזמון ללא 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.
אתגר
בינוניהכפתור וה־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;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תזמון ללא Delay
תרגלו בעצמכם: Arduino אונליין