横断ボタン
CoddyのArduinoジャーニー「プロジェクト」セクションの一部。レッスン 3/24。
歩行者には、道路を渡りたいことを知らせる方法が必要です。ピン 2 の青いボタンは横断ボタンです。青信号中に押すと、青信号がただちに終わり、車は黄色、次に赤になります。
信号は millis() を使って動作するため、loop() は1秒間に何千回も青信号の状態を通過し、そのたびに時計と同様にボタンを読み取れます。どちらかが真になると青信号が終わります。これは ||(または)が示す動作です。
case GREEN:
if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
// 黄色に切り替える
}
break;ボタンはピン 2 をグラウンドに接続するため、ピンを INPUT_PULLUP に設定します。ボタンによって LOW になるまでは HIGH を読み取ります。
ボタンを読み取るのは青信号の状態だけです。黄色と赤のときは車はすでに停止中であり、運転手が停止する時間を確保できるよう、黄色は丸1秒間続きます。
チャレンジ
中級横断ボタンをピン 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);
}
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
プロジェクトのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド