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:
2:04062925e025
Parent:
1:fe97b047f96b
--- 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();
+    }
 }
 
 //================================