キッチンタイマーのプログラムです
Dependencies: mbed SevenSegLed Sound_pwmToDig SwAnalog
回路やプログラムについての詳しい説明は、下記のblogにまとめました。 http://suupen-make.blogspot.jp/2013/11/lpc1114fn28mbedkitchen-timer.html
Diff: main.cpp
- Revision:
- 0:032a7d6c30d8
- Child:
- 1:f638c70e028c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jan 08 22:52:20 2012 +0000 @@ -0,0 +1,516 @@ +//=========================================================================== +// mbed seven segment LED PCB board example program +// +// kitchen timer +// +// <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, 1, 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 + +void beep(void){ +// tone1 + Sound::sound_t oto = {1,0x95,200,100}; + 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) +}; + +//============================= +// timer SW seni +//============================= +void timerSeni(void){ + + // bSw(stop SW) + if(sw.checkEdgeOn(bSw) == 1){ + beep(); + M_timer = stop; + } + + // aSw(start SW) + if((sw.checkEdgeOn(aSw) == 1) + &&(M_timer != count) + ){ + beep(); + M_timer = count; + C_timerSec = D_timerSec; + } + + 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; + } + 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: + if(C_timerSec == 0){ + M_timer = chime; + } + break; + + case chime: + if(sound.sound_sound() == false){ + 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){ + work = D_timerSec / 60; + if(work < 99){ + beep(); + D_timerSec += 60; + C_flicker = Z_flicker; + } + } + + if(sw.checkEdgeOn(downSw) == 1){ + work = D_timerSec / 60; + if (work > 0){ + beep(); + D_timerSec -= 60; + C_flicker = Z_flicker; + } + } + break; + case set10min: + if(sw.checkEdgeOn(upSw) == 1){ + if(D_timerSec <= (98 * 60)){ + beep(); + D_timerSec += 600; + C_flicker = Z_flicker; + } + } + + if(sw.checkEdgeOn(downSw) == 1){ + if(D_timerSec >= 600){ + beep(); + D_timerSec -= 600; + C_flicker = Z_flicker; + } + } + break; + case count: + break; + case chime: + break; + case timeup: + break; + default: + break; + } + + if(D_timerSec > (99 * 60)){D_timerSec = 99 * 60;} +} + +//========================== +// seven segment display +//========================== +void sevenSegDisplay(void){ + int16_t work; + + switch(M_timer){ + case stop: + work = D_timerSec / 600; + if(work == 0){D_7seg[0] = 0x10;} + else{D_7seg[0] = work;} + + work = D_timerSec / 60; + work %= 10; + D_7seg[1] = work; + + D_7seg[2] = 0x10; + D_7seg[3] = 0x10; + + + D_dot[0] = 0; + D_dot[1] = 1; + D_dot[2] = 0; + D_dot[3] = 0; + + break; + case set1min: + case set10min: + work = D_timerSec / 600; + if(work == 0){ + if(M_timer == set10min){ + D_7seg[0] = work; + } + else{ + D_7seg[0] = 0x10; + } + } + else{ + D_7seg[0] = work; + } + + work = D_timerSec / 60; + work %= 10; + D_7seg[1] = work; + + if((C_flicker == 0) && (F_flip500ms == 0)){ + if(M_timer == set1min){ + D_7seg[1] = 0x10; + } + else{ + D_7seg[0] = 0x10; + } + } + + D_7seg[2] = 0x10; + D_7seg[3] = 0x10; + + D_dot[0] = 0; + D_dot[1] = 1; + D_dot[2] = 0; + D_dot[3] = 0; + + break; + case count: + work = C_timerSec / 600; + if(work == 0){D_7seg[0] = 0x10;} + else{D_7seg[0] = work;} + + work = C_timerSec / 60; + work %= 10; + D_7seg[1] = work; + + work = C_timerSec % 60; + work /= 10; + D_7seg[2] = work; + + work = C_timerSec % 60; + work %= 10; + D_7seg[3] = work; + + D_dot[0] = 0; + D_dot[1] = 1; + D_dot[2] = 0; + D_dot[3] = 0; + + break; + case chime: // same "timeup" + 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 + + 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; + } + */ + + } +}