כפתור חצייה
חלק מהיחידה פרויקטים במסלול ה-Arduino של Coddy. שיעור 3 מתוך 24.
הולכי רגל צריכים דרך לבקש לחצות את הכביש. הכפתור הכחול בפין 2 הוא כפתור החצייה: לחיצה בזמן שהאור ירוק מסיימת את האור הירוק מיד, כך שלמכוניות נדלק אור צהוב ואז אדום.
מכיוון שהאורות פועלים באמצעות millis(), loop() עוברת על מצב האור הירוק אלפי פעמים בשנייה ויכולה לקרוא את הכפתור בכל פעם, וגם את השעון. האור הירוק מסתיים כשאחד משני התנאים מתקיים, וזה מה ש-|| (או) מציין:
case GREEN:
if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
// לעבור לצהוב
}
break;הכפתור מחבר את פין 2 להארקה, לכן יש להגדיר את הפין כ-INPUT_PULLUP: הוא קורא HIGH עד שהכפתור מושך אותו ל-LOW.
רק מצב האור הירוק קורא את הכפתור. באור הצהוב והאדום המכוניות כבר עוצרות, והאור הצהוב נשאר דולק במשך כל השנייה כדי שלנהגים יהיה זמן לעצור.
אתגר
בינוניהוסף את כפתור החצייה לפין 2:
- הגדר את פין 2 ל־
INPUT_PULLUP - כשהאור ירוק, לחיצה מסיימת מיד את השלב הירוק (האור הופך לצהוב)
- השלבים הצהוב והאדום נמשכים כרגיל, בין אם לוחצים ובין אם לא
לחץ על Run, המתן לאור הירוק, לחץ על הכפתור הכחול ואז על Check.
נסו בעצמכם
// אורות הרמזור למכוניות
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// נורית ה־LED של הלוח עצמו: נורית המצב של הבקר
const int statusPin = 13;
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0; // מתי נדלק האור הנוכחי
bool statusOn = false;
unsigned long lastBlink = 0;
// הדלק נורה אחת וכבה את השתיים האחרות.
void showLight(int pin) {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(pin, HIGH);
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(statusPin, OUTPUT);
showLight(greenPin);
}
void loop() {
unsigned long now = millis();
switch (light) {
case GREEN:
if (now - lightStart >= 3000) {
light = YELLOW;
lightStart = now;
showLight(yellowPin);
}
break;
case YELLOW:
if (now - lightStart >= 1000) {
light = RED;
lightStart = now;
showLight(redPin);
}
break;
case RED:
if (now - lightStart >= 3000) {
light = GREEN;
lightStart = now;
showLight(greenPin);
}
break;
}
// נורית המצב מהבהבת כל 500 ms, ללא קשר לפעולת אורות הרמזור למכוניות.
if (now - lastBlink >= 500) {
lastBlink = now;
if (statusOn) {
statusOn = false;
digitalWrite(statusPin, LOW);
} else {
statusOn = true;
digitalWrite(statusPin, HIGH);
}
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פרויקטים
תרגלו בעצמכם: Arduino אונליין