iModela(iM-01) de sakusei sita PCB no kitchenTimer wo clock ni henko sita monodesu.
Dependencies: SevenSegLed SwDigital mbed Sound
Diff: main.cpp
- Revision:
- 0:b7cdbc649bd3
- Child:
- 1:fe97b047f96b
diff -r 000000000000 -r b7cdbc649bd3 main.cpp --- /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; + } + */ + + } +}