trabajo de creacion de un despertador por i2c configurado por un encoder

Dependencies:   DebouncedIn QEI RTC-DS1307 mbed

Fork of I2C by German Camilo Diaz Mejia

main.cpp

Committer:
GermanD
Date:
2015-11-20
Revision:
4:fa48e78e9bba
Parent:
3:9e5e0b8d0e2a
Child:
5:d38b972a1813

File content as of revision 4:fa48e78e9bba:

#include "mbed.h"
#include "Rtc_Ds1307.h"
#include "DebouncedIn.h" 
#include "QEI.h"
 
Rtc_Ds1307 rtc(PTE0,PTE1);        //Puertos para el modulo
Serial pc(USBTX, USBRX, "pc");    //Puertos para el PC
QEI wheel (PTD5, PTD0, NC, 100);  //Configuracion encoder
DebouncedIn Boton(PTA13);        //Boton Encoder
DigitalOut led1(LED1);          //Salida

int Dia=0;
int Mes=0;
int Anio=2015;
int Horas=0;
int Minutos=0;
int Segundos=0;
 
char buffer[128];
int readptr = 0;
 
int main() 
    {
    char c;
    Rtc_Ds1307::Time_rtc tm = {};
    
    while(1) 
    {      
    pc.printf("*************************************\n");
    pc.printf("* Menu for RTC Test :               *\n");
    pc.printf("* read  - reads the clock           *\n");
    pc.printf("* start - start the clock           *\n");
    pc.printf("* stop  - stop the clock            *\n");
    pc.printf("* write - write the clock           *\n");
    pc.printf("* ena   - enable Square wave output *\n");
    pc.printf("* dis   - disable square wave outp. *\n");
    pc.printf("*************************************\n");
        
        while( (c = pc.getc()) != '\n')
        {
        buffer[readptr++] = c;
        }
        buffer[readptr++] = 0;
            if (strncmp(buffer, "read", 4) == 0) 
            {
            pc.printf("Performing read operation\n");
                if (rtc.getTime(tm) ) 
                {
                pc.printf("La hora actual es: %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec);
                pc.printf("La fecha actual es: %s, %02d/%02d/%04d\n", rtc.weekdayToString(tm.wday), tm.mon, tm.date, tm.year);
                }
            
             }   
        else if (strncmp(buffer, "write", 5) == 0) 
            {
            pc.printf("Dia (0..31)");
            pc.scanf("%d", &tm.date);
            pc.printf("Mes (1..12)");
            pc.scanf("%d", &tm.mon);
            pc.printf("Anno");
            pc.scanf("%d", &tm.year);
            pc.printf("Hora (0..23)");
            pc.scanf("%d", &tm.hour);
            pc.printf("Minutos (0..59)");
            pc.scanf("%d", &tm.min);
            pc.printf("Segundos (0..59)");
            pc.scanf("%d", &tm.sec);
            pc.printf("Performing write operation\n");
            
            while(pc.readable()) 
            pc.getc();
            rtc.setTime(tm, false, false);
            }
        else if (strncmp(buffer, "start", 5) == 0) 
            {
            readptr = 0;
            pc.printf("Dispositivo Iniciado\n");
            rtc.startClock();
            goto set_alarma;
                        
        }
        else if (strncmp(buffer, "stop", 4) == 0) 
        {
            pc.printf("Performing stop operation\n");
            rtc.stopClock();
        }
        else if (strncmp(buffer, "ena", 3) == 0) 
        {
            int rs;
            pc.printf("Please specify the frequency : [0 = 1Hz, 1 = 4.096kHz, 2 = 8.192kHz, 3 = 32.768kHz] ");
            scanf("%d", &rs);
            pc.printf("Enabling the output with %d option\n", rs);
            rtc.setSquareWaveOutput(true, (Rtc_Ds1307::SqwRateSelect_t)rs);
        }
        else if (strncmp(buffer, "dis", 3) == 0)
        {
            pc.printf("Disableing square wave output\n");
            rtc.setSquareWaveOutput(false, Rtc_Ds1307::RS1Hz);
        }
        else 
        {
            pc.printf("syntax error\n");
        }
        readptr = 0;
        }
                
        set_alarma:          //se inicia a configurar la alarma
        pc.printf("Configuracion de la alarma\n");
        
        
        set_Dia:             //empieza con el dia 
        while(1)
        {         
            Dia=Dia+wheel.getPulses();  //con el encoder se aumenta el dia 
            wheel.reset();
     
            if(Dia>=31)
            {               //como el dia no tiene mas de 31 dias, se mantiene en 31 al ingresar un valor diferente
            Dia=31;
            }
            else if (Dia<=0)
            {          //no hay dias negativos, el valor se mantiene en 0 en caso de ingresar uno asi
             Dia=0;
            }
     pc.printf("Dia=  %d\n",Dia);        //muestra
    
    
    if(Boton.falling())
    {              //con el enconder presionado pasamos a mes
    goto set_Mes;
    }
    }
        
set_Mes:                           //Configuracion del Mes para la alarma

        while(1)
        {
         
        Mes=Mes+wheel.getPulses();     //con el encoder aumentamos el mes 
        wheel.reset();
        
        if(Mes>=12)
        {                   //maximo a 12 meses si es mayor, matiene a 12
                Mes=12;
            }
            else if (Mes<=0)
            {              //de igual forma mantiene en 0 a un valor menor
             Mes=0;
            }
     pc.printf("Mes=  %d\n ",Mes);          //muestra el mes
    
    
    if(Boton.falling())
    {
        goto set_Anio;
    }
    
            
    }
     set_Anio:
        while(1)
        {         
            Anio=Anio+wheel.getPulses();
            wheel.reset();
 
     
            if(Anio>=3000) //se mantiene hasta el anio 3000 si se ingresa un anio mas grande
            {
                Anio=3000;
            }
            else if (Anio<=2015){ //como estamos en el 2015 una alarma no puede sonar antes de esa fecha
             Anio=2015;
            }
     pc.printf("Anno=  %d\n",Anio);
    
    
    if(Boton.falling())
    {
        goto set_Horas;
    }
        
    }
    set_Horas:
        while(1)
        {
        
        Horas=Horas+wheel.getPulses();
            wheel.reset();
        
     
            if(Horas>=23)
            {
                Horas=23;
            }
            else if (Horas<=0)
            {
             Horas=0;
            }
     pc.printf(" Hora=%d\n ",Horas);
    
    
    if(Boton.falling()){
        goto set_Minutos;
    }
            
            
    }
     set_Minutos:
        while(1)
        {
         
            Minutos=Minutos+wheel.getPulses();
            wheel.reset();
     
     
            if(Minutos>=59)
            {
                Minutos=59;
            }
            else if (Horas<=0)
            {
             Minutos=0;
            }
     pc.printf(" Min=%d\n ",Minutos);
    
    
    if(Boton.falling())
    {
        goto set_comp;
    }
   
    }
    
    set_comp:
    
    pc.printf("La alarma se programara el:   \n");
    pc.printf(" Dia=%d    Mes=%d    Anio=%d    Hora=%d    Min=%d    Seg=%d\n ",Dia,Mes,Anio,Horas,Minutos,Segundos);
    
    while(1)
    {
       rtc.getTime(tm);
       pc.printf("La hora actual es:  %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec);
       pc.printf("La fecha actual es:  %02d/%02d/%04d\n", tm.mon, tm.date, tm.year);
    if(tm.hour>=Horas && tm.min>=Minutos &&tm.sec>=Segundos && tm.mon>=Mes && tm.date>=Dia && tm.year>=Anio){
        led1=0;
        pc.printf("La alarma se ha activado:   \n");
    }
    else {
        led1=1;
        }
        wait(1);
    } 
    }