רמזור באמצעות millis()
חלק מהיחידה פרויקטים במסלול ה-Arduino של Coddy. שיעור 2 מתוך 24.
במהלך כל delay(3000) הלוח לא עושה שום דבר אחר, ולכן הוא לא יכול לזהות את כפתור מעבר החצייה שהשלב הבא מוסיף. התזמון עובר ל־millis().
האור הוא מכונת מצבים: הוא תמיד נמצא במצב אחד (ירוק, צהוב או אדום) ועובר למצב הבא כשהמצב הנוכחי נמשך מספיק זמן. enum נותן שמות למצבים, משתנה אחד מחזיק את המצב הנוכחי, ומשתנה אחר מחזיק את זמן תחילת המצב:
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;המצב הראשון הוא ירוק, לכן הדלק את האור הירוק בתוך setup(). בכל מעבר של loop(), switch בודק אם המצב הנוכחי נמשך מספיק זמן, ורק אז עובר למצב הבא ומשנה את האורות:
case GREEN:
if (millis() - lightStart >= 3000) {
light = YELLOW;
lightStart = millis();
showLight(yellowPin);
}
break;שום דבר לא ממתין, ולכן loop() פנויה למשימות אחרות. הוכח זאת באמצעות נורית חיווי: הבהב בנורית ה־LED המובנית של הלוח, בפין 13, כל 500 ms.
אתגר
בינוניכתבו מחדש את התזמון בלי delay():
- השאירו את האור הירוק דולק למשך 3000 ms, את הצהוב למשך 1000 ms ואת האדום למשך 3000 ms
- השתמשו ב־
enumעבור שלושת המצבים, ב־switchוב־millis() - הדליקו את האור הירוק ב־
setup(), וקראו ל־showLight()רק כשהמצב משתנה - הבהבו עם פין 13 כל 500 ms (500 ms דולק, 500 ms כבוי), כל הזמן
לחצו על Run, ואז על Check.
נסו בעצמכם
// אורות המכוניות
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// הדלק נורה אחת וכבה את שתי האחרות.
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);
}
void loop() {
showLight(greenPin);
delay(3000);
showLight(yellowPin);
delay(1000);
showLight(redPin);
delay(3000);
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פרויקטים
תרגלו בעצמכם: Arduino אונליין