/* Dodeka_LED_Arduino_Clock_v0 */ #include // タイマー割り込みを利用する為に必要なヘッダファイル int i; long timeNow; //現在時刻 long timeStart = millis(); //タイマー開始時刻 long timeDisp; //表示時刻 int vala1,vala2,vala3; volatile int HH = 19; volatile int MM = 5; volatile int Sec = 0; volatile int MS = 0; volatile int DPON = 0; //1:Off , 0:ON 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 = 4; const int HH01 = 3; const int MM10 = 2; const int MM01 = 1; const int SEGA = 5; const int SEGB = 6; const int SEGC = 7; const int SEGD = 8; const int SEGE = 10; const int SEGF = 11; const int SEGG = 12; const int SEGP = 9; const int BZ = 13; // Pin 13 has an LED connected on most Arduino boards. // give it a name: int led = 2; //LEDレイアウトを定義 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} }; //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; static boolean dispnum = 0; if(MS >= 500) MS500=1; else MS500=0; 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, LOW); digitalWrite(HH10, LOW); NumPrint(DISP3); digitalWrite(SEGP,0); digitalWrite(HH10, HIGH); num++; break; case 1: digitalWrite(HH10, LOW); digitalWrite(HH01, LOW); NumPrint(DISP2); digitalWrite(SEGP,MS500); digitalWrite(HH01, HIGH); num++; break; case 2: digitalWrite(HH01, LOW); digitalWrite(MM10, LOW); NumPrint(DISP1); digitalWrite(SEGP,MS500); digitalWrite(MM10, HIGH); num++; break; case 3: digitalWrite(MM10, LOW); digitalWrite(MM01, LOW); NumPrint(DISP0); digitalWrite(SEGP,alON); digitalWrite(MM01, HIGH); num=0; break; } } // 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(BZ , OUTPUT); digitalWrite(BZ, LOW); 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) 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 == 8) { alON ^=1; aln = 0; } delay(300); } else { aln = 0; } if(BZON == 1 && MS500 == 1 && alON == 1) { digitalWrite(BZ, HIGH); } else { digitalWrite(BZ, LOW); } }