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分に変化)した時に、メロディーを流します。

<プログラムについて>

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

Files at this revision

API Documentation at this revision

Comitter:
suupen
Date:
Sun Dec 01 00:45:55 2013 +0000
Parent:
1:fe97b047f96b
Commit message:
This program is a clock that uses a kitchen Timer board.

Changed in this revision

SevenSegLed.lib Show annotated file Show diff for this revision Revisions of this file
Sound.lib Show diff for this revision Revisions of this file
Sound_pwmToDig.lib Show annotated file Show diff for this revision Revisions of this file
SwAnalog2input.lib Show annotated file Show diff for this revision Revisions of this file
SwDigital.lib Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- a/SevenSegLed.lib	Sun Apr 22 11:30:33 2012 +0000
+++ b/SevenSegLed.lib	Sun Dec 01 00:45:55 2013 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/suupen/code/SevenSegLed/#f4680c84b347
+https://mbed.org/users/suupen/code/SevenSegLed/#a7ba72bf10ba
--- a/Sound.lib	Sun Apr 22 11:30:33 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/suupen/code/Sound/#c342b5349740
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sound_pwmToDig.lib	Sun Dec 01 00:45:55 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/suupen/code/Sound_pwmToDig/#7e1945a135d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SwAnalog2input.lib	Sun Dec 01 00:45:55 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/suupen/code/SwAnalog/#ebaa87e67cef
--- a/SwDigital.lib	Sun Apr 22 11:30:33 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/suupen/code/SwDigital/#af5fbc75b7bf
--- a/main.cpp	Sun Apr 22 11:30:33 2012 +0000
+++ b/main.cpp	Sun Dec 01 00:45:55 2013 +0000
@@ -1,99 +1,105 @@
-//#define debug
 //===========================================================================
-// mbed seven segment LED PCB board example program
-//
-// 24h display clock
+// digital clock
 //
-// V1.0 120402
-// V2.0 120422 : melody and chime no henko. hyoji no kaizen
-// 
 // <schematic>
-// 1.seven segment numeric LED Display : OSL40562-LR
-//       http://akizukidenshi.com/download/OSL40562-LR.pdf
+// 1.seven segment numeric LED Display : OSL40562-IRA
+//       http://akizukidenshi.com/download/OSL40562-IRA.pdf
 //
-//  OSL40562-LR                           Resister        mbed
-//  Pin No     Function                   [ohm]           Function
+//  OSL40562-IRA                          Resister        LPC1114FN28
+//  Pin No     Function                   [ohm]           PinNo
 //  ---------------------------------------------------------------------------
-//   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
+//   1         segment E                   680            dp28 
+//   2         segment D                   680            dp27
+//   3         segment Dp                  680            dp26
+//   4         segment C                   680            dp25
+//   5         segment G                   680            dp18
+//   6         common  4                   -              dp17  
+//   7         segment B                   680            dp11
+//   8         common  3                   -              dp13 
+//   9         common  2                   -              dp14
+//  10         segment F                   680            dp5
+//  11         segment A                   680            dp6 
+//  12         common  1                    -             dp4
 // 
 // 2.sound speaker
 //                                               /
 //   mbed                 --------------      --/
-//   p21(pwmOut)     -----| R:0[ohm]   |-----|  |  speaker(8[ohm])
+//   dp1(pwmOut)     -----| R:100[ohm] |-----|  |  speaker(8[ohm])
 //                        --------------     |  |
 //                                           |  |
-//   p22(DigitalOut) ------------------------|  |
-//                                            --\
+//   dp2(pwmOut)     ------------------------|  |
+//      (digitalOut)                          --\
 //                                               \
 // 3.sw
-//                sw6(left sw)
-//                ---- 
-//    p25 --------o  o----------- GND
-//
-//                sw5(up sw)
-//                ---- 
-//    p26 --------o  o----------- GND
-//
-//                sw4(down sw)
-//                ---- 
-//    p27 --------o  o----------- GND
+//   -.- Vcc(+3.3[V])
+//    |                                               |--------------------> dp9(ADinput)
+//    |   ---------       ---------       ---------   |   ---------
+//    .---| Rsw2  |---.---| Rsw1  |---.---| Rsw0  |---.---| Rout  |----|
+//    |   ---------   |   ---------   |   ---------   |   ---------    |
+//    |     ----      |     -----     |     -----     |                |
+//    |-----o  o------.-----o  o------.-----o  o------|              -----
+//           LeftSW         DowmSW           UpSW                  GND(0[V])
+// 
+//  Rsw2 : 8.2[kohm], Rsw1 = 3.9[kohm], Rsw0 = 2.0[kohm], Rout = 1.0[kohm] (R no seido ha +-1[%])
 //
