/*
 * キッチンタイマー
 *   動作概要
 *    ・スイッチを押すとタイマーのカウントを開始する 
 *    ・残り時間に応じて以下の処理をする
 *       - 残り時間が設定時間の2/3になったら黄色LEDを点灯
 *       - 残り時間が設定時間の1/3になったら赤色LEDを点灯
 *    ・設定時間が来たらアラーム音を鳴らす
 * 
 *   変更履歴
 *    2019.5.18 : 新規作成
 *   
 */

// 秒表示LEDのピン番号
#define PIN_BYOU 12

// 残り時間表示LEDのピン番号
#define PIN_GREEN  8
#define PIN_YELLOW 6
#define PIN_RED    4

// スピーカーのピン番号
#define PIN_SPEAKER A0

// スイッチのピン番号
#define PIN_SWITCH A5

// タイマー時間 (単位は秒)
#define SETTEI_JIKAN 10

// お知らせ時間
#define OSHIRASE_JIKAN 3

// 音階周波数
#define E3 165
#define F3 175
#define G3 196
#define A3 220
#define B3 247
 
#define C4 262
#define D4 294
#define E4 330
#define F4 349
#define G4 392
#define A4 440
#define B4 494

#define C5 523
#define D5 587
#define E5 659


// メロディー配列
uint16_t start_melody[] = {C4, F4, A4};
uint16_t alarm_melody[] = {C4, E4, G4, E4, C4, E4, G4, E4, C4, E4, G4, B4, C5};


void setup() {

  // シリアルモニタ初期化
  Serial.begin(9600);
  //while(!Serial) ;

  // LED接続ピンの設定
  pinMode(PIN_BYOU,   OUTPUT);
  pinMode(PIN_GREEN,  OUTPUT);
  pinMode(PIN_YELLOW, OUTPUT);
  pinMode(PIN_RED,    OUTPUT);

  // スピーカー接続ピンの設定
  pinMode(PIN_SPEAKER, OUTPUT);

  // スイッチ接続ピンの設定
  pinMode(PIN_SWITCH, INPUT_PULLUP);

  // LEDを消しておく
  digitalWrite(PIN_BYOU,   LOW);
  digitalWrite(PIN_GREEN,  LOW);
  digitalWrite(PIN_YELLOW, LOW);
  digitalWrite(PIN_RED,    LOW);

}




void loop() {

  // 時間カウント用の変数
  uint16_t counter;

  // 黄色LED点灯のタイミング
  uint16_t green_off = SETTEI_JIKAN / 3;

  // 赤色LED点灯のタイミング
  uint16_t yellow_off = SETTEI_JIKAN * 2 / 3;

  // 最初は秒表示のLEDを点灯する
  digitalWrite(PIN_BYOU, HIGH);

  // 電源ON時のメロディーを鳴らす
  for(counter=0; counter<3; counter++) {
    tone(PIN_SPEAKER, start_melody[counter]);
    delay(100);  
  }
  noTone(PIN_SPEAKER);

  // スタートスイッチが押されるまで待つ
  while( digitalRead(PIN_SWITCH) == 1 ) {
  }

  // スタートスイッチが押されたら、緑色点灯
  digitalWrite(PIN_GREEN,  HIGH);

  // タイマーカウント開始
  for( counter = 0; counter < SETTEI_JIKAN; counter++ ) {

    // 黄色LED点灯タイミングになったら、緑色LEDを消して黄色LEDを点灯する
    if( counter == green_off ) {
      digitalWrite(PIN_GREEN, LOW);
      digitalWrite(PIN_YELLOW, HIGH);
    }

    // 赤色LED点灯タイミングになったら、黄色LEDを消して赤色LEDを点灯する
    if( counter == yellow_off ) {
      digitalWrite(PIN_YELLOW, LOW);
      digitalWrite(PIN_RED, HIGH);
    }

    // タイマー時間がお知らせ時間前であればLEDのみ点滅
    // お知らせ時間になったら、それ以降はピッピッと音を鳴らす
    // if( counter < (SETTEI_JIKAN - OSHIRASE_JIKAN) ) {
    if( true ) {
      digitalWrite(PIN_BYOU, HIGH);
      delay(50);
      digitalWrite(PIN_BYOU, LOW);
      delay(950);
    } else {
      digitalWrite(PIN_BYOU, HIGH);
      tone(PIN_SPEAKER, A4);
      delay(50);
      digitalWrite(PIN_BYOU, LOW);
      noTone(PIN_SPEAKER);
      delay(950);
    }
  }

  // 時間になったらアラーム音を鳴らす
  while( true ) {
    for(counter=0; counter<13; counter++){
      tone(PIN_SPEAKER, alarm_melody[counter]);
      delay(200);
    }
    noTone(PIN_SPEAKER);
    delay(1500);
  }


}
$abcdeabcde151015202530354045505560fghijfghij