This program is a clock that uses a kitchen Timer boad.
Dependencies: SevenSegLed Sound_pwmToDig SwAnalog mbed
Fork of kitchenTimer_Clock by
LPC1114FN28(mbed)を使ったデジタル時計
<概要>
以前作成したLPC1114FN28(mbed)で作ったキッチンタイマーのプログラムを変更して、デジタル時計をつくりました。
回路はキッチンタイマーのものをそのまま使っています。基板作成や、プログラムの書き込み方法については、次のblogを参照してください。
回路図、PCB、WINSTAR PCB for iModela、などのデータはこちらからダウンロードできます。
<時計動作の説明>
基板の電源を入れると、表示が“FFFF”になり、メロディーが流れます。
スイッチは、 右上(赤)SW :時計時刻設定の開始・完了 右下(青)SW :時計時刻設定のキャンセル 左(黒)十字SW:時計時刻変更用 となっています。
デジタル時計のLED,SWの説明
時刻あわせをする場合は、赤色SWを押して時刻設定モードにしてから、十字SWで時刻を変更し、再度赤色SWを押すと時刻確定して、時計動作を始めます。
時計設定をやめたいときは、青色SWを押します。
時計計時は、4桁の7セグメントLEDで、時・分表示をします。秒は、一番右側のドットLEDの点滅で表示しています。
ドットや、数字の変化は、滑らかに変化させています。
毎正時(59から00分に変化)した時に、メロディーを流します。
<プログラムについて>
プログラムは、こちらからからダウンロードできます。
Diff: main.cpp
- Revision:
- 2:04062925e025
- Parent:
- 1:fe97b047f96b
diff -r fe97b047f96b -r 04062925e025 main.cpp --- 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(); + } } //================================