-//                sw3(right sw)
-//                ---- 
-//    p28 --------o  o----------- GND
+//   -.- Vcc(+3.3[V])
+//    |                                               |--------------------> dp10(ADinput)
+//    |   ---------       ---------       ---------   |   ---------
+//    .---| Rsw2  |---.---| Rsw1  |---.---| Rsw0  |---.---| Rout  |----|
+//    |   ---------   |   ---------   |   ---------   |   ---------    |
+//    |     ----      |     -----     |     -----     |                |
+//    |-----o  o------.-----o  o------.-----o  o------|              -----
+//          RightSW          BSW           ASW                      GND(0[V])
+// 
+//  Rsw2 : 8.2[kohm], Rsw1 = 3.9[kohm], Rsw0 = 2.0[kohm], Rout = 1.0[kohm] (R no seido ha +-1[%])
 //
-//                sw2(b sw)
-//                ---- 
-//    p29 --------o  o----------- GND
-//
-//                sw1(a sw)
-//                ---- 
-//    p30 --------o  o----------- GND
-//
-// V1.0 2011/12/11 
+// V1.0 131130
 // 
 //
 //===========================================================================
 #include "mbed.h"
+
+//#define DBG
+
+#ifdef DBG
+Serial pc(dp16, dp15);
+#endif //DBG
+
+
 #include "SevenSegLed.h"
 #include "Sound.h"
-#include "SwDigital.h"
+#include "SwAnalog.h"
+
+
+
 
 Ticker timeout100ms;     // 100ms interrupt
 
-Sound sound(p21, p22);
-SwDigital sw(p25, p26, p27, p28, p29, p30); // left, up, down, right, b, a
+Sound sound(dp1, dp2);    // pwm, pwm(digitalOut)
+
+
+SwAnalog sw(dp9, dp10);
 enum{
-    leftSw,
     upSw,
     downSw,
-    rightSw,
+    leftSw,
+    aSw,
     bSw,
-    aSw
+    rightSw
 };
+SevenSegLed sevenSegLed(0, 1, dp6, dp11, dp25, dp27, dp28, dp5, dp18, dp26, dp4, dp14, dp13, dp17);   // OSL40562-IRA
 
-SevenSegLed sevenSegLed(1, 0, p19, p5, p10, p12, p13, p18, p9, p11, p20, p7, p6, p8);   // OSL40562-LR(seikiban)
+
 
+
+// 7segment LED initial display data.
 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)
-
+// control mode number.
 enum timer_t{
     stop,
     setMin,
@@ -106,17 +112,34 @@
 uint8_t F_flip500ms;    // 500ms keika goto ni 0 or 1
 
 time_t seconds;
-struct tm  *A_time;   // genzai jikoku
+typedef struct{
+    uint8_t tm_hour;
+    uint8_t tm_min;
+    uint8_t tm_sec;
+    } sstm;
+
+sstm rtc_time;    // LPC11U24 yo rtc
+sstm A_time;   // genzai jikoku
+#define Z_japanOffset   (9 * 60 * 60)   // japan time offset (utc + 9h)
+
+//time_t seconds;
+//struct tm  *A_time;   // genzai jikoku
 
 //===================================
 // beep (sw sosa ji no oto)
 //===================================
+// "beep" merody data
+    const Sound::sound_t BEEP[] = {
+    {1,0x95,200,100},
+    {1,0xFF,10,0}    // end
+    };
+
 void beep(void){
-// tone1 
-    Sound::sound_t oto = {1,0x95,200,100};
-    sound.sound_sound(oto);
+    sound.sound_enso((Sound::sound_t*)BEEP);
+    sound.sound_enso(true);
 }
 
+
 //**********************************************************
 // chime
 //**********************************************************
@@ -246,6 +269,37 @@
 };
 
 //=============================
+// rtc count
+// 1sec syuki no syori
+//=============================
+void rtc_count(void){
+    seconds++;
+    if(seconds >= (23 *3600 + 59 * 60 + 60)){
+        seconds = 0;
+    }
+}
+
+//=============================
+// localtime
+//=============================
+sstm ss_localtime( time_t  * t ){ 
+    sstm ans;
+    ans.tm_hour = *t / 3600;
+    ans.tm_min = (*t % 3600) / 60;
+    ans.tm_sec = (*t % 3600) % 60;
+    return (ans);
+} 
+
+//=============================
+// mktime
+//=============================
+time_t ss_mktime( sstm  t ){
+    time_t ans;
+    ans = (t.tm_hour * 3600) + (t.tm_min * 60) + t.tm_sec;
+    return (ans);
+} 
+
+//=============================
 // timer SW seni
 //=============================
 void timerSeni(void){
@@ -258,16 +312,16 @@
             M_timer = setMin;
             
             // genzai jikoku kakuno
-            seconds = time(NULL);
-            A_time = localtime(&seconds);
+            //seconds = time(NULL);
+            A_time = ss_localtime(&seconds);
         }
         else if((M_timer == setMin) || (M_timer == setHore)){
             beep();
             M_timer = count;
             
-            A_time->tm_sec = 0;
-            seconds = mktime(A_time);
-            set_time(seconds);       
+            A_time.tm_sec = 0;
+            seconds = ss_mktime(A_time);
+         //   set_time(seconds);       
         }
         else{
             // noting
@@ -294,8 +348,8 @@
             C_flicker = 0;
             
             // genzai jikoku kakuno
-            seconds = time(NULL);
-            A_time = localtime(&seconds);
+            //seconds = time(NULL);
+            A_time = ss_localtime(&seconds);
         }
         break;
     case setMin:
