#include #include #define LCD_RS 5 #define LCD_RW 6 #define LCD_E 7 #define LCD_DB4 8 #define LCD_DB5 9 #define LCD_DB6 10 #define LCD_DB7 11 #define START 2 #define MODE 3 #define TONE 12 #define LED 13 //LiquidCrystal lcd(4,5,6,7,8,9,10); //LiquidCrystal lcd(LCD_RS,LCD_RW,LCD_E,LCD_DB4,LCD_DB5,LCD_DB6,LCD_DB7); LiquidCrystal lcd(5,6,7,8,9,10,11); int f; int s; int match; int t; int stat; int mode; // タイミング。単位:100mS int schedule[]={3000,2985,2980,2975,2970,2965, // 0..5 before 5m whistle 2900,2800,2700,2699,2600,2500,2400,2385,2380,2375,2370, // 6..16 before 5m 2300,2200,2100,2099,2000,1900,1800,1785,1780,1775, // 17..26 before 4m 1700,1600,1500,1499,1400,1300,1200,1185,1180, // 27..35 before 3m 1100,1000, 900,899, 800, 700, 600, 585, // 36..43 before 2m 500, 400, 300,299, 200, // 44..48 before 1m 100, 90, 80, 70, 60, // 49..53 before 10s 50,49,48,47,46, // 54..58 before 5s 40,39,38,37, // 59..62 before 4s 30,29,28, // 63..65 before 3s 20,19, // 66..67 before 2s 10, // 68 before 1s 0}; // 69 START // トーン。単位:Hz int tonemap[]={ 880,880,880,880,880,880, 880, 880, 880,880, 880, 880, 880,880,880,880,880, 880, 880, 880,880, 880, 880, 880,880,880,880, 880, 880, 880,880, 880, 880, 880,880,880, 880, 880, 880,880, 880, 880, 880,880, 880, 880, 880,880, 880, 880, 880, 880, 880, 880, 880,880,880,880,880, 880,880,880,880, 880,880,880, 880,880, 880, 880}; // デュレーション。単位:mS int duration[]={ 1000,150,150,150,150,150, 75, 75, 75,75, 75, 75, 1000,150,150,150,150, 75, 75, 75,75, 75, 75, 1000,150,150,150, 75, 75, 75,75, 75, 75, 1000,150,150, 75, 75, 75,75, 75, 75, 1000,150, 75, 75, 75,75, 75, 75, 75, 75, 75, 75, 75,75,75,75,75, 75,75,75,75, 75,75,75, 75,75, 75, 3000}; /* int modetime[]= { 0,600,1200,1800,2400,3000}; int modeidx[] = { 0,44,36, 27, 17, 6}; */ int modetime[]= { 0,600,1200,1800,2400,3000}; int modeidx[] = { 0,47,41, 23, 12, 0}; void timeup() { static boolean output = HIGH; digitalWrite(LED,output); f=1; output = !output; --t; } void setup() { // LCD lcd.begin(16,2); mode=5; modeout(mode); // TIMER f=0; pinMode(START,INPUT); pinMode(MODE,INPUT); pinMode(TONE,OUTPUT); Timer1.initialize(100000); Timer1.stop(); Timer1.attachInterrupt(timeup); t=101;s=33; // 10s match=schedule[s]; stat=0; } void modeout( int m ) { lcd.clear(); switch (m) { case 3: lcd.print("MODE=3min"); break; case 4: lcd.print("MODE=4min"); break; case 5: lcd.print("MODE=5min"); break; default: lcd.print("MODE=UNKNOWN"); break; } } void lcdout( int time , int col) { int min=time/60; int sec=time%60; lcd.clear(); //lcd.setCursor(col,0); lcd.print("Before "); lcd.print(min); lcd.print(":"); lcd.print(sec); } void readyout( int time) { lcd.clear(); lcd.print("READY "); lcd.print(time); } void loop() { static int mt=0; switch (stat) { case 0: // 動作設定 if (digitalRead(MODE) == 0 ) { // MODEボタン mt++; if (mt==100) { mode++; if (5 < mode ) { mode=3; } modeout(mode); } if (100 < mt ) { mt--;} } else { mt=0; } if(digitalRead(START) == 0) { // STARTボタン stat=1; t=modetime[mode]; s=modeidx[mode]; //t=51;s=38; // 5S t=51;s=54; //t=101;s=33; match=schedule[s]; Timer1.start(); } break; case 1: // カウント開始前のカウント if (f==1 ) { if(t==match) { if (t<=0) { Timer1.stop(); //t=600;s=28; t=modetime[mode]; s=modeidx[mode]; match=schedule[s]; stat=2; Timer1.start(); } tone (TONE,tonemap[s],duration[s]); match=schedule[++s]; } f=0; if ( t < 60 ) { if (t % 10 == 0 ) { readyout(t/10);} } else { lcdout(t/10,0); } } break; case 2: // カウント開始 if (f==1 ) { f=0; // タイマー処理 if(t==match) { tone (TONE,tonemap[s],duration[s]); match=schedule[++s]; if (t<=0) { Timer1.stop(); stat=0; } } // LCD処理 if (t<=0) { modeout(mode); lcd.setCursor(10,0); lcd.print("START!!"); } else { if (t % 10 == 0 ) { lcdout(t/10 , 8) ;} } // CANCEL処理 if(digitalRead(START) == 0) { mt++; if (mt==20) { Timer1.stop(); lcd.setCursor(1,1); lcd.print("CANCELED"); stat=0; mt=0; while (digitalRead(START)==0) {} modeout(mode); } } } break; default: break; } }