This program is a clock that uses a kitchen Timer boad.

Dependencies:   SevenSegLed Sound_pwmToDig SwAnalog mbed

Fork of kitchenTimer_Clock by suu pen

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }