次の課題は鉄道信号だ。前項で光センサーは日没と共に照明が点灯するという想定で使用したが、今回は車両がセンサーを覆う事をトリガーに赤信号を点灯させる。なので、前項のLEDはそのまま赤信号と思えば良いわけだ。これに黄と緑の信号を加え、赤点灯で6秒後に黄に切り替え、さらに6秒後に緑に戻すというロジックで実験を行なった(教科書76ページ)。まずは結果の動画をご覧あれ。左下がセンサーだ。
鉄道信号
スケッチは下記の通り、前回の「IfStatementConditional1」を改造し、緑(led2Pin)と黄(led3Pin)の信号部分を追加し、6秒間のdelay処理を入れたもの。教科書には他に2灯式や4灯式の信号例も載っていたが、基本的に数の増減だけなので実験は省略した。
[ スケッチ:IfStatementConditional3]
// These constants won't change:
const int analogPin = A0; // pin that the sensor is attached to
const int ledPin = 13; // pin that the RED LED is attached to
const int led2Pin = 12; // pin that the GRN LED is attached to
const int led3Pin = 11; // pin that the YEL LED is attached to
const int threshold = 150; // an arbitrary threshold level that's in the range of the analog input
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT); // RED
pinMode(led2Pin, OUTPUT); // GRN
pinMode(led3Pin, OUTPUT); // YEL
// initialize serial communications:
Serial.begin(9600);
}
void loop() {
// read the value of the potentiometer:
int analogValue = analogRead(analogPin);
// if the analog value is high enough, turn on the LED:
if (analogValue < threshold) {
digitalWrite(ledPin, HIGH); // RED *
digitalWrite(led2Pin, LOW); // GRN
digitalWrite(led3Pin, LOW); // YEL
delay(6000);
digitalWrite(ledPin, LOW); // RED
digitalWrite(led2Pin, LOW); // GRN
digitalWrite(led3Pin, HIGH); // YEL *
delay(6000);
} else {
digitalWrite(ledPin, LOW); // RED
digitalWrite(led2Pin, HIGH); // GRN *
digitalWrite(led3Pin, LOW); // YEL
}
// print the analog value:
Serial.println(analogValue);
delay(1); // delay in between reads for stability
}