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

Dependencies:   SevenSegLed Sound_pwmToDig SwAnalog mbed

Fork of kitchenTimer_Clock by suu pen

LPC1114FN28(mbed)を使ったデジタル時計

<概要>

以前作成したLPC1114FN28(mbed)で作ったキッチンタイマーのプログラムを変更して、デジタル時計をつくりました。

回路はキッチンタイマーのものをそのまま使っています。基板作成や、プログラムの書き込み方法については、次のblogを参照してください。

回路図、PCB、WINSTAR PCB for iModela、などのデータはこちらからダウンロードできます。

<時計動作の説明>

基板の電源を入れると、表示が“FFFF”になり、メロディーが流れます。

スイッチは、 右上(赤)SW :時計時刻設定の開始・完了 右下(青)SW :時計時刻設定のキャンセル 左(黒)十字SW:時計時刻変更用 となっています。

/media/uploads/suupen/----p1170422.jpg デジタル時計のLED,SWの説明

時刻あわせをする場合は、赤色SWを押して時刻設定モードにしてから、十字SWで時刻を変更し、再度赤色SWを押すと時刻確定して、時計動作を始めます。

時計設定をやめたいときは、青色SWを押します。

時計計時は、4桁の7セグメントLEDで、時・分表示をします。秒は、一番右側のドットLEDの点滅で表示しています。

ドットや、数字の変化は、滑らかに変化させています。

毎正時(59から00分に変化)した時に、メロディーを流します。

<プログラムについて>

プログラムは、こちらからからダウンロードできます。

