iModela(iM-01) de sakusei sita PCB no kitchenTimer wo clock ni henko sita monodesu.

Dependencies:   SevenSegLed SwDigital mbed Sound

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }