iModela(iM-01) de sakusei sita PCB no kitchenTimer wo clock ni henko sita monodesu.
Dependencies: SevenSegLed SwDigital mbed Sound
main.cpp
- Committer:
- suupen
- Date:
- 2012-04-08
- Revision:
- 0:b7cdbc649bd3
- Child:
- 1:fe97b047f96b
File content as of revision 0:b7cdbc649bd3:
//#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; } */ } }