Menu
CoddyTech

横断ボタン

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

歩行者には、道路を渡りたいことを知らせる方法が必要です。ピン 2 の青いボタンは横断ボタンです。青信号中に押すと、青信号がただちに終わり、車は黄色、次に赤になります。

信号は millis() を使って動作するため、loop() は1秒間に何千回も青信号の状態を通過し、そのたびに時計と同様にボタンを読み取れます。どちらかが真になると青信号が終わります。これは ||(または)が示す動作です。

case GREEN:
  if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
    // 黄色に切り替える
  }
  break;

ボタンはピン 2 をグラウンドに接続するため、ピンを INPUT_PULLUP に設定します。ボタンによって LOW になるまでは HIGH を読み取ります。

ボタンを読み取るのは青信号の状態だけです。黄色と赤のときは車はすでに停止中であり、運転手が停止する時間を確保できるよう、黄色は丸1秒間続きます。

challenge icon

チャレンジ

中級

横断ボタンをピン 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;

// 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);
  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);
    }
  }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

プロジェクトのすべてのレッスン

自分で練習してみよう: Arduinoプレイグラウンド