/*
  Arduino入門 第7回 残り時間目安をLEDで表示
    残り時間に応じて、LEDの点灯状態を変更し、
    同時にアラーム音を1秒鳴らす
*/

#define TIMER 20      // タイマー時間(秒)
#define HALF_TIMER 10 // 「残り時間が半分」の時間(秒)
#define SOON_TIMER 3  // 「もうすぐ時間ですよ」の残り時間(秒)

#define SW_PIN A5 // スイッチ接続端子
#define SW_OFF 1  // スイッチOFFのdigitalReadの値

#define LED_PIN 12 // 1秒ごとに点滅するLEDの接続端子
#define LED_ON_INTERVAL   50 // LEDを点灯する時間
#define LED_OFF_INTERVAL 950 // LEDを消灯する時間

#define FULL_PIN 8 // 「残り時間が十分にある」LEDの接続端子
#define HALF_PIN 6 // 「残り時間が半分」LEDの接続端子
#define SOON_PIN 4 // 「もうすぐ時間ですよ」LEDの接続端子

#define SPEAKER_PIN A0  // スピーカー接続端子
#define ALARM_TONE 1760 // アラーム音の周波数


void setup() {
  // LED接続端子を出力制御にする
  pinMode(LED_PIN,  OUTPUT);
  pinMode(FULL_PIN, OUTPUT);
  pinMode(HALF_PIN, OUTPUT);
  pinMode(SOON_PIN, OUTPUT);

  // スイッチ接続端子をプルアップ機能有効にする
  pinMode(SW_PIN, INPUT_PULLUP);
}

void loop() {
  // スイッチが押されるまで待つ
  while( digitalRead(SW_PIN) == SW_OFF ) {
  }

  // 「残り時間が十分にあるLED」を点灯
  digitalWrite(FULL_PIN, HIGH);

  // 指定した時間、LEDを点滅する
  for(int i=0; i<TIMER; i++) {
    // 残り時間を計算
    int nokori = TIMER - i;

    // 残り時間が半分時のLED制御
    if(nokori == HALF_TIMER){
      digitalWrite(FULL_PIN, LOW);  // 「残り時間十分」LEDをOFF
      digitalWrite(HALF_PIN, HIGH); // 「残り時間半分」LEDをON
    }

    // もうすぐの時のLED制御
    if(nokori == SOON_TIMER) {
      digitalWrite(HALF_PIN, LOW);  // 「残り時間半分」LEDをOFF
      digitalWrite(SOON_PIN, HIGH); // 「もうすぐ」LEDをON
    }

    if(nokori==HALF_TIMER || nokori==SOON_TIMER) {
      // LEDをピカッと点滅して、同時に音で知らせる
      tone(SPEAKER_PIN, ALARM_TONE); // 最初にアラーム音を鳴らして、
      digitalWrite(LED_PIN, HIGH);   // LEDをピカッと1秒間で点滅して
      delay(LED_ON_INTERVAL);
      digitalWrite(LED_PIN, LOW);
      delay(LED_OFF_INTERVAL);
      noTone(SPEAKER_PIN);           // アラーム音を止める
    } else {
      // LEDをピカッと1秒間で点滅するだけ
      digitalWrite(LED_PIN, HIGH);
      delay(LED_ON_INTERVAL);
      digitalWrite(LED_PIN, LOW);
      delay(LED_OFF_INTERVAL);
    }
  }

  // アラームを鳴らす
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);

  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);
  
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(120);
  noTone(SPEAKER_PIN);

  // LEDを消灯
  digitalWrite(SOON_PIN, LOW);
}


$abcdeabcde151015202530354045505560fghijfghij