אות להולכי רגל וזמזם
חלק מהיחידה פרויקטים במסלול ה-Arduino של Coddy. שיעור 4 מתוך 24.
להולכי רגל יש אורות משלהם: אדום בפין 7 (להמתין) וירוק בפין 6 (ללכת). בזמן שלמכוניות יש אור אדום, הולכי הרגל רואים ירוק; בשאר הזמן הם רואים אדום.
אות ההליכה משתנה בשני רגעים בלבד: כשהמכוניות עוברות לאדום וכשהן יוצאות ממנו. כתבו פונקציה לאורות ההליכה וקראו לה בשני המקומות האלה:
void showWalk(bool walk) {
if (walk) {
digitalWrite(walkRedPin, LOW);
digitalWrite(walkGreenPin, HIGH);
} else {
digitalWrite(walkGreenPin, LOW);
digitalWrite(walkRedPin, HIGH);
}
}במעברי חצייה נשמעים גם צפצופים כשבטוח לחצות, עבור אנשים שאינם יכולים לראות את האורות. tone() יכולה לקבל מספר שלישי, שמציין כמה זמן לנגן: tone(buzzerPin, 1000, 100) מנגנת בתדר 1000 הרץ במשך 100 מילישניות ומפסיקה מעצמה. הסקץ׳ לא ממתין לה.
כדי לצפצף כל 500 מילישניות רק בזמן האור האדום, הוסיפו טיימר שלישי של millis() בתוך case RED:.
אתגר
בינוניהוסף את אות ההליכה ואת הצפצפה שלו:
- אדום להולכי הרגל בפין 7 וירוק להולכי הרגל בפין 6, שניהם מוגדרים כפלט
- כשהאור של המכוניות אדום: ירוק להולכי הרגל דולק, אדום להולכי הרגל כבוי, וצפצוף של 100 ms בתדר 1000 Hz בפין 8 כל 500 ms
- בשאר הזמן: אדום להולכי הרגל דולק, ירוק להולכי הרגל כבוי, ללא צליל
לחץ על Run, ואז על Check.
נסו בעצמכם
// הרמזורים למכוניות
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// נורית ה-LED של הלוח עצמו: נורית המצב של הבקר
const int statusPin = 13;
// כפתור חציית הכביש
const int buttonPin = 2;
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);
pinMode(buttonPin, INPUT_PULLUP);
showLight(greenPin);
}
void loop() {
unsigned long now = millis();
switch (light) {
case GREEN:
// לחיצה על כפתור חציית הכביש מסיימת את האור הירוק מוקדם.
if (now - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
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 אונליין