#include #define CLK 2 #define DAT 1 #define BUZZER 0 #define SWD 3 #define SWA 2 //A2 #define WAIT 10 static volatile uint8_t minute, second; uint8_t mode, ltime, rtime; void setup() { pinMode(CLK, OUTPUT); pinMode(DAT, OUTPUT); pinMode(BUZZER, OUTPUT); pinMode(SWD, INPUT); digitalWrite(CLK, HIGH); digitalWrite(DAT, HIGH); mode = 0; ltime = 0; rtime = 0; } void loop() { int swin; switch(mode) { case 0: if(digitalRead(SWD) == LOW) { minute = ltime * 10 + rtime; if(minute > 0) { second = 60; WDT_start(); //ウォッチドッグタイマースタート beep(100); mode = 1; } //ボタンを離すのを待つ while(digitalRead(SWD) == LOW); } else { swin = analogRead(SWA); if(swin > 600) //押していない break; else if(swin > 400) //右 { if(++rtime == 10) rtime = 0; } else //左 { if(++ltime == 10) ltime = 0; } sendNumber(ltime * 10 + rtime); delay(100); } break; case 1: if(digitalRead(SWD) == LOW) { WDT_stop(); beep(100); sendNumber(ltime * 10 + rtime); mode = 0; //ボタンを離すのを待つ while(digitalRead(SWD) == LOW); } break; case 2: for(int i=0; i<5; i++) beep(1000); sendNumber(ltime * 10 + rtime); mode = 0; break; } } void beep(uint8_t ms) { digitalWrite(BUZZER,HIGH);//ブザーON delay(ms); digitalWrite(BUZZER,LOW);//ブザーOFF delay(ms); } void sendNumber(uint8_t number) { digitalWrite(CLK, LOW); //スタートビット delay(WAIT); digitalWrite(CLK, HIGH); delay(WAIT); for(int n = 0; n < 8; n++) { digitalWrite(DAT, (number >> n) & 1); delay(WAIT); digitalWrite(CLK, LOW); delay(WAIT); digitalWrite(CLK, HIGH); } } void WDT_start() { cli(); //割り込み禁止 //1秒間隔で割り込み WDTCR = _BV(WDTIE) | _BV(WDP2) | _BV(WDP1); wdt_reset(); //ウォッチドッグタイマーリセット sei(); //割り込み許可 } //割り込み停止 void WDT_stop() { cli(); //割り込み禁止 WDTCR = 0; //ウォッチドッグ割り込み停止 wdt_reset(); //ウォッチドッグタイマーリセット sei(); //割り込み許可 } // タイマー割り込みエントリ ISR(WDT_vect) { if(--second == 0) { if(--minute == 0) { WDT_stop(); mode = 2; } second = 60; } sendNumber(minute); }