iModela(iM-01) de sakusei sita PCB no kitchenTimer wo clock ni henko sita monodesu.
Dependencies: SevenSegLed SwDigital mbed Sound
main.cpp
00001 //#define debug 00002 //=========================================================================== 00003 // mbed seven segment LED PCB board example program 00004 // 00005 // 24h display clock 00006 // 00007 // V1.0 120402 00008 // V2.0 120422 : melody and chime no henko. hyoji no kaizen 00009 // 00010 // <schematic> 00011 // 1.seven segment numeric LED Display : OSL40562-LR 00012 // http://akizukidenshi.com/download/OSL40562-LR.pdf 00013 // 00014 // OSL40562-LR Resister mbed 00015 // Pin No Function [ohm] Function 00016 // --------------------------------------------------------------------------- 00017 // 1 segment E 200 P13 00018 // 2 segment D 200 P12 00019 // 3 segment Dp 200 P11 00020 // 4 segment C 200 p10 00021 // 5 segment G 200 P9 00022 // 6 common 4 - P8 00023 // 7 segment B 200 P5 00024 // 8 common 3 - P6 00025 // 9 common 2 - p7 00026 // 10 segment F 200 p18 00027 // 11 segment A 200 P19 00028 // 12 common 1 - p20 00029 // 00030 // 2.sound speaker 00031 // / 00032 // mbed -------------- --/ 00033 // p21(pwmOut) -----| R:0[ohm] |-----| | speaker(8[ohm]) 00034 // -------------- | | 00035 // | | 00036 // p22(DigitalOut) ------------------------| | 00037 // --\ 00038 // \ 00039 // 3.sw 00040 // sw6(left sw) 00041 // ---- 00042 // p25 --------o o----------- GND 00043 // 00044 // sw5(up sw) 00045 // ---- 00046 // p26 --------o o----------- GND 00047 // 00048 // sw4(down sw) 00049 // ---- 00050 // p27 --------o o----------- GND 00051 // 00052 // sw3(right sw) 00053 // ---- 00054 // p28 --------o o----------- GND 00055 // 00056 // sw2(b sw) 00057 // ---- 00058 // p29 --------o o----------- GND 00059 // 00060 // sw1(a sw) 00061 // ---- 00062 // p30 --------o o----------- GND 00063 // 00064 // V1.0 2011/12/11 00065 // 00066 // 00067 //=========================================================================== 00068 #include "mbed.h" 00069 #include "SevenSegLed.h" 00070 #include "Sound.h" 00071 #include "SwDigital.h" 00072 00073 Ticker timeout100ms; // 100ms interrupt 00074 00075 Sound sound(p21, p22); 00076 SwDigital sw(p25, p26, p27, p28, p29, p30); // left, up, down, right, b, a 00077 enum{ 00078 leftSw, 00079 upSw, 00080 downSw, 00081 rightSw, 00082 bSw, 00083 aSw 00084 }; 00085 00086 SevenSegLed sevenSegLed(1, 0, p19, p5, p10, p12, p13, p18, p9, p11, p20, p7, p6, p8); // OSL40562-LR(seikiban) 00087 00088 uint8_t D_7seg[4] = {0, 0, 0, 0}; 00089 uint8_t D_dot[4] = {0, 1, 0, 0}; 00090 00091 uint8_t C_flicker; // timer setti ji no henko keta flicker kyoka (100[ms]/count) 0:flicker request ohter:kinsi 00092 #define Z_flicker (5 * 10) 00093 00094 int16_t D_timerSec = 3 * 60; // timer no settai chi (1/1 [s]/count) 00095 int16_t C_timerSec; // timer keiji jikan (1/1[s]/count) 00096 00097 enum timer_t{ 00098 stop, 00099 setMin, 00100 setHore, 00101 count, 00102 }; 00103 timer_t M_timer = stop; 00104 00105 uint8_t F_flip100ms; // 100ms keika goto ni 0 or 1 00106 uint8_t F_flip500ms; // 500ms keika goto ni 0 or 1 00107 00108 time_t seconds; 00109 struct tm *A_time; // genzai jikoku 00110 00111 //=================================== 00112 // beep (sw sosa ji no oto) 00113 //=================================== 00114 void beep(void){ 00115 // tone1 00116 Sound::sound_t oto = {1,0x95,200,100}; 00117 sound.sound_sound(oto); 00118 } 00119 00120 //********************************************************** 00121 // chime 00122 //********************************************************** 00123 uint8_t C_chime; // chime kaisuu 1 - 255 (1/1[kai]/count) 00124 00125 //===================================================== 00126 // chime request 00127 // no : chime no kaisuu 1 - 255 ( 1/1 [kai]/count) 00128 //===================================================== 00129 void chimeSet(uint8_t no){ 00130 C_chime = no; 00131 } 00132 00133 //==================================== 00134 // chime check and output 00135 // 10 - 100 ms syuuki de call suru 00136 //==================================== 00137 void chimeCheck(void){ 00138 if(C_chime > 0){ 00139 if((sound.sound_sound() == false) && (sound.sound_enso() == false)) { 00140 Sound::sound_t oto = {1,0xF4,2500,1500}; 00141 sound.sound_sound(oto); 00142 C_chime--; 00143 } 00144 } 00145 } 00146 00147 //*************************************************** 00148 // melody data tabel 00149 //*************************************************** 00150 00151 //================================ 00152 // "westminster chime" merody data 00153 //================================ 00154 const Sound::sound_t WESTMINSTER[] = { 00155 // onkai,hatuon jikan[ms] 00156 {1,0xA4,1200,1000}, 00157 {1,0xF4,1200,1000}, 00158 {1,0x94,1200,1000}, 00159 {1,0xC4,2400,1000}, 00160 00161 {1,0xC4,1200,1000}, 00162 {1,0x94,1200,1000}, 00163 {1,0xA4,1200,1000}, 00164 {1,0xF4,2400,1000}, 00165 00166 {1,0xA4,1200,1000}, 00167 {1,0xF4,1200,1000}, 00168 {1,0x94,1200,1000}, 00169 {1,0xC4,2400,1000}, 00170 00171 {1,0xC4,1200,1000}, 00172 {1,0x94,1200,1000}, 00173 {1,0xA4,1200,1000}, 00174 {1,0xF4,2400,1000}, 00175 00176 {1,0xFF,1000,0}, // end 00177 }; 00178 00179 //========================== 00180 // "ramen chime" merody data 00181 //========================== 00182 const Sound::sound_t RAMEN[] = { 00183 // onkai,hatuon jikan[ms] 00184 {1,0xC5,300,500}, 00185 {1,0xD5,300,500}, 00186 {1,0xE5,1200,500}, 00187 {1,0xD5,600,500}, 00188 {1,0xC5,1200,500}, 00189 00190 {1,0xC5,300,500}, 00191 {1,0xD5,300,500}, 00192 {1,0xE5,300,500}, 00193 {1,0xD5,300,500}, 00194 {1,0xC5,300,500}, 00195 {1,0xD5,1800,500}, 00196 00197 00198 {1,0xFF,1000,500}, // end 00199 }; 00200 00201 //============================= 00202 // "demekin no uta" merody data 00203 //============================= 00204 const Sound::sound_t DEMEKIN[] = { 00205 // onkai,hatuon jikan[ms] 00206 {1,0xC5,600,500}, // de 00207 {1,0xE5,600,500}, // me 00208 {1,0x95,600,500}, // kin 00209 {1,0x00,600,500}, 00210 00211 {1,0xC5,600,500}, // de 00212 {1,0xE5,600,500}, // me 00213 {1,0x95,600,500}, // kin 00214 {1,0x00,600,500}, 00215 00216 {1,0xC5,600,500}, // de 00217 {1,0xE5,600,500}, // me 00218 {1,0x95,600,500}, // kin 00219 {1,0x95,600,500}, // no 00220 {1,0x95,150,500}, // shi 00221 {1,0x00,900,500}, 00222 {1,0xE5,750,500}, // po 00223 {1,0x00,450,500}, 00224 00225 {1,0xC5,600,500}, // de 00226 {1,0xE5,600,500}, // me 00227 {1,0x95,600,500}, // kin 00228 {1,0x00,600,500}, 00229 00230 {1,0xC5,600,500}, // de 00231 {1,0xE5,600,500}, // me 00232 {1,0x95,600,500}, // kin 00233 {1,0x00,600,500}, 00234 00235 {1,0x95,600,500}, // ju 00236 {1,0xE5,600,500}, // go 00237 {1,0xD5,600,500}, // n 00238 {1,0xC5,600,500}, // no 00239 {1,0xE5,150,500}, // shi 00240 {1,0x00,900,500}, 00241 {1,0xC5,750,500}, // po 00242 {1,0x00,1350,500}, 00243 00244 {1,0xFF,1000,0}, // end (1s keika go sai enso) 00245 // {1,0xFF,0}, // end (1kaino enso de teisi suru baai) 00246 }; 00247 00248 //============================= 00249 // timer SW seni 00250 //============================= 00251 void timerSeni(void){ 00252 static uint8_t B_timesec = 0; 00253 00254 // aSw(settei SW) 00255 if(sw.checkEdgeOn(aSw) == 1){ 00256 if((M_timer != setMin) && (M_timer != setHore)){ 00257 beep(); 00258 M_timer = setMin; 00259 00260 // genzai jikoku kakuno 00261 seconds = time(NULL); 00262 A_time = localtime(&seconds); 00263 } 00264 else if((M_timer == setMin) || (M_timer == setHore)){ 00265 beep(); 00266 M_timer = count; 00267 00268 A_time->tm_sec = 0; 00269 seconds = mktime(A_time); 00270 set_time(seconds); 00271 } 00272 else{ 00273 // noting 00274 } 00275 } 00276 00277 // bSw(torikesi SW) 00278 if((sw.checkEdgeOn(bSw) == 1) && (M_timer != count) 00279 ){ 00280 beep(); 00281 M_timer = count; 00282 } 00283 00284 switch(M_timer){ 00285 case stop: 00286 // other aSw,bSw then setMin 00287 if((sw.checkEdgeOn(upSw) == 1) 00288 ||(sw.checkEdgeOn(downSw) == 1) 00289 ||(sw.checkEdgeOn(leftSw) == 1) 00290 ||(sw.checkEdgeOn(rightSw) == 1) 00291 ){ 00292 beep(); 00293 M_timer = setMin; 00294 C_flicker = 0; 00295 00296 // genzai jikoku kakuno 00297 seconds = time(NULL); 00298 A_time = localtime(&seconds); 00299 } 00300 break; 00301 case setMin: 00302 if(sw.checkEdgeOn(leftSw) == 1){ 00303 beep(); 00304 M_timer = setHore; 00305 C_flicker = 0; 00306 } 00307 break; 00308 case setHore: 00309 if(sw.checkEdgeOn(rightSw) == 1){ 00310 beep(); 00311 M_timer = setMin; 00312 C_flicker = 0; 00313 } 00314 break; 00315 case count: 00316 seconds = time(NULL); 00317 A_time = localtime(&seconds); 00318 00319 // 59 kara 0 byo ni nattara melody wo narasu 00320 if((B_timesec == 59) && (A_time->tm_sec == 0)){ 00321 // jikoku chime no kaisuu set 00322 uint8_t C_chime = A_time->tm_hour; 00323 if(C_chime == 0){ 00324 C_chime = 12; 00325 } 00326 else if(C_chime > 12){ 00327 C_chime -= 12; 00328 } 00329 00330 // jikoku no melody and chime 00331 if(A_time->tm_min == 0){ 00332 if(A_time->tm_hour == 12){ 00333 sound.sound_enso((Sound::sound_t*)RAMEN); 00334 sound.sound_enso(true); 00335 chimeSet(C_chime); 00336 } 00337 else { 00338 sound.sound_enso((Sound::sound_t*)WESTMINSTER); 00339 sound.sound_enso(true); 00340 chimeSet(C_chime); 00341 } 00342 } 00343 00344 // 30min no chime 00345 if(A_time->tm_min == 30){ 00346 chimeSet(2); 00347 } 00348 00349 // 15min or 45min no chime 00350 if((A_time->tm_min == 15) || (A_time->tm_min == 45)){ 00351 chimeSet(1); 00352 } 00353 } 00354 B_timesec = A_time->tm_sec; // jikai hikaku yo time data kioku 00355 break; 00356 00357 default: 00358 // nothing 00359 break; 00360 } 00361 00362 } 00363 //============================ 00364 // time set 00365 //============================ 00366 void timerSet(void){ 00367 00368 switch(M_timer){ 00369 case stop: 00370 break; 00371 case setMin: 00372 if(sw.checkEdgeOn(upSw) == 1){ 00373 beep(); 00374 if(A_time->tm_min < 59){ 00375 A_time->tm_min++; 00376 } 00377 else{ 00378 A_time->tm_min = 0; 00379 } 00380 C_flicker = Z_flicker; 00381 } 00382 00383 if(sw.checkEdgeOn(downSw) == 1){ 00384 beep(); 00385 if(A_time->tm_min > 0){ 00386 A_time->tm_min--; 00387 } 00388 else{ 00389 A_time->tm_min = 59; 00390 } 00391 C_flicker = Z_flicker; 00392 } 00393 break; 00394 case setHore: 00395 if(sw.checkEdgeOn(upSw) == 1){ 00396 beep(); 00397 if(A_time->tm_hour < 23){ 00398 A_time->tm_hour++; 00399 } 00400 else{ 00401 A_time->tm_hour = 0; 00402 } 00403 C_flicker = Z_flicker; 00404 } 00405 00406 if(sw.checkEdgeOn(downSw) == 1){ 00407 beep(); 00408 if(A_time->tm_hour > 0){ 00409 A_time->tm_hour--; 00410 } 00411 else{ 00412 A_time->tm_hour = 23; 00413 } 00414 C_flicker = Z_flicker; 00415 } 00416 break; 00417 case count: 00418 // nothing 00419 break; 00420 default: 00421 // nothing 00422 break; 00423 } 00424 00425 } 00426 00427 //========================== 00428 // seven segment display 00429 //========================== 00430 void sevenSegDisplay(void){ 00431 int16_t work; 00432 00433 switch(M_timer){ 00434 case stop: 00435 00436 D_7seg[0] = 0x0f; 00437 D_7seg[1] = 0x0f; 00438 D_7seg[2] = 0x0f; 00439 D_7seg[3] = 0x0f; 00440 00441 00442 D_dot[0] = 0; 00443 D_dot[1] = 0; 00444 D_dot[2] = 0; 00445 D_dot[3] = 0; 00446 00447 break; 00448 case setMin: // setHore to onaji 00449 case setHore: 00450 sevenSegLed.smoothSet(1); // hyoji hard 00451 D_7seg[0] = A_time->tm_hour / 10; 00452 D_7seg[1] = A_time->tm_hour % 10; 00453 D_7seg[2] = A_time->tm_min / 10; 00454 D_7seg[3] = A_time->tm_min % 10; 00455 00456 // settei basyo no tenmetu 00457 if((C_flicker == 0) && (F_flip500ms == 0)){ 00458 if(M_timer == setMin){ 00459 D_7seg[2] = 0x10; 00460 D_7seg[3] = 0x10; 00461 } 00462 else{ 00463 D_7seg[0] = 0x10; 00464 D_7seg[1] = 0x10; 00465 } 00466 } 00467 00468 D_dot[0] = 0; 00469 D_dot[1] = 1; 00470 D_dot[2] = 0; 00471 D_dot[3] = 1; 00472 00473 break; 00474 case count: 00475 sevenSegLed.smoothSet(0); // hyoji smooth 00476 seconds = time(NULL); 00477 A_time = localtime(&seconds); 00478 00479 D_7seg[0] = A_time->tm_hour / 10; 00480 D_7seg[1] = A_time->tm_hour % 10; 00481 D_7seg[2] = A_time->tm_min / 10; 00482 D_7seg[3] = A_time->tm_min % 10; 00483 00484 D_dot[0] = 0; 00485 D_dot[1] = 1; 00486 D_dot[2] = 0; 00487 00488 // byo no dot no tenmetu 00489 if((A_time->tm_sec % 2) == 0){ 00490 D_dot[3] = 0; 00491 } 00492 else{ 00493 D_dot[3] = 1; 00494 } 00495 break; 00496 00497 default: 00498 break; 00499 } 00500 sevenSegLed.SevenSegLed_main(D_7seg, D_dot); // 7segment hyoji 00501 } 00502 00503 //================================ 00504 // 100ms interrupt 00505 //================================ 00506 void interrupt100ms(void){ 00507 static uint8_t C_100ms = 0; 00508 00509 C_100ms++; 00510 if(C_100ms > 9){C_100ms = 0;} 00511 00512 // flip flag 00513 F_flip100ms = !F_flip100ms; 00514 00515 if(C_100ms < 5){F_flip500ms = 1;} 00516 else{F_flip500ms = 0;} 00517 00518 // settei keta flicker 00519 if(C_flicker > 0){C_flicker--;} 00520 00521 // timer counter decrement 00522 if((C_100ms == 0) && (C_timerSec > 0)){C_timerSec--;} 00523 00524 } 00525 00526 //================================ 00527 // main 00528 //================================ 00529 int main() { 00530 timeout100ms.attach(&interrupt100ms, 0.1); // 10ms interrupt 00531 00532 // kido ji no melody 00533 sound.sound_enso((Sound::sound_t*)DEMEKIN); 00534 sound.sound_enso(true); 00535 00536 while(1) { 00537 // sw level and edge data refresh 00538 sw.refreshEdgeData(); 00539 00540 timerSeni(); 00541 timerSet(); 00542 sevenSegDisplay(); 00543 chimeCheck(); 00544 } 00545 }
Generated on Mon Jul 25 2022 00:36:31 by 1.7.2