Menu
CoddyTech

歩行者用信号とブザー

CoddyのArduinoジャーニー「プロジェクト」セクションの一部。レッスン 4/24。

歩行者にも専用の信号があります。7番ピンの赤(待つ)と6番ピンの緑(渡る)です。車の信号が赤の間は歩行者の信号が緑になり、それ以外の時間は赤になります。

歩行者用信号が切り替わるのは、車の信号が赤になったときと赤から変わるときの2回だけです。歩行者用信号の関数を書き、その2か所で呼び出しましょう。

void showWalk(bool walk) {
  if (walk) {
    digitalWrite(walkRedPin, LOW);
    digitalWrite(walkGreenPin, HIGH);
  } else {
    digitalWrite(walkGreenPin, LOW);
    digitalWrite(walkRedPin, HIGH);
  }
}

信号が安全に渡れることを知らせるため、交差点では音も鳴ります。これは信号が見えない人のためです。tone()には、鳴らす時間を指定する3つ目の数値を渡せます。tone(buzzerPin, 1000, 100)は1000 Hzの音を100 ms鳴らし、自動的に停止します。スケッチはその間待ちません。

赤信号の間だけ500 msごとに音を鳴らすには、case RED:の中に3つ目のmillis()タイマーを追加します。

challenge icon

チャレンジ

中級

歩行者用信号とブザーを追加します。

  • 歩行者用の赤信号をピン 7 に、青信号をピン 6 に接続し、どちらも出力に設定します
  • 車両用信号が赤の間は、歩行者用の青信号を点灯、赤信号を消灯し、ピン 8 で 500 ms ごとに 1000 Hz のビープ音を 100 ms 鳴らします
  • それ以外の時間は、歩行者用の赤信号を点灯、青信号を消灯し、音を鳴らしません

実行を押してから、確認を押します。

自分で試してみよう

// 車両用の信号灯
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;

// 1つの信号灯を点灯し、ほかの2つを消灯する。
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プレイグラウンド