This program is a clock that uses a kitchen Timer boad.
Dependencies: SevenSegLed Sound_pwmToDig SwAnalog mbed
Fork of kitchenTimer_Clock by
main.cpp
00001 //=========================================================================== 00002 // digital clock 00003 // 00004 // <schematic> 00005 // 1.seven segment numeric LED Display : OSL40562-IRA 00006 // http://akizukidenshi.com/download/OSL40562-IRA.pdf 00007 // 00008 // OSL40562-IRA Resister LPC1114FN28 00009 // Pin No Function [ohm] PinNo 00010 // --------------------------------------------------------------------------- 00011 // 1 segment E 680 dp28 00012 // 2 segment D 680 dp27 00013 // 3 segment Dp 680 dp26 00014 // 4 segment C 680 dp25 00015 // 5 segment G 680 dp18 00016 // 6 common 4 - dp17 00017 // 7 segment B 680 dp11 00018 // 8 common 3 - dp13 00019 // 9 common 2 - dp14 00020 // 10 segment F 680 dp5 00021 // 11 segment A 680 dp6 00022 // 12 common 1 - dp4 00023 // 00024 // 2.sound speaker 00025 // / 00026 // mbed -------------- --/ 00027 // dp1(pwmOut) -----| R:100[ohm] |-----| | speaker(8[ohm]) 00028 // -------------- | | 00029 // | | 00030 // dp2(pwmOut) ------------------------| | 00031 // (digitalOut) --\ 00032 // \ 00033 // 3.sw 00034 // -.- Vcc(+3.3[V]) 00035 // | |--------------------> dp9(ADinput) 00036 // | --------- --------- --------- | --------- 00037 // .---| Rsw2 |---.---| Rsw1 |---.---| Rsw0 |---.---| Rout |----| 00038 // | --------- | --------- | --------- | --------- | 00039 // | ---- | ----- | ----- | | 00040 // |-----o o------.-----o o------.-----o o------| ----- 00041 // LeftSW DowmSW UpSW GND(0[V]) 00042 // 00043 // Rsw2 : 8.2[kohm], Rsw1 = 3.9[kohm], Rsw0 = 2.0[kohm], Rout = 1.0[kohm] (R no seido ha +-1[%]) 00044 // 00045 // -.- Vcc(+3.3[V]) 00046 // | |--------------------> dp10(ADinput) 00047 // | --------- --------- --------- | --------- 00048 // .---| Rsw2 |---.---| Rsw1 |---.---| Rsw0 |---.---| Rout |----| 00049 // | --------- | --------- | --------- | --------- | 00050 // | ---- | ----- | ----- | | 00051 // |-----o o------.-----o o------.-----o o------| ----- 00052 // RightSW BSW ASW GND(0[V]) 00053 // 00054 // Rsw2 : 8.2[kohm], Rsw1 = 3.9[kohm], Rsw0 = 2.0[kohm], Rout = 1.0[kohm] (R no seido ha +-1[%]) 00055 // 00056 // V1.0 131130 00057 // 00058 // 00059 //=========================================================================== 00060 #include "mbed.h" 00061 00062 //#define DBG 00063 00064 #ifdef DBG 00065 Serial pc(dp16, dp15); 00066 #endif //DBG 00067 00068 00069 #include "SevenSegLed.h" 00070 #include "Sound.h" 00071 #include "SwAnalog.h" 00072 00073 00074 00075 00076 Ticker timeout100ms; // 100ms interrupt 00077 00078 Sound sound(dp1, dp2); // pwm, pwm(digitalOut) 00079 00080 00081 SwAnalog sw(dp9, dp10); 00082 enum{ 00083 upSw, 00084 downSw, 00085 leftSw, 00086 aSw, 00087 bSw, 00088 rightSw 00089 }; 00090 SevenSegLed sevenSegLed(0, 1, dp6, dp11, dp25, dp27, dp28, dp5, dp18, dp26, dp4, dp14, dp13, dp17); // OSL40562-IRA 00091 00092 00093 00094 00095 // 7segment LED initial display data. 00096 uint8_t D_7seg[4] = {0, 0, 0, 0}; 00097 uint8_t D_dot[4] = {0, 1, 0, 0}; 00098 00099 uint8_t C_flicker; // timer setti ji no henko keta flicker kyoka (100[ms]/count) 0:flicker request ohter:kinsi 00100 #define Z_flicker (5 * 10) 00101 00102 // control mode number. 00103 enum timer_t{ 00104 stop, 00105 setMin, 00106 setHore, 00107 count, 00108 }; 00109 timer_t M_timer = stop; 00110 00111 uint8_t F_flip100ms; // 100ms keika goto ni 0 or 1 00112 uint8_t F_flip500ms; // 500ms keika goto ni 0 or 1 00113 00114 time_t seconds; 00115 typedef struct{ 00116 uint8_t tm_hour; 00117 uint8_t tm_min; 00118 uint8_t tm_sec; 00119 } sstm; 00120 00121 sstm rtc_time; // LPC11U24 yo rtc 00122 sstm A_time; // genzai jikoku 00123 #define Z_japanOffset (9 * 60 * 60) // japan time offset (utc + 9h) 00124 00125 //time_t seconds; 00126 //struct tm *A_time; // genzai jikoku 00127 00128 //=================================== 00129 // beep (sw sosa ji no oto) 00130 //=================================== 00131 // "beep" merody data 00132 const Sound::sound_t BEEP[] = { 00133 {1,0x95,200,100}, 00134 {1,0xFF,10,0} // end 00135 }; 00136 00137 void beep(void){ 00138 sound.sound_enso((Sound::sound_t*)BEEP); 00139 sound.sound_enso(true); 00140 } 00141 00142 00143 //********************************************************** 00144 // chime 00145 //********************************************************** 00146 uint8_t C_chime; // chime kaisuu 1 - 255 (1/1[kai]/count) 00147 00148 //===================================================== 00149 // chime request 00150 // no : chime no kaisuu 1 - 255 ( 1/1 [kai]/count) 00151 //===================================================== 00152 void chimeSet(uint8_t no){ 00153 C_chime = no; 00154 } 00155 00156 //==================================== 00157 // chime check and output 00158 // 10 - 100 ms syuuki de call suru 00159 //==================================== 00160 void chimeCheck(void){ 00161 if(C_chime > 0){ 00162 if((sound.sound_sound() == false) && (sound.sound_enso() == false)) { 00163 Sound::sound_t oto = {1,0xF4,2500,1500}; 00164 sound.sound_sound(oto); 00165 C_chime--; 00166 } 00167 } 00168 } 00169 00170 //*************************************************** 00171 // melody data tabel 00172 //*************************************************** 00173 00174 //================================ 00175 // "westminster chime" merody data 00176 //================================ 00177 const Sound::sound_t WESTMINSTER[] = { 00178 // onkai,hatuon jikan[ms] 00179 {1,0xA4,1200,1000}, 00180 {1,0xF4,1200,1000}, 00181 {1,0x94,1200,1000}, 00182 {1,0xC4,2400,1000}, 00183 00184 {1,0xC4,1200,1000}, 00185 {1,0x94,1200,1000}, 00186 {1,0xA4,1200,1000}, 00187 {1,0xF4,2400,1000}, 00188 00189 {1,0xA4,1200,1000}, 00190 {1,0xF4,1200,1000}, 00191 {1,0x94,1200,1000}, 00192 {1,0xC4,2400,1000}, 00193 00194 {1,0xC4,1200,1000}, 00195 {1,0x94,1200,1000}, 00196 {1,0xA4,1200,1000}, 00197 {1,0xF4,2400,1000}, 00198 00199 {1,0xFF,1000,0}, // end 00200 }; 00201 00202 //========================== 00203 // "ramen chime" merody data 00204 //========================== 00205 const Sound::sound_t RAMEN[] = { 00206 // onkai,hatuon jikan[ms] 00207 {1,0xC5,300,500}, 00208 {1,0xD5,300,500}, 00209 {1,0xE5,1200,500}, 00210 {1,0xD5,600,500}, 00211 {1,0xC5,1200,500}, 00212 00213 {1,0xC5,300,500}, 00214 {1,0xD5,300,500}, 00215 {1,0xE5,300,500}, 00216 {1,0xD5,300,500}, 00217 {1,0xC5,300,500}, 00218 {1,0xD5,1800,500}, 00219 00220 00221 {1,0xFF,1000,500}, // end 00222 }; 00223 00224 //============================= 00225 // "demekin no uta" merody data 00226 //============================= 00227 const Sound::sound_t DEMEKIN[] = { 00228 // onkai,hatuon jikan[ms] 00229 {1,0xC5,600,500}, // de 00230 {1,0xE5,600,500}, // me 00231 {1,0x95,600,500}, // kin 00232 {1,0x00,600,500}, 00233 00234 {1,0xC5,600,500}, // de 00235 {1,0xE5,600,500}, // me 00236 {1,0x95,600,500}, // kin 00237 {1,0x00,600,500}, 00238 00239 {1,0xC5,600,500}, // de 00240 {1,0xE5,600,500}, // me 00241 {1,0x95,600,500}, // kin 00242 {1,0x95,600,500}, // no 00243 {1,0x95,150,500}, // shi 00244 {1,0x00,900,500}, 00245 {1,0xE5,750,500}, // po 00246 {1,0x00,450,500}, 00247 00248 {1,0xC5,600,500}, // de 00249 {1,0xE5,600,500}, // me 00250 {1,0x95,600,500}, // kin 00251 {1,0x00,600,500}, 00252 00253 {1,0xC5,600,500}, // de 00254 {1,0xE5,600,500}, // me 00255 {1,0x95,600,500}, // kin 00256 {1,0x00,600,500}, 00257 00258 {1,0x95,600,500}, // ju 00259 {1,0xE5,600,500}, // go 00260 {1,0xD5,600,500}, // n 00261 {1,0xC5,600,500}, // no 00262 {1,0xE5,150,500}, // shi 00263 {1,0x00,900,500}, 00264 {1,0xC5,750,500}, // po 00265 {1,0x00,1350,500}, 00266 00267 {1,0xFF,1000,0}, // end (1s keika go sai enso) 00268 // {1,0xFF,0}, // end (1kaino enso de teisi suru baai) 00269 }; 00270 00271 //============================= 00272 // rtc count 00273 // 1sec syuki no syori 00274 //============================= 00275 void rtc_count(void){ 00276 seconds++; 00277 if(seconds >= (23 *3600 + 59 * 60 + 60)){ 00278 seconds = 0; 00279 } 00280 } 00281 00282 //============================= 00283 // localtime 00284 //============================= 00285 sstm ss_localtime( time_t * t ){ 00286 sstm ans; 00287 ans.tm_hour = *t / 3600; 00288 ans.tm_min = (*t % 3600) / 60; 00289 ans.tm_sec = (*t % 3600) % 60; 00290 return (ans); 00291 } 00292 00293 //============================= 00294 // mktime 00295 //============================= 00296 time_t ss_mktime( sstm t ){ 00297 time_t ans; 00298 ans = (t.tm_hour * 3600) + (t.tm_min * 60) + t.tm_sec; 00299 return (ans); 00300 } 00301 00302 //============================= 00303 // timer SW seni 00304 //============================= 00305 void timerSeni(void){ 00306 static uint8_t B_timesec = 0; 00307 00308 // aSw(settei SW) 00309 if(sw.checkEdgeOn(aSw) == 1){ 00310 if((M_timer != setMin) && (M_timer != setHore)){ 00311 beep(); 00312 M_timer = setMin; 00313 00314 // genzai jikoku kakuno 00315 //seconds = time(NULL); 00316 A_time = ss_localtime(&seconds); 00317 } 00318 else if((M_timer == setMin) || (M_timer == setHore)){ 00319 beep(); 00320 M_timer = count; 00321 00322 A_time.tm_sec = 0; 00323 seconds = ss_mktime(A_time); 00324 // set_time(seconds); 00325 } 00326 else{ 00327 // noting 00328 } 00329 } 00330 00331 // bSw(torikesi SW) 00332 if((sw.checkEdgeOn(bSw) == 1) && (M_timer != count) 00333 ){ 00334 beep(); 00335 M_timer = count; 00336 } 00337 00338 switch(M_timer){ 00339 case stop: 00340 // other aSw,bSw then setMin 00341 if((sw.checkEdgeOn(upSw) == 1) 00342 ||(sw.checkEdgeOn(downSw) == 1) 00343 ||(sw.checkEdgeOn(leftSw) == 1) 00344 ||(sw.checkEdgeOn(rightSw) == 1) 00345 ){ 00346 beep(); 00347 M_timer = setMin; 00348 C_flicker = 0; 00349 00350 // genzai jikoku kakuno 00351 //seconds = time(NULL); 00352 A_time = ss_localtime(&seconds); 00353 } 00354 break; 00355 case setMin: 00356 if(sw.checkEdgeOn(leftSw) == 1){ 00357 beep(); 00358 M_timer = setHore; 00359 C_flicker = 0; 00360 } 00361 break; 00362 case setHore: 00363 if(sw.checkEdgeOn(rightSw) == 1){ 00364 beep(); 00365 M_timer = setMin; 00366 C_flicker = 0; 00367 } 00368 break; 00369 case count: 00370 //seconds = time(NULL); 00371 A_time = ss_localtime(&seconds); 00372 00373 // 59 kara 0 byo ni nattara melody wo narasu 00374 if((B_timesec == 59) && (A_time.tm_sec == 0)){ 00375 // jikoku chime no kaisuu set 00376 uint8_t C_chime = A_time.tm_hour; 00377 if(C_chime == 0){ 00378 C_chime = 12; 00379 } 00380 else if(C_chime > 12){ 00381 C_chime -= 12; 00382 } 00383 00384 // jikoku no melody and chime 00385 if(A_time.tm_min == 0){ 00386 if(A_time.tm_hour == 12){ 00387 sound.sound_enso((Sound::sound_t*)RAMEN); 00388 sound.sound_enso(true); 00389 chimeSet(C_chime); 00390 } 00391 else { 00392 sound.sound_enso((Sound::sound_t*)WESTMINSTER); 00393 sound.sound_enso(true); 00394 chimeSet(C_chime); 00395 } 00396 } 00397 00398 // 30min no chime 00399 if(A_time.tm_min == 30){ 00400 chimeSet(2); 00401 } 00402 00403 // 15min or 45min no chime 00404 if((A_time.tm_min == 15) || (A_time.tm_min == 45)){ 00405 chimeSet(1); 00406 } 00407 } 00408 B_timesec = A_time.tm_sec; // jikai hikaku yo time data kioku 00409 break; 00410 00411 default: 00412 // nothing 00413 break; 00414 } 00415 00416 } 00417 //============================ 00418 // time set 00419 //============================ 00420 void timerSet(void){ 00421 00422 switch(M_timer){ 00423 case stop: 00424 break; 00425 case setMin: 00426 if(sw.checkEdgeOn(upSw) == 1){ 00427 beep(); 00428 if(A_time.tm_min < 59){ 00429 A_time.tm_min++; 00430 } 00431 else{ 00432 A_time.tm_min = 0; 00433 } 00434 C_flicker = Z_flicker; 00435 } 00436 00437 if(sw.checkEdgeOn(downSw) == 1){ 00438 beep(); 00439 if(A_time.tm_min > 0){ 00440 A_time.tm_min--; 00441 } 00442 else{ 00443 A_time.tm_min = 59; 00444 } 00445 C_flicker = Z_flicker; 00446 } 00447 break; 00448 case setHore: 00449 if(sw.checkEdgeOn(upSw) == 1){ 00450 beep(); 00451 if(A_time.tm_hour < 23){ 00452 A_time.tm_hour++; 00453 } 00454 else{ 00455 A_time.tm_hour = 0; 00456 } 00457 C_flicker = Z_flicker; 00458 } 00459 00460 if(sw.checkEdgeOn(downSw) == 1){ 00461 beep(); 00462 if(A_time.tm_hour > 0){ 00463 A_time.tm_hour--; 00464 } 00465 else{ 00466 A_time.tm_hour = 23; 00467 } 00468 C_flicker = Z_flicker; 00469 } 00470 break; 00471 case count: 00472 // nothing 00473 break; 00474 default: 00475 // nothing 00476 break; 00477 } 00478 00479 } 00480 00481 //========================== 00482 // seven segment display 00483 //========================== 00484 void sevenSegDisplay(void){ 00485 // int16_t work; 00486 00487 switch(M_timer){ 00488 case stop: 00489 00490 D_7seg[0] = 0x0f; 00491 D_7seg[1] = 0x0f; 00492 D_7seg[2] = 0x0f; 00493 D_7seg[3] = 0x0f; 00494 00495 00496 D_dot[0] = 0; 00497 D_dot[1] = 0; 00498 D_dot[2] = 0; 00499 D_dot[3] = 0; 00500 00501 break; 00502 case setMin: // setHore to onaji 00503 case setHore: 00504 sevenSegLed.smoothSet(1); // hyoji hard 00505 D_7seg[0] = A_time.tm_hour / 10; 00506 D_7seg[1] = A_time.tm_hour % 10; 00507 D_7seg[2] = A_time.tm_min / 10; 00508 D_7seg[3] = A_time.tm_min % 10; 00509 00510 // settei basyo no tenmetu 00511 if((C_flicker == 0) && (F_flip500ms == 0)){ 00512 if(M_timer == setMin){ 00513 D_7seg[2] = 0x10; 00514 D_7seg[3] = 0x10; 00515 } 00516 else{ 00517 D_7seg[0] = 0x10; 00518 D_7seg[1] = 0x10; 00519 } 00520 } 00521 00522 D_dot[0] = 0; 00523 D_dot[1] = 1; 00524 D_dot[2] = 0; 00525 D_dot[3] = 1; 00526 00527 break; 00528 case count: 00529 sevenSegLed.smoothSet(0); // hyoji smooth 00530 // seconds = time(NULL); 00531 A_time = ss_localtime(&seconds); 00532 00533 D_7seg[0] = A_time.tm_hour / 10; 00534 D_7seg[1] = A_time.tm_hour % 10; 00535 D_7seg[2] = A_time.tm_min / 10; 00536 D_7seg[3] = A_time.tm_min % 10; 00537 00538 D_dot[0] = 0; 00539 D_dot[1] = 1; 00540 D_dot[2] = 0; 00541 00542 // byo no dot no tenmetu 00543 if((A_time.tm_sec % 2) == 0){ 00544 D_dot[3] = 0; 00545 } 00546 else{ 00547 D_dot[3] = 1; 00548 } 00549 break; 00550 00551 default: 00552 break; 00553 } 00554 sevenSegLed.SevenSegLed_main(D_7seg, D_dot); // 7segment hyoji 00555 } 00556 00557 //================================ 00558 // 100ms interrupt 00559 //================================ 00560 void interrupt100ms(void){ 00561 static uint8_t C_100ms = 0; 00562 00563 00564 C_100ms++; 00565 if(C_100ms > 9){C_100ms = 0;} 00566 00567 // flip flag 00568 F_flip100ms = !F_flip100ms; 00569 00570 if(C_100ms < 5){F_flip500ms = 1;} 00571 else{F_flip500ms = 0;} 00572 00573 // settei keta flicker 00574 if(C_flicker > 0){C_flicker--;} 00575 00576 // timer counter decrement 00577 if(C_100ms == 0){ 00578 rtc_count(); 00579 } 00580 } 00581 00582 //================================ 00583 // main 00584 //================================ 00585 int main() { 00586 timeout100ms.attach(&interrupt100ms, 0.1); // 10ms interrupt 00587 00588 // kido ji no melody 00589 sound.sound_enso((Sound::sound_t*)DEMEKIN); 00590 sound.sound_enso(true); 00591 00592 while(1) { 00593 // sw level and edge data refresh 00594 sw.refreshEdgeData(); 00595 00596 timerSeni(); 00597 timerSet(); 00598 sevenSegDisplay(); 00599 chimeCheck(); 00600 } 00601 }
Generated on Fri Jul 15 2022 02:00:14 by 1.7.2