/* Arduino_Clock_v1 */ #include // タイマー割り込みを利用する為に必要なヘッダファイル int i; long timeNow; //現在時刻 long timeStart = millis(); //タイマー開始時刻 long timeDisp; //表示時刻 int vala1,vala2,vala3; volatile int HH = 20; volatile int MM = 15; volatile int Sec = 0; volatile int MS = 0; volatile int DPON = 0; volatile int BZON = 0; volatile int BLINK = 0; volatile int alHH = 0; volatile int alMM = 0; volatile int alON = 0; volatile int aln = 0; volatile int MS500 = 0; volatile int DISP3; volatile int DISP2; volatile int DISP1; volatile int DISP0; const int HH10 = 6; const int HH01 = 5; const int MM10 = 4; const int MM01 = 3; const int SEGA = 8; const int SEGB = 7; const int SEGC = 13; const int SEGD = 12; const int SEGE = 11; const int SEGF = 10; const int SEGG = 9; const int SEGP = 2; const int SEGDp = 1; const int BZ = 14; // Pin 13 has an LED connected on most Arduino boards. // give it a name: int led = 2; #define CATHODE //カソードコモンLED用を使用する場合は、(//)を外す。 #ifdef CATHODE //カソードコモンLED用レイアウトを定義 #define COMON HIGH #define COMOFF LOW boolean Num_Array[11][8]={ {1,1,1,1,1,1,0,0},{0,1,1,0,0,0,0,0},{1,1,0,1,1,0,1,0},{1,1,1,1,0,0,1,0}, {0,1,1,0,0,1,1,0},{1,0,1,1,0,1,1,0},{1,0,1,1,1,1,1,0},{1,1,1,0,0,0,0,0}, {1,1,1,1,1,1,1,0},{1,1,1,1,0,1,1,0},{0,0,0,0,0,0,0,0} }; #else //アノードコモンLED用レイアウトを定義 #define COMON LOW #define COMOFF HIGH boolean Num_Array[11][8]={ {0,0,0,0,0,0,1,1},{1,0,0,1,1,1,1,1},{0,0,1,0,0,1,0,1},{0,0,0,0,1,1,0,1}, {1,0,0,1,1,0,0,1},{0,1,0,0,1,0,0,1},{0,1,0,0,0,0,0,1},{0,0,0,1,1,1,1,1}, {0,0,0,0,0,0,0,1},{0,0,0,0,1,0,0,1},{1,1,1,1,1,1,1,1} }; #endif //LED表示関数を定義 void NumPrint(int Number){ digitalWrite(SEGA,Num_Array[Number][0]); digitalWrite(SEGB,Num_Array[Number][1]); digitalWrite(SEGC,Num_Array[Number][2]); digitalWrite(SEGD,Num_Array[Number][3]); digitalWrite(SEGE,Num_Array[Number][4]); digitalWrite(SEGF,Num_Array[Number][5]); digitalWrite(SEGG,Num_Array[Number][6]); } // 割り込み時に処理される関数 void Disp7seg() { static boolean num = 0; if(BZON != 0 && MS >= 500) digitalWrite(BZ, LOW); else digitalWrite(BZ, HIGH); if(MS >= 500) { MS500=1; digitalWrite(SEGP, COMOFF); } else { MS500=0; digitalWrite(SEGP, COMON); } MS++; if(MS == 1000) { MS = 0; Sec++; } if(Sec == 60) { Sec = 0; MM++; } if(MM == 60) { MM = 0; HH++; } if(HH == 24) { HH = 0; } switch(num) { case 0: digitalWrite(MM01, COMOFF); digitalWrite(HH10, COMOFF); NumPrint(DISP3); digitalWrite(SEGDp,COMOFF); digitalWrite(HH10, COMON); num++; break; case 1: digitalWrite(HH10, COMOFF); digitalWrite(HH01, COMOFF); NumPrint(DISP2); digitalWrite(HH01, COMON); num++; break; case 2: digitalWrite(HH01, COMOFF); digitalWrite(MM10, COMOFF); NumPrint(DISP1); digitalWrite(MM10, COMON); num++; break; case 3: digitalWrite(MM10, COMOFF); digitalWrite(MM01, COMOFF); NumPrint(DISP0); digitalWrite(SEGDp,DPON); digitalWrite(MM01, COMON); num=0; break; } digitalWrite(BZ, HIGH); } // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(HH10, OUTPUT); pinMode(HH01, OUTPUT); pinMode(MM10, OUTPUT); pinMode(MM01, OUTPUT); pinMode(SEGA, OUTPUT); pinMode(SEGB, OUTPUT); pinMode(SEGC, OUTPUT); pinMode(SEGD, OUTPUT); pinMode(SEGE, OUTPUT); pinMode(SEGF, OUTPUT); pinMode(SEGG, OUTPUT); pinMode(SEGP, OUTPUT); pinMode(SEGDp, OUTPUT); pinMode(BZ , OUTPUT); DPON = COMOFF; digitalWrite(BZ, HIGH); MsTimer2::set(1,Disp7seg); // 割込み関数を呼び出す MsTimer2::start(); // タイマー割り込み開始 } // the loop routine runs over and over again forever: void loop() { int mode = 0; int n; if(HH == alHH && MM == alMM && Sec ==0 && alON == 1) BZON = 1; // Alarm Buzzer ON if(vala3 < 256) // Disp Alarm Time. { n = alHH/10; if(n == 0) DISP3 = 10; else DISP3 = n; DISP2 = alHH%10; DISP1 = alMM/10; DISP0 = alMM%10; } else { switch(mode) { case 0: n = HH/10; if(n == 0) DISP3 = 10; else DISP3 = n; DISP2 = HH%10; DISP1 = MM/10; DISP0 = MM%10; break; case 1: DISP3 = MM/10; DISP2 = MM%10; DISP1 = Sec/10; DISP0 = Sec%10; break; } } vala3=analogRead(3); // Set Time. if(vala3 > 768) { vala2=analogRead(2); if(vala2 < 256) { if(HH == 23) HH=0; else HH++; delay(300); } if(vala2 > 768) { if(HH == 0) HH=23; else HH--; delay(300); } vala1=analogRead(1); if(vala1 < 256) { if(MM == 59) MM=0; else MM++; delay(300); } if(vala1 > 768) { if(MM == 0) MM=59; else MM--; delay(300); } } else if(vala3 < 256) // Set Alarm Time. { BZON = 0; // Buzzer Off vala2=analogRead(2); if(vala2 < 256) { aln = 0; if(alHH == 23) alHH=0; else alHH++; delay(300); } if(vala2 > 768) { aln = 0; if(alHH == 0) alHH=23; else alHH--; delay(300); } vala1=analogRead(1); if(vala1 < 256) { aln = 0; if(alMM == 59) alMM=0; else alMM++; delay(300); } if(vala1 > 768) { aln = 0; if(alMM == 0) alMM=59; else alMM--; delay(300); } if(++aln == 200) { alON ^=1; if(alON == 1) DPON = COMON; else DPON = COMOFF; aln = 0; } delay(10); } else { aln = 0; } }