@@ -313,13 +367,13 @@
         }
         break;
     case count:
-        seconds = time(NULL);
-        A_time = localtime(&seconds);
+        //seconds = time(NULL);
+        A_time = ss_localtime(&seconds);
         
         // 59 kara 0 byo ni nattara melody wo narasu
-        if((B_timesec == 59) && (A_time->tm_sec == 0)){
+        if((B_timesec == 59) && (A_time.tm_sec == 0)){
             // jikoku chime no kaisuu set
-            uint8_t C_chime = A_time->tm_hour;
+            uint8_t C_chime = A_time.tm_hour;
             if(C_chime == 0){
                 C_chime = 12;
             }
@@ -328,8 +382,8 @@
             }
 
             // jikoku no melody and chime
-            if(A_time->tm_min == 0){
-                if(A_time->tm_hour == 12){
+            if(A_time.tm_min == 0){
+                if(A_time.tm_hour == 12){
                     sound.sound_enso((Sound::sound_t*)RAMEN);
                     sound.sound_enso(true);
                     chimeSet(C_chime);
@@ -342,16 +396,16 @@
             }
             
             // 30min no chime               
-            if(A_time->tm_min == 30){
+            if(A_time.tm_min == 30){
                 chimeSet(2);
             }
             
             // 15min or 45min no chime
-            if((A_time->tm_min == 15) || (A_time->tm_min == 45)){
+            if((A_time.tm_min == 15) || (A_time.tm_min == 45)){
                 chimeSet(1);
             }
          }
-        B_timesec = A_time->tm_sec; // jikai hikaku yo time data kioku
+        B_timesec = A_time.tm_sec; // jikai hikaku yo time data kioku
       break;
     
      default:
@@ -371,22 +425,22 @@
     case setMin:
         if(sw.checkEdgeOn(upSw) == 1){
             beep();
-            if(A_time->tm_min < 59){
-                A_time->tm_min++;
+            if(A_time.tm_min < 59){
+                A_time.tm_min++;
             }
             else{
-                A_time->tm_min = 0;
+                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--;
+            if(A_time.tm_min > 0){
+                A_time.tm_min--;
             }
             else{
-                A_time->tm_min = 59;
+                A_time.tm_min = 59;
             }
             C_flicker = Z_flicker;
         }
@@ -394,22 +448,22 @@
     case setHore:
         if(sw.checkEdgeOn(upSw) == 1){
             beep();
-            if(A_time->tm_hour < 23){
-                A_time->tm_hour++;
+            if(A_time.tm_hour < 23){
+                A_time.tm_hour++;
             }
             else{
-                A_time->tm_hour = 0;
+                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--;
+             if(A_time.tm_hour > 0){
+                A_time.tm_hour--;
             }
             else{
-                A_time->tm_hour = 23;
+                A_time.tm_hour = 23;
             }
             C_flicker = Z_flicker;
         }
@@ -428,7 +482,7 @@
 // seven segment display
 //==========================
 void sevenSegDisplay(void){
-    int16_t work;
+//    int16_t work;
     
     switch(M_timer){
     case stop:
@@ -448,10 +502,10 @@
     case setMin:    // setHore to onaji
     case setHore:
         sevenSegLed.smoothSet(1);   // hyoji hard
-        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_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)){
@@ -473,20 +527,20 @@
         break;
     case count:
         sevenSegLed.smoothSet(0);   // hyoji smooth
-        seconds = time(NULL);
-        A_time = localtime(&seconds);
+ //       seconds = time(NULL);
+        A_time = ss_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_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_dot[0] = 0;
         D_dot[1] = 1;
         D_dot[2] = 0;
 
         // byo no dot no tenmetu   
-        if((A_time->tm_sec % 2) == 0){
+        if((A_time.tm_sec % 2) == 0){
             D_dot[3] = 0;
         }
         else{
@@ -506,6 +560,7 @@
 void interrupt100ms(void){
     static uint8_t C_100ms = 0;
     
+   
     C_100ms++;
     if(C_100ms > 9){C_100ms = 0;}
     
@@ -519,8 +574,9 @@
     if(C_flicker > 0){C_flicker--;}
 
     // timer counter decrement
-    if((C_100ms == 0) && (C_timerSec > 0)){C_timerSec--;}        
-
+    if(C_100ms == 0){
+        rtc_count();
+    }
 }
 
 //================================
--- a/mbed.bld	Sun Apr 22 11:30:33 2012 +0000
+++ b/mbed.bld	Sun Dec 01 00:45:55 2013 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/078e4b97a13e
+http://mbed.org/users/mbed_official/code/mbed/builds/673126e12c73
\ No newline at end of file