// 秒を表現するLED関連(青色LED)
#define BYOU_LED 12 // 秒を表現する青色LEDの端子番号
#define BYOU_ON 50 // 秒を表現するLEDをつけている時間 (単位:ミリ秒)
#define BYOU_OFF 1000 - BYOU_ON // 秒を表現するLEDを消している時間 (単位:ミリ秒)
// 残り時間を表現するLED関連(緑色、黄色、赤色LED)
#define LED_MIDORI 8 // 緑色LEDの端子番号
#define LED_KIIRO 6 // 黄色LEDの端子番号
#define LED_AKA 4 // 赤色LEDの端子番号
// タイマー時間設定(単位:秒)
#define TIMER_JIKAN 18
// 残り時間を表現するLEDの制御時間
#define KIIRO_JIKAN TIMER_JIKAN / 3
#define AKA_JIKAN TIMER_JIKAN / 3 * 2
// 残り時間のenum型宣言
// 十分 半分以下 もうすぐ
enum nokori {jyuubun, hanbun, mousugu};
void controlTimeLed(enum nokori nokori_jikan) {
// 残り時間に応じた処理
switch(nokori_jikan) {
// 残り時間十分
case jyuubun:
digitalWrite(LED_MIDORI, HIGH);
digitalWrite(LED_KIIRO, LOW);
digitalWrite(LED_AKA, LOW);
break;
// 残り時間半分以下
case hanbun:
digitalWrite(LED_MIDORI, LOW);
digitalWrite(LED_KIIRO, HIGH);
digitalWrite(LED_AKA, LOW);
break;
// もうすぐ設定時刻
case mousugu:
digitalWrite(LED_MIDORI, LOW);
digitalWrite(LED_KIIRO, LOW);
digitalWrite(LED_AKA, HIGH);
break;
}
}
void setup() {
// 端子の設定
pinMode(BYOU_LED, OUTPUT); // 青色LED接続端子設定
pinMode(LED_MIDORI, OUTPUT); // 緑色LED接続端子設定
pinMode(LED_KIIRO, OUTPUT); // 緑色LED接続端子設定
pinMode(LED_AKA, OUTPUT); // 緑色LED接続端子設定
// 秒のLED(青色LED)を点灯する
digitalWrite(BYOU_LED, HIGH);
// タイマー開始時に緑色LEDを点灯
controlTimeLed(jyuubun); // 「残り時間十分」の表示
}
void loop() {
uint8_t count; // for文で回数を数えるために使用する変数
// TIMER_JIKAN分の回数を数える
for( count=0; count<TIMER_JIKAN; count++) {
// 残り時間表現用LEDの制御
if( count == KIIRO_JIKAN ) {
controlTimeLed(hanbun); // 「残り時間少ない」の表示
}
if( count == AKA_JIKAN ){
controlTimeLed(mousugu); // 「もうすぐ設定時間」の表示
}
// 残り時間に応じて処理を変える
if( count >= (TIMER_JIKAN - 5) ) {
// 残り時間が5秒以下になったら、1秒に1回青色LEDを点滅して音を鳴らす
digitalWrite(BYOU_LED, HIGH);
delay(BYOU_ON);
digitalWrite(BYOU_LED, LOW);
delay(BYOU_OFF);
} else {
// そうでなければ、1秒に1回青色LEDを点滅する
digitalWrite(BYOU_LED, HIGH);
delay(BYOU_ON);
digitalWrite(BYOU_LED, LOW);
delay(BYOU_OFF);
}
}
// 時間になったので秒のLED(青色LED)を点灯する
digitalWrite(BYOU_LED, HIGH);
// 何もしないで待つ
while( true ) {
}
}