/*
* キッチンタイマー
* 動作概要
* ・スイッチを押すとタイマーのカウントを開始する
* ・残り時間に応じて以下の処理をする
* - 残り時間が設定時間の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);
}
}