Chess alarm clock using Arduino, rotary encoder, 7 segment
How to make a chess alarm clock using Arduino, rotary encoder, TM1637 4 digital 7 segment display
Components and supplies
1
Arduino UNO
1
Rotary Encoder with Push-Button
2
4 digital 7 segment display TM1637
2
Tactile Switch, Top Actuated
1
Jumper wires (generic)
1
Buzzer
1
Breadboard (generic)
Tools and machines
1
Hot glue gun (generic)
Apps and platforms
1
Arduino IDE
Project description
Code
Chess alarm clocks Code
c_cpp
1#include <TM1637Display.h> 2 3//encoder 4#define outputA 2 5#define outputB 3 6#define enSw 4 7 8// 4-digital display pins (Digital Pins) 9#define CLKA 5 10#define DIOA 6 11#define CLKB 7 12#define DIOB 8 13TM1637Display displayA(CLKA, DIOA); 14TM1637Display displayB(CLKB, DIOB); 15 16 17//button, led, buzzer 18#define btA 9 19#define btB 10 20#define buzz 11 21 22// 23uint8_t segOff[]={false,false}; 24// 25 int timerSet = 0; 26 int aState; 27 int aLastState; 28 int modeState=0; 29 int modeStateLast=0; 30 31unsigned long minSetA = 5; 32unsigned long secSetA = 0; 33unsigned long minSetB = 5; 34unsigned long secSetB = 0; 35unsigned long timeO = 0; 36unsigned long timeA = 0; 37unsigned long timeB = 0; 38int enSwStatus=1; 39int enSwStatusLast=1; 40int btAStatus=1; 41int btAStatusLast=1; 42int btBStatus=1; 43int btBStatusLast=1; 44 45void setup() { 46 Serial.begin(9600); 47 48 displayA.setBrightness(4); 49 displayA.clear(); 50 displayB.setBrightness(4); 51 displayB.clear(); 52 delay(1000); 53 54 pinMode(btA,INPUT_PULLUP); 55 pinMode(btB,INPUT_PULLUP); 56 pinMode(buzz,OUTPUT); 57 58 pinMode (outputA,INPUT); 59 pinMode (outputB,INPUT); 60 pinMode(enSw,INPUT_PULLUP); 61 aLastState = digitalRead(outputA); 62 digitalWrite(buzz,LOW); 63 64} 65 66void loop() { 67 switch(modeState){ 68 69 case 0: 70 digitalWrite(buzz,LOW); 71 displayA.showNumberDecEx(minSetA*100 + secSetA, 0b01000000, true, 4, 0); 72 displayB.showNumberDecEx(minSetB*100 + secSetB, 0b01000000, true, 4, 0); 73 enSwStatus=digitalRead(enSw); 74 btAStatus=digitalRead(btA); 75 btBStatus=digitalRead(btB); 76 if(enSwStatus==0&&enSwStatusLast==1){ 77 modeState=1; 78 } 79 if(btAStatus==0&&btAStatusLast==1){ 80 modeState=12; 81 timeO= millis(); 82 timeA=0; 83 timeB=0; 84 } 85 if(btBStatus==0&&btBStatusLast==1){ 86 modeState=11; 87 timeO= millis(); 88 timeA=0; 89 timeB=0; 90 } 91 btAStatusLast=btAStatus; 92 btBStatusLast=btBStatus; 93 enSwStatusLast=enSwStatus; 94 break; 95 96 case 1: 97 enSwStatus=digitalRead(enSw); 98 minSetA=setNum(minSetA); 99 displayBlink("A",0); 100 if(enSwStatus==0&&enSwStatusLast==1){ 101 modeState=2; 102 } 103 enSwStatusLast=enSwStatus; 104 break; 105 case 2: 106 enSwStatus=digitalRead(enSw); 107 secSetA=setNum(secSetA); 108 displayBlink("A",2); 109 if(enSwStatus==0&&enSwStatusLast==1){ 110 modeState=3; 111 } 112 enSwStatusLast=enSwStatus; 113 break; 114 case 3: 115 enSwStatus=digitalRead(enSw); 116 minSetB=setNum(minSetB); 117 displayBlink("B",0); 118 if(enSwStatus==0&&enSwStatusLast==1){ 119 modeState=4; 120 } 121 enSwStatusLast=enSwStatus; 122 break; 123 case 4: 124 enSwStatus=digitalRead(enSw); 125 secSetB=setNum(secSetB); 126 displayBlink("B",2); 127 if(enSwStatus==0&&enSwStatusLast==1){ 128 modeState=0; 129 } 130 enSwStatusLast=enSwStatus; 131 break; 132 133 case 11: 134 timeA = millis()-timeO-timeB; 135 if(timeOut()==1){ 136 modeState=13; 137 } 138 displayA.showNumberDecEx(timeDisplay(timeA,"A"), 0b01000000, true, 4, 0); 139 displayB.showNumberDecEx(timeDisplay(timeB,"B"), 0b01000000, true, 4, 0); 140 btAStatus=digitalRead(btA); 141 if(btAStatus==0&&btAStatusLast==1){ 142 modeState=12; 143 } 144 btAStatusLast=btAStatus; 145 enSwStatus=digitalRead(enSw); 146 if(enSwStatus==0&&enSwStatusLast==1){ 147 modeState=0; 148 } 149 enSwStatusLast=enSwStatus; 150 break; 151 152 case 12: 153 timeB = millis()-timeO-timeA; 154 if(timeOut()==1){ 155 modeState=13; 156 } 157 displayA.showNumberDecEx(timeDisplay(timeA,"A"), 0b01000000, true, 4, 0); 158 displayB.showNumberDecEx(timeDisplay(timeB,"B"), 0b01000000, true, 4, 0); 159 btBStatus=digitalRead(btB); 160 if(btBStatus==0&&btBStatusLast==1){ 161 modeState=11; 162 } 163 btBStatusLast=btBStatus; 164 enSwStatus=digitalRead(enSw); 165 if(enSwStatus==0&&enSwStatusLast==1){ 166 modeState=0; 167 } 168 enSwStatusLast=enSwStatus; 169 break; 170 case 13: 171 analogWrite(buzz,255); 172 delay(100); 173 analogWrite(buzz,0); 174 delay(100); 175 enSwStatus=digitalRead(enSw); 176 if(enSwStatus==0&&enSwStatusLast==1){ 177 modeState=0; 178 } 179 enSwStatusLast=enSwStatus; 180 break; 181 182 default: 183 184 break; 185 } 186} 187 188int setNum(int num) { 189 aState = digitalRead(outputA); 190 if (aState != aLastState){ 191 if (digitalRead(outputB) != aState) { 192 num ++; 193 } else { 194 if(num>0){ 195 num --; 196 } 197 } 198 } 199 aLastState = aState; 200 return num; 201 } 202 void displayBlink(String player, int pos){ 203 if(player=="A"){ 204 if ((millis()*5/1000)%2==0){ 205 displayA.setSegments(segOff, 2, pos); 206 } else displayA.showNumberDecEx(minSetA*100 + secSetA, 0b01000000, true, 4, 0); 207 } else if (player=="B"){ 208 if ((millis()*5/1000)%2==0){ 209 displayB.setSegments(segOff, 2, pos); 210 } else displayB.showNumberDecEx(minSetB*100 + secSetB, 0b01000000, true, 4, 0); 211 } 212 } 213 214 long timeDisplay(long timeRun, String player){ 215 long min_t=0; 216 long sec_t=0; 217 if (player=="A"){ 218 min_t= (minSetA*60+secSetA-timeRun/1000)/60; 219 sec_t = (minSetA*60+secSetA-timeRun/1000)%60; 220 } else if (player=="B"){ 221 min_t= (minSetB*60+secSetB-timeRun/1000)/60; 222 sec_t= (minSetB*60+secSetB-timeRun/1000)%60; 223 } 224 225 return min_t*100 + sec_t; 226 } 227 228 int timeOut(){ 229 int isTimeOut=0; 230 if (timeA>(minSetA*60+secSetA)*1000){ 231 isTimeOut=1; 232 } else if (timeB>(minSetB*60+secSetB)*1000){ 233 isTimeOut=1; 234 } 235 return isTimeOut; 236 } 237
Chess alarm clocks Code
c_cpp
1#include <TM1637Display.h> 2 3//encoder 4#define outputA 2 5#define 6 outputB 3 7#define enSw 4 8 9// 4-digital display pins (Digital Pins) 10#define 11 CLKA 5 12#define DIOA 6 13#define CLKB 7 14#define DIOB 8 15TM1637Display displayA(CLKA, 16 DIOA); 17TM1637Display displayB(CLKB, DIOB); 18 19 20//button, led, buzzer 21#define 22 btA 9 23#define btB 10 24#define buzz 11 25 26// 27uint8_t segOff[]={false,false}; 28// 29 30 int timerSet = 0; 31 int aState; 32 int aLastState; 33 int modeState=0; 34 35 int modeStateLast=0; 36 37unsigned long minSetA = 5; 38unsigned long secSetA 39 = 0; 40unsigned long minSetB = 5; 41unsigned long secSetB = 0; 42unsigned long 43 timeO = 0; 44unsigned long timeA = 0; 45unsigned long timeB = 0; 46int enSwStatus=1; 47int 48 enSwStatusLast=1; 49int btAStatus=1; 50int btAStatusLast=1; 51int btBStatus=1; 52int 53 btBStatusLast=1; 54 55void setup() { 56 Serial.begin(9600); 57 58 displayA.setBrightness(4); 59 60 displayA.clear(); 61 displayB.setBrightness(4); 62 displayB.clear(); 63 delay(1000); 64 65 66 pinMode(btA,INPUT_PULLUP); 67 pinMode(btB,INPUT_PULLUP); 68 pinMode(buzz,OUTPUT); 69 70 71 pinMode (outputA,INPUT); 72 pinMode (outputB,INPUT); 73 pinMode(enSw,INPUT_PULLUP); 74 75 aLastState = digitalRead(outputA); 76 digitalWrite(buzz,LOW); 77 78} 79 80void 81 loop() { 82 switch(modeState){ 83 84 case 0: 85 digitalWrite(buzz,LOW); 86 87 displayA.showNumberDecEx(minSetA*100 + secSetA, 0b01000000, true, 4, 0); 88 89 displayB.showNumberDecEx(minSetB*100 + secSetB, 0b01000000, true, 4, 0); 90 91 enSwStatus=digitalRead(enSw); 92 btAStatus=digitalRead(btA); 93 btBStatus=digitalRead(btB); 94 95 if(enSwStatus==0&&enSwStatusLast==1){ 96 modeState=1; 97 } 98 99 if(btAStatus==0&&btAStatusLast==1){ 100 modeState=12; 101 timeO= 102 millis(); 103 timeA=0; 104 timeB=0; 105 } 106 if(btBStatus==0&&btBStatusLast==1){ 107 108 modeState=11; 109 timeO= millis(); 110 timeA=0; 111 timeB=0; 112 113 } 114 btAStatusLast=btAStatus; 115 btBStatusLast=btBStatus; 116 117 enSwStatusLast=enSwStatus; 118 break; 119 120 case 1: 121 enSwStatus=digitalRead(enSw); 122 123 minSetA=setNum(minSetA); 124 displayBlink("A",0); 125 if(enSwStatus==0&&enSwStatusLast==1){ 126 127 modeState=2; 128 } 129 enSwStatusLast=enSwStatus; 130 break; 131 132 case 2: 133 enSwStatus=digitalRead(enSw); 134 secSetA=setNum(secSetA); 135 136 displayBlink("A",2); 137 if(enSwStatus==0&&enSwStatusLast==1){ 138 139 modeState=3; 140 } 141 enSwStatusLast=enSwStatus; 142 break; 143 144 case 3: 145 enSwStatus=digitalRead(enSw); 146 minSetB=setNum(minSetB); 147 148 displayBlink("B",0); 149 if(enSwStatus==0&&enSwStatusLast==1){ 150 151 modeState=4; 152 } 153 enSwStatusLast=enSwStatus; 154 break; 155 156 case 4: 157 enSwStatus=digitalRead(enSw); 158 secSetB=setNum(secSetB); 159 160 displayBlink("B",2); 161 if(enSwStatus==0&&enSwStatusLast==1){ 162 163 modeState=0; 164 } 165 enSwStatusLast=enSwStatus; 166 break; 167 168 169 case 11: 170 timeA = millis()-timeO-timeB; 171 if(timeOut()==1){ 172 173 modeState=13; 174 } 175 displayA.showNumberDecEx(timeDisplay(timeA,"A"), 176 0b01000000, true, 4, 0); 177 displayB.showNumberDecEx(timeDisplay(timeB,"B"), 178 0b01000000, true, 4, 0); 179 btAStatus=digitalRead(btA); 180 if(btAStatus==0&&btAStatusLast==1){ 181 182 modeState=12; 183 } 184 btAStatusLast=btAStatus; 185 enSwStatus=digitalRead(enSw); 186 187 if(enSwStatus==0&&enSwStatusLast==1){ 188 modeState=0; 189 } 190 191 enSwStatusLast=enSwStatus; 192 break; 193 194 case 12: 195 timeB 196 = millis()-timeO-timeA; 197 if(timeOut()==1){ 198 modeState=13; 199 200 } 201 displayA.showNumberDecEx(timeDisplay(timeA,"A"), 0b01000000, 202 true, 4, 0); 203 displayB.showNumberDecEx(timeDisplay(timeB,"B"), 0b01000000, 204 true, 4, 0); 205 btBStatus=digitalRead(btB); 206 if(btBStatus==0&&btBStatusLast==1){ 207 208 modeState=11; 209 } 210 btBStatusLast=btBStatus; 211 enSwStatus=digitalRead(enSw); 212 213 if(enSwStatus==0&&enSwStatusLast==1){ 214 modeState=0; 215 } 216 217 enSwStatusLast=enSwStatus; 218 break; 219 case 13: 220 analogWrite(buzz,255); 221 222 delay(100); 223 analogWrite(buzz,0); 224 delay(100); 225 enSwStatus=digitalRead(enSw); 226 227 if(enSwStatus==0&&enSwStatusLast==1){ 228 modeState=0; 229 } 230 231 enSwStatusLast=enSwStatus; 232 break; 233 234 default: 235 236 237 break; 238 } 239} 240 241int setNum(int num) { 242 aState = digitalRead(outputA); 243 244 if (aState != aLastState){ 245 if (digitalRead(outputB) != aState) { 246 247 num ++; 248 } else { 249 if(num>0){ 250 num --; 251 252 } 253 } 254 } 255 aLastState = aState; 256 return num; 257 } 258 259 void displayBlink(String player, int pos){ 260 if(player=="A"){ 261 if ((millis()*5/1000)%2==0){ 262 263 displayA.setSegments(segOff, 2, pos); 264 } else displayA.showNumberDecEx(minSetA*100 265 + secSetA, 0b01000000, true, 4, 0); 266 } else if (player=="B"){ 267 if 268 ((millis()*5/1000)%2==0){ 269 displayB.setSegments(segOff, 2, pos); 270 } 271 else displayB.showNumberDecEx(minSetB*100 + secSetB, 0b01000000, true, 4, 0); 272 273 } 274 } 275 276 long timeDisplay(long timeRun, String player){ 277 long min_t=0; 278 279 long sec_t=0; 280 if (player=="A"){ 281 min_t= (minSetA*60+secSetA-timeRun/1000)/60; 282 283 sec_t = (minSetA*60+secSetA-timeRun/1000)%60; 284 } else if (player=="B"){ 285 286 min_t= (minSetB*60+secSetB-timeRun/1000)/60; 287 sec_t= (minSetB*60+secSetB-timeRun/1000)%60; 288 289 } 290 291 return min_t*100 + sec_t; 292 } 293 294 int timeOut(){ 295 int 296 isTimeOut=0; 297 if (timeA>(minSetA*60+secSetA)*1000){ 298 isTimeOut=1; 299 300 } else if (timeB>(minSetB*60+secSetB)*1000){ 301 isTimeOut=1; 302 } 303 return 304 isTimeOut; 305 } 306
Downloadable files
Chess alarm clocks Schematics
Chess alarm clocks Schematics
Comments
Only logged in users can leave comments