キッチンタイマーのプログラムです

Dependencies:   mbed SevenSegLed Sound_pwmToDig SwAnalog

回路やプログラムについての詳しい説明は、下記のblogにまとめました。 http://suupen-make.blogspot.jp/2013/11/lpc1114fn28mbedkitchen-timer.html

main.cpp

Committer:
suupen
Date:
2012-01-08
Revision:
0:032a7d6c30d8
Child:
1:f638c70e028c

File content as of revision 0:032a7d6c30d8:

//===========================================================================
// 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;
        }
 */       
 
    }
}