Revision:
0:b7cdbc649bd3
Child:
1:fe97b047f96b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Apr 08 03:36:28 2012 +0000
@@ -0,0 +1,604 @@
+//#define debug
+//===========================================================================
+// mbed seven segment LED PCB board example program
+//
+// 24h display clock
+//
+// V1.0 120402
+// 
+// <schematic>
+// 1.seven segment numeric LED Display : OSL40562-LR
+//       http://akizukidenshi.com/download/OSL40562-LR.pdf
+//
+//  OSL40562-LR                           Resister        mbed
+//  Pin No     Function                   [ohm]           Function
+//  ---------------------------------------------------------------------------
+//   1         segment E                   200            P13 
+//   2         segment D                   200            P12
+//   3         segment Dp                  200            P11
+//   4         segment C                   200            p10
+//   5         segment G                   200            P9
+//   6         common  4                   -              P8  
+//   7         segment B                   200            P5
+//   8         common  3                   -              P6 
+//   9         common  2                   -              p7
+//  10         segment F                   200            p18
+//  11         segment A                   200            P19 
+//  12         common  1                    -             p20
+// 
+// 2.sound speaker
+//                                               /
+//   mbed                 --------------      --/
+//   p21(pwmOut)     -----| R:0[ohm]   |-----|  |  speaker(8[ohm])
+//                        --------------     |  |
+//                                           |  |
+//   p22(DigitalOut) ------------------------|  |
+//                                            --\
+//                                               \
+// 3.sw
+//                sw6(left sw)
+//                ---- 
+//    p25 --------o  o----------- GND
+//
+//                sw5(up sw)
+//                ---- 
+//    p26 --------o  o----------- GND
+//
+//                sw4(down sw)
+//                ---- 
+//    p27 --------o  o----------- GND
+//
+//                sw3(right sw)
+//                ---- 
+//    p28 --------o  o----------- GND
+//
+//                sw2(b sw)
+//                ---- 
+//    p29 --------o  o----------- GND
+//
+//                sw1(a sw)
+//                ---- 
+//    p30 --------o  o----------- GND
+//
+// V1.0 2011/12/11 
+// 
+//
+//===========================================================================
+#include "mbed.h"
+#include "SevenSegLed.h"
+#include "Sound.h"
+#include "SwDigital.h"
+
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+Ticker timeout100ms;     // 100ms interrupt
+
+Sound sound(p21, p22);
+SwDigital sw(p25, p26, p27, p28, p29, p30); // left, up, down, right, b, a
+enum{
+    leftSw,
+    upSw,
+    downSw,
+    rightSw,
+    bSw,
+    aSw
+};
+
+//SevenSegLed sevenSegLed(1, 1, p19, p7, p10, p12, p13, p20, p9, p11, p18, p5, p6, p8);   // OSL40562-LR(schematic bug)
+SevenSegLed sevenSegLed(1, 0, p19, p5, p10, p12, p13, p18, p9, p11, p20, p7, p6, p8);   // OSL40562-LR(seikiban)
+
+uint8_t D_7seg[4] = {0, 0, 0, 0};
+uint8_t D_dot[4] = {0, 1, 0, 0};
+
+uint8_t C_flicker; // timer setti ji no henko keta flicker kyoka (100[ms]/count) 0:flicker request ohter:kinsi
+#define Z_flicker (5 * 10)
+
+int16_t D_timerSec = 3 * 60; // timer no settai chi (1/1 [s]/count)
+int16_t C_timerSec; // timer keiji jikan (1/1[s]/count)
+
+enum timer_t{
+    stop,
+    set1min,
+    set10min,
+    count,
+    chime,
+    timeup
+};
+timer_t M_timer = stop;
+
+uint8_t F_flip100ms;    // 100ms keika goto ni 0 or 1 
+uint8_t F_flip500ms;    // 500ms keika goto ni 0 or 1
+
+time_t seconds;
+struct tm  *A_time;   // genzai jikoku
+#define Z_japanOffset   (9 * 60 * 60)   // japan time offset (utc + 9h)
+
+
+void beep(void){
+// tone1 
+    Sound::sound_t oto = {1,0x95,200,100};
+    sound.sound_sound(oto);
+}
+
+void beep2(void){
+// tone1 
+    Sound::sound_t oto = {1,0xA4,1200,1000};
+    sound.sound_sound(oto);
+}
+
+// "westminster chime" merody data
+    const Sound::sound_t WESTMINSTER[] =     {
+    //  onkai,hatuon jikan[ms]
+        {1,0xA4,1200,1000},
+        {1,0xF4,1200,1000},
+        {1,0x94,1200,1000},
+        {1,0xC4,2400,1000},
+
+        {1,0xC4,1200,1000},
+        {1,0x94,1200,1000},
+        {1,0xA4,1200,1000},
+        {1,0xF4,2400,1000},
+ 
+        {1,0xA4,1200,1000},
+        {1,0xF4,1200,1000},
+        {1,0x94,1200,1000},
+        {1,0xC4,2400,1000},
+
+        {1,0xC4,1200,1000},
+        {1,0x94,1200,1000},
+        {1,0xA4,1200,1000},
+        {1,0xF4,2400,1000},
+               
+        {1,0xFF,1000,0},    // end
+    };
+// "ramen chime" merody data
+    const Sound::sound_t RAMEN[] =     {
+    //  onkai,hatuon jikan[ms]
+        {1,0xC5,300,500},
+        {1,0xD5,300,500},
+        {1,0xE5,1200,500},
+        {1,0xD5,600,500},
+        {1,0xC5,1200,500},
+
+        {1,0xC5,300,500},
+        {1,0xD5,300,500},
+        {1,0xE5,300,500},
+        {1,0xD5,300,500},
+        {1,0xC5,300,500},
+        {1,0xD5,1800,500},
+
+        
+        {1,0xFF,1000,500},    // end
+    };
+
+// "demekin no uta" merody data
+    const Sound::sound_t DEMEKIN[] =     {
+    //  onkai,hatuon jikan[ms]
+        {1,0xC5,600,500},     // de
+        {1,0xE5,600,500},     // me
+        {1,0x95,600,500},     // kin
+        {1,0x00,600,500},
+
+        {1,0xC5,600,500},     // de
+        {1,0xE5,600,500},     // me
+        {1,0x95,600,500},     // kin
+        {1,0x00,600,500},
+
+        {1,0xC5,600,500},     // de
+        {1,0xE5,600,500},     // me
+        {1,0x95,600,500},     // kin
+        {1,0x95,600,500},     // no
+        {1,0x95,150,500},     // shi
+        {1,0x00,900,500},
+        {1,0xE5,750,500},     // po
+        {1,0x00,450,500},
+
+        {1,0xC5,600,500},     // de
+        {1,0xE5,600,500},     // me
+        {1,0x95,600,500},     // kin
+        {1,0x00,600,500},
+
+        {1,0xC5,600,500},     // de
+        {1,0xE5,600,500},     // me
+        {1,0x95,600,500},     // kin
+        {1,0x00,600,500},
+
+        {1,0x95,600,500},     // ju
+        {1,0xE5,600,500},     // go
+        {1,0xD5,600,500},     // n
+        {1,0xC5,600,500},     // no
+        {1,0xE5,150,500},     // shi
+        {1,0x00,900,500},
+        {1,0xC5,750,500},     // po
+        {1,0x00,1350,500},
+
+        {1,0xFF,1000,0},    // end (1s keika go sai enso)
+//                                {1,0xFF,0},        // end    (1kaino enso de teisi suru baai)
+};
+
+//=============================
+// clock 
+//=============================
+/*
+    time_t ctTime;
+    struct tm *jst_time;
+    
+    _JIKOKU wk = *j;
+
+
+    ctTime = time(NULL);
+    ctTime += 32400;
+    jst_time = localtime(&ctTime);
+
+    
+    wk.sec  = jst_time->tm_sec;
+    wk.min  = jst_time->tm_min;
+    wk.hour = jst_time->tm_hour;
+*/    
+
+
+//=============================
+// timer SW seni
+//=============================
+void timerSeni(void){
+    static uint8_t B_timesec = 0;
+
+    // aSw(settei SW)
+    if(sw.checkEdgeOn(aSw) == 1){
+        if((M_timer != set1min) && (M_timer != set10min)){
+            beep();
+            M_timer = set1min;
+            
+            // genzai jikoku kakuno
+            seconds = time(NULL);
+            A_time = localtime(&seconds);
+        }
+        else if((M_timer == set1min) || (M_timer == set10min)){
+            beep();
+            M_timer = count;
+            
+            A_time->tm_sec = 0;
+            seconds = mktime(A_time);
+            set_time(seconds);       
+        }
+        else{
+            // noting
+        }
+    }
+    
+    // bSw(torikesi SW)
+    if((sw.checkEdgeOn(bSw) == 1) && (M_timer != count)
+    ){
+        beep();
+        M_timer = count;
+    }    
+
+    switch(M_timer){
+    case stop:
+        // other aSw,bSw then set1min
+        if((sw.checkEdgeOn(upSw) == 1)
+         ||(sw.checkEdgeOn(downSw) == 1)
+         ||(sw.checkEdgeOn(leftSw) == 1)
+         ||(sw.checkEdgeOn(rightSw) == 1)
+         ){
+            beep();
+            M_timer = set1min;
+            C_flicker = 0;
+            
+            // genzai jikoku kakuno
+            seconds = time(NULL);
+            A_time = localtime(&seconds);
+        }
+        break;
+    case set1min:
+        if(sw.checkEdgeOn(leftSw) == 1){
+            beep();
+            M_timer = set10min;
+            C_flicker = 0;
+        }
+        break;
+    case set10min:
+        if(sw.checkEdgeOn(rightSw) == 1){
+            beep();
+            M_timer = set1min;
+            C_flicker = 0;
+        }
+        break;
+    case count:
+        seconds = time(NULL);
+        A_time = localtime(&seconds);
+        
+        // 59 kara 0 byo ni nattara melody wo narasu
+        if((B_timesec == 59) && (A_time->tm_sec == 0)){
+        
+            if(A_time->tm_min == 0){
+                if(A_time->tm_hour == 12){
+                    sound.sound_enso((Sound::sound_t*)RAMEN);
+                    sound.sound_enso(true);
+                }
+                else {
+                    sound.sound_enso((Sound::sound_t*)WESTMINSTER);
+                    sound.sound_enso(true);
+                }
+            }
+                           
+            if(A_time->tm_min == 30){
+                sound.sound_enso((Sound::sound_t*)DEMEKIN);
+                sound.sound_enso(true);
+            }
+         
+            if((A_time->tm_min == 15) || (A_time->tm_min == 45)){
+                beep2();
+            }
+         }
+        B_timesec = A_time->tm_sec;
+      break;
+    
+    case chime: // 120115 bug fix
+/*
+        if(D_timerSec == (3 * 60)){
+            sound.sound_enso((Sound::sound_t*)RAMEN);
+        }
+        else if(D_timerSec < (60 * 60)){
+            sound.sound_enso((Sound::sound_t*)WESTMINSTER);
+        }
+        else{
+            sound.sound_enso((Sound::sound_t*)DEMEKIN);
+        }
+            
+        sound.sound_enso(true);
+        M_timer = timeup;
+*/        
+        break;
+/*    
+    case timeup:
+        // other aSw,bSw then set1min
+        if((sw.checkEdgeOn(upSw) == 1)
+         ||(sw.checkEdgeOn(downSw) == 1)
+         ||(sw.checkEdgeOn(leftSw) == 1)
+         ||(sw.checkEdgeOn(rightSw) == 1)
+         ){
+            beep();
+            M_timer = set1min;
+            C_flicker = 0;
+        }    
+        break;
+ */ 
+    default:
+        break;
+    }
+
+}
+//============================
+// timer set
+//============================
+void timerSet(void){
+//    int16_t work;
+
+    switch(M_timer){
+    case stop:
+        break;
+    case set1min:
+        if(sw.checkEdgeOn(upSw) == 1){
+            beep();
+            if(A_time->tm_min < 59){
+                A_time->tm_min++;
+            }
+            else{
+                A_time->tm_min = 0;
+            }
+            C_flicker = Z_flicker;
+         }
+        
+        if(sw.checkEdgeOn(downSw) == 1){
+            beep();
+            if(A_time->tm_min > 0){
+                A_time->tm_min--;
+            }
+            else{
+                A_time->tm_min = 59;
+            }
+            C_flicker = Z_flicker;
+        }
+        break;
+    case set10min:
+        if(sw.checkEdgeOn(upSw) == 1){
+            beep();
+            if(A_time->tm_hour < 23){
+                A_time->tm_hour++;
+            }
+            else{
+                A_time->tm_hour = 0;
+            }
+            C_flicker = Z_flicker;
+        }
+        
+        if(sw.checkEdgeOn(downSw) == 1){
+            beep();
+             if(A_time->tm_hour > 0){
+                A_time->tm_hour--;
+            }
+            else{
+                A_time->tm_hour = 23;
+            }
+            C_flicker = Z_flicker;
+        }
+        break;
+    case count:
+        break;
+    case chime:
+        break;
+    case timeup:
+        break;
+    default:
+        break;
+    }
+    
+ }
+
+//==========================
+// seven segment display
+//==========================
+void sevenSegDisplay(void){
+    int16_t work;
+    
+    switch(M_timer){
+    case stop:
+ 
+        D_7seg[0] = 0x0f;
+        D_7seg[1] = 0x0f;
+        D_7seg[2] = 0x0f;
+        D_7seg[3] = 0x0f;
+ 
+        
+        D_dot[0] = 0;
+        D_dot[1] = 0;
+        D_dot[2] = 0;
+        D_dot[3] = 0;
+        
+        break;
+    case set1min:
+    case set10min:
+        D_7seg[0] = A_time->tm_hour / 10;
+        D_7seg[1] = A_time->tm_hour % 10;
+        D_7seg[2] = A_time->tm_min / 10;
+        D_7seg[3] = A_time->tm_min % 10;
+
+        // settei basyo no tenmetu        
+        if((C_flicker == 0) && (F_flip500ms == 0)){
+            if(M_timer == set1min){
+                D_7seg[2] = 0x10;
+                D_7seg[3] = 0x10;
+            }
+            else{
+                D_7seg[0] = 0x10;
+                D_7seg[1] = 0x10;
+            }
+        }
+
+        D_dot[0] = 0;
+        D_dot[1] = 1;         
+        D_dot[2] = 0;
+        D_dot[3] = 1;
+
+        break;
+    case count:
+        seconds = time(NULL);
+        A_time = localtime(&seconds);
+        
+        D_7seg[0] = A_time->tm_hour / 10;
+        D_7seg[1] = A_time->tm_hour % 10;
+        D_7seg[2] = A_time->tm_min / 10;
+        D_7seg[3] = A_time->tm_min % 10;
+/*
+        D_7seg[0] = A_time->tm_min / 10;
+        D_7seg[1] = A_time->tm_min % 10;
+        D_7seg[2] = A_time->tm_sec / 10;
+        D_7seg[3] = A_time->tm_sec % 10;
+ */
+        D_dot[0] = 0;
+        D_dot[1] = 1;
+        D_dot[2] = 0;
+   
+        if((A_time->tm_sec % 2) == 0){
+            D_dot[3] = 0;
+        }
+        else{
+            D_dot[3] = 1;
+        }
+
+        break;
+    case chime: // same "timeup"
+
+#ifdef debug
+    D_7seg[0] = 0x0E;
+    D_7seg[1] = 0x10;
+    D_7seg[2] = 0x10;
+    D_7seg[3] = 0x10;
+    break;
+#endif //debug
+
+    case timeup:
+        if(F_flip500ms == 1){
+            D_7seg[0] = 0x0f;
+            D_7seg[1] = 0x0f;
+            D_7seg[2] = 0x0f;
+            D_7seg[3] = 0x0f;
+        }
+        else{
+            D_7seg[0] = 0x10;
+            D_7seg[1] = 0x10;
+            D_7seg[2] = 0x10;
+            D_7seg[3] = 0x10;
+        }
+        
+        D_dot[0] = 0;
+        D_dot[1] = 0;
+        D_dot[2] = 0;
+        D_dot[3] = 0;
+        break;
+    default:
+        break;
+    }
+    sevenSegLed.SevenSegLed_main(D_7seg, D_dot);
+}
+
+//================================
+// 100ms interrupt
+//================================
+void interrupt100ms(void){
+//    led2 = !led2;
+    static uint8_t C_100ms = 0;
+    
+    C_100ms++;
+    if(C_100ms > 9){C_100ms = 0;}
+    
+    // flip flag 
+    F_flip100ms = !F_flip100ms;
+
+    if(C_100ms < 5){F_flip500ms = 1;}
+    else{F_flip500ms = 0;}
+
+    // settei keta flicker
+    if(C_flicker > 0){C_flicker--;}
+
+    // timer counter decrement
+    if((C_100ms == 0) && (C_timerSec > 0)){C_timerSec--;}        
+
+}
+
+//================================
+// main
+//================================
+int main() {
+    timeout100ms.attach(&interrupt100ms, 0.1);  // 10ms interrupt
+
+    // kido ji no melody
+    sound.sound_enso((Sound::sound_t*)DEMEKIN);
+    sound.sound_enso(true);
+
+    while(1) {
+        // sw level and edge data refresh
+        sw.refreshEdgeData();
+    
+        timerSeni();
+        timerSet();
+        sevenSegDisplay();
+/*
+        // debug code
+        if((sw.checkEdgeOn(leftSw) == 1)
+         ||(sw.checkEdgeOn(rightSw) == 1)
+         ||(sw.checkEdgeOn(upSw) == 1)
+         ||(sw.checkEdgeOn(downSw) == 1)
+         ||(sw.checkEdgeOn(aSw) == 1)
+         ||(sw.checkEdgeOn(bSw) == 1)
+        ){
+            led1 = !led1;
+        }
+ */       
+ 
+    }
+}