Menu
CoddyTech

אות להולכי רגל וזמזם

חלק מהיחידה פרויקטים במסלול ה-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:.

challenge icon

אתגר

בינוני

הוסף את אות ההליכה ואת הצפצפה שלו:

  • אדום להולכי הרגל בפין 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);
    }
  }
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה פרויקטים

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