Reloj con alarma y snooze

Dependencies:   RTC-DS1307-Modificada TextLCD mbed QEI

/media/uploads/Susanaranjo/img_20160519_141804.jpg

main.cpp

Committer:
Susanaranjo
Date:
2016-05-19
Revision:
2:32f3a407a8ea
Parent:
0:1c2ae7e04432

File content as of revision 2:32f3a407a8ea:

#include "mbed.h"
#include "Rtc_Ds1307.h"
#include "TextLCD.h"
#include "QEI.h"

//Configuración de la pantalla
TextLCD lcd(PTE20,PTE21,PTE22,PTE23,PTE29,PTE30, TextLCD::LCD16x2); //Rs, E, d4, d5, d6, d7

//Configuración del reloj
Rtc_Ds1307 rtc(PTE0, PTE1); // SDA, SCL

//Configuración del puerto
Serial pc(USBTX, USBRX, "pc");

//Configuración del encoder
QEI encoder(PTD5, PTD0, NC,624);

DigitalIn alarma(PTC12);
DigitalIn snooze(PTC13); 
DigitalIn alarmaE(PTC16);
PwmOut speaker(PTA13);


char buffer[128];
int readptr = 0;
int hora=0;
int hora2=0;
int minutos=0;
int minutos2=0;
int seg=0;
int seg2=0;
int mes=0; 
int mes2=0;
int fecha=0; 
int fecha2=0;
int anno=0;
int anno2=0;
int pulsador;
int pulsador2;
int a=0;
int b=0;
int pulsos=0;
int diferencia=0;
int alarma2=0;


int main()
{
    char c;
    Rtc_Ds1307::Time_rtc tm = {};

    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("Configurando");
    lcd.locate(0,1);
    lcd.printf("el reloj");

    pc.printf("*************************************\n");
    pc.printf("*       Configurar el reloj         *\n");
    pc.printf("*************************************\n");

    while(1) {


        pc.printf("Ingrese la fecha (entre 1 y 31)");
        pc.scanf("%d", &tm.date);
        pc.printf("Ingrese el mes (entre 1 y 12)");
        pc.scanf("%d", &tm.mon);
        pc.printf("Ingrese el anno (ejemplo: 2016)");
        pc.scanf("%d", &tm.year);
        pc.printf("Ingrese la hora (entre 0 y 23)");
        pc.scanf("%d", &tm.hour);
        pc.printf("Ingrese los minutos (entre 0 y 59)");
        pc.scanf("%d", &tm.min);
        pc.printf("Ingrese los segundos (entre 0 y 59)");
        pc.scanf("%d", &tm.sec);
        pc.printf("Ingrese el dia (siendo Domingo=1)");
        pc.scanf("%d", &tm.wday);
        pc.printf("*************************************\n");
        pc.printf("Configurando el reloj\n");
       
        
        while(pc.readable()) {
            pc.getc();
            rtc.setTime(tm, false, false);}

        wait_ms(200);

        pc.printf("Inicializando el reloj\n");
        rtc.startClock();
  
        wait_ms(200);

        pc.printf("Leyendo el reloj\n");

loop1:     if (rtc.getTime(tm) ) {
           pulsador=alarma.read();
           
           a=(abs(tm.hour-hora))+(abs(tm.min-minutos))+(abs(tm.sec-seg))+(abs(tm.mon-mes))+(abs(tm.date-fecha))+(abs(tm.year-anno)); // Compara la hora y la fecha actual con la fecha y hora de la alarma
           b=(abs(tm.hour-hora2))+(abs(tm.min-minutos2))+(abs(tm.sec-seg2))+(abs(tm.mon-mes2))+(abs(tm.date-fecha2))+(abs(tm.year-anno2)); // Compara la hora y la fecha actual con la fecha y hora de la alarma
           
           //pc.printf("%d\n",a);
           
           if (a*b==0)
           {
loop3:      lcd.cls();
            lcd.printf("ALARMA");
            pc.printf("*************************************\n");
            pc.printf("*               ALARMA              *\n");
            pc.printf("*************************************\n");
            speaker.period(1.0/500.0);
            speaker=0.5;
            
loop4:      pulsador2=snooze.read(); // Estado del pulsador para detener o posponer la alarma
            
            if (pulsador2==0){            
            speaker=0.0;
            pc.printf("Pulsar 5 segundos para detener\n");
            lcd.cls();
            lcd.printf("Mantenga pulsado");
            lcd.locate(0,1);
            lcd.printf("para detener");
            wait(5); 
            pulsador2=snooze.read();
            if (pulsador2==0){ // Si despues de 5 segundos el pulsador todavia está oprimido, se detiene la alarma
                lcd.cls();
                lcd.printf("Alarma");
                lcd.locate(0,1);
                lcd.printf("desactivada");
                pc.printf("*************************************\n");
                pc.printf("*           Alarma desactivada      *\n");
                pc.printf("*************************************\n");
                wait(2);
                goto loop1;   
                }else{ // Si el pulsador ya no está oprimido, se pospone la alarma un minuto
                lcd.cls();
                lcd.printf("Snooze");
                pc.printf("*************************************\n");
                pc.printf("*           Snooze                  *\n");
                pc.printf("*************************************\n");
                wait(60);
                goto loop3;     
                   } 
                        
             }else {
               goto loop4;  }
             }
             
            //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 (pulsador==0) {
                lcd.cls();
                lcd.printf("Ver/Configurar");
                lcd.locate(0,1);
                lcd.printf("alarma");
                pc.printf("*************************************\n");
                pc.printf("* alarma  - configurar alarma       *\n");
                pc.printf("* ver     - ver alarma              *\n");
                pc.printf("*************************************\n");

loop2:          readptr = 0;
               
               //Obtengo la cadena de caracteres correspondiente a la orden
               
                while( (c = pc.getc()) != '\n') {
                buffer[readptr++] = c; }
                buffer[readptr++] = 0;

               // Configurar alarma desde el computador  
                if (strncmp(buffer, "alarma", 6) == 0) {
                    
                    lcd.cls();
                    lcd.printf("Configurando");
                    lcd.locate(0,1);
                    lcd.printf("alarma");
                    pc.printf("*************************************\n");
                    pc.printf("*             Nueva alarma          *\n");
                    pc.printf("Fecha de la alarma  (0..31)");
                    pc.scanf("%d", &fecha);
                    pc.printf("Mes de la alarma (1..12)");
                    pc.scanf("%d", &mes);
                    pc.printf("Anno de la alarma");
                    pc.scanf("%d", &anno);
                    pc.printf("Hora de la alarma (0..23)");
                    pc.scanf("%d", &hora);
                    pc.printf("Minutos de la alarma (0..59)");
                    pc.scanf("%d",&minutos);
                    pc.printf("Segundos de la alarma (0..59)");
                    pc.scanf("%d", &seg);
                    pc.printf("*      Fin de la configuracion      *\n");
                    pc.printf("*************************************\n");
                    lcd.cls();
                    lcd.printf("Fin de la configuracion");
                    wait_ms(500);
                    goto loop1;
                    
                } else if (strncmp(buffer, "ver", 3) == 0) {
                    
                    if(anno==0){
                    pc.printf("No hay alarma 1\n");
                    lcd.cls();
                    lcd.printf("No hay alarma 1");
                    wait_ms(500);    
                     }else{
                    pc.printf("Hora de la alarma : %02d:%02d:%02d\n", hora, minutos, seg);
                    pc.printf("Fecha de la alarma : %02d/%02d/%04d\n", fecha, mes, anno);
                    lcd.cls();
                    lcd.printf("Alarma 1");
                    wait (1);
                    lcd.printf("%02d:%02d:%02d", hora, minutos, seg);
                    lcd.locate(0,1);
                    lcd.printf("%02d:%02d:%02d", fecha, mes, anno);
                    wait(2);}
                    
                    if(alarma2==0){
                    pc.printf("No hay alarma 2\n");
                    lcd.locate(0,1);
                    lcd.printf("No hay alarma 2");
                    wait_ms(500);    
                     }else{
                    pc.printf("Hora de la alarma 2 : %02d:%02d:%02d\n", hora2, minutos2, seg2);
                    pc.printf("Fecha de la alarma 2: %02d/%02d/%04d\n", fecha2, mes2, anno2);
                    lcd.cls();
                    lcd.printf("Alarma 2");
                    wait (1);
                    lcd.printf("%02d:%02d:%02d", hora2, minutos2, seg2);
                    lcd.locate(0,1);
                    lcd.printf("%02d:%02d:%02d", fecha2, mes2, anno2);
                    wait(2);}
                    
                                       
                    goto loop1;
                    
                } else {
                    goto loop2;
                }


            } 
            
            // Configura alarma con encoder
            else if (alarmaE==0){
            pc.printf("*    Configurar alarma con encoder     *\n");
            lcd.cls();
            lcd.printf("Alarma con");
            lcd.locate(0,1);
            lcd.printf("encoder");
            wait (1);
 
 
 //Configuración fecha             
            
            pc.printf("Fecha de la alarma:\n");
            lcd.cls();
            lcd.printf("Fecha");
            
loop5:      diferencia=encoder.getPulses()-pulsos;
            pulsos=encoder.getPulses();
            if (!alarmaE){
            pc.printf("\n");     
            pc.printf("Mes de la alarma:\n"); 
            lcd.cls();
            lcd.printf("Mes");
            diferencia=0;
            pulsos=0; 
            wait(1);
            goto loop6;  
                }else{
            if (diferencia==0){
             wait(0.1);
            goto loop5;                    
                }else if (diferencia+fecha2>=31){
                fecha2=31;
                  pc.printf("%02d\n", fecha2);
                  lcd.locate(0,1);
                  lcd.printf("%02d",fecha2);
                  wait(0.1);
                  goto loop5;
                  }else if(diferencia+fecha2<1)   {
                    fecha2=1;
                  pc.printf("%02d\n", fecha2);
                  lcd.locate(0,1);
                  lcd.printf("%02d",fecha2);
                  wait(0.1);
                  goto loop5;
                    }else{
                   fecha2+=diferencia;
                   pc.printf("%02d\n", fecha2);
                   lcd.locate(0,1);
                   lcd.printf("%02d",fecha2);
                   wait(0.1);
                   goto loop5; 
            }}
 
 
 
 //Configuración mes    
 
 
 loop6:     diferencia=encoder.getPulses()-pulsos;
            pulsos=encoder.getPulses();
            if (!alarmaE){
            pc.printf("\n");     
            pc.printf("Anno de la alarma:\n"); 
            lcd.cls();
            lcd.printf("Anno");
            diferencia=0;
            pulsos=0; 
            wait(1);
            goto loop7;  
                }else{
            if (diferencia==0){
             wait(0.1);
            goto loop6;                    
                }else if (diferencia+mes2>=12){
                mes2=12;
                  pc.printf("%02d\n", mes2);
                  lcd.locate(0,1);
                  lcd.printf("%02d",mes2);
                  wait(0.1);
                  goto loop6;
                  }else if(diferencia+mes2<1)   {
                    mes2=1;
                  pc.printf("%02d\n", mes2);
                  lcd.locate(0,1);
                  lcd.printf("%02d",mes2);
                  wait(0.1);
                  goto loop6;
                    }else{
                   mes2+=diferencia;
                   pc.printf("%02d\n", mes2);
                   lcd.locate(0,1);
                   lcd.printf("%02d",mes2);
                   wait(0.1);
                   goto loop6 ; 
            }}
 
 
 
 //Configuración año
 loop7:     diferencia=encoder.getPulses()-pulsos;
            pulsos=encoder.getPulses();
            if (!alarmaE){
            pc.printf("\n");     
            pc.printf("Hora de la alarma:\n"); 
            lcd.cls();
            lcd.printf("Hora");
            diferencia=0;
            pulsos=0; 
            wait(1);
            goto loop8;  
                }else{
            if (diferencia==0){
             wait(0.1);
            goto loop7;                    
                }else if (diferencia+anno2>=2255){
                anno2=2255;
                  pc.printf("%04d\n", anno2);
                  lcd.locate(0,1);
                  lcd.printf("%04d", anno2);
                  wait(0.1);
                  goto loop7;
                  }else if(diferencia+anno2<2000)   {
                    anno2=2000;
                  pc.printf("%04d\n", anno2);
                  lcd.locate(0,1);
                  lcd.printf("%04d",anno2);
                  wait(0.1);
                  goto loop7;
                    }else{
                   anno2+=diferencia;
                   pc.printf("%04d\n", anno2);
                   lcd.locate(0,1);
                   lcd.printf("%04d",anno2);
                   wait(0.1);
                   goto loop7 ; 
            }}
 
 
 //Configuración hora
 
 
 loop8:     diferencia=encoder.getPulses()-pulsos;
            pulsos=encoder.getPulses();
            if (!alarmaE){
            pc.printf("\n");     
            pc.printf("Minutos de la alarma:\n"); 
            lcd.cls();
            lcd.printf("Minutos");
            diferencia=0;
            pulsos=0; 
            wait(1);
            goto loop9;  
                }else{
            if (diferencia==0){
             wait(0.1);
            goto loop8;                    
                }else if (diferencia+hora2>=23){
                hora2=23;
                  pc.printf("%02d\n", hora2);
                  lcd.locate(0,1);
                  lcd.printf("%02d", hora2);
                  wait(0.1);
                  goto loop8;
                  }else if(diferencia+hora2<0)   {
                    hora2=0;
                  pc.printf("%02d\n", hora2);
                  lcd.locate(0,1);
                  lcd.printf("%02d",hora2);
                  wait(0.1);
                  goto loop8;
                    }else{
                   hora2+=diferencia;
                   pc.printf("%02d\n", hora2);
                   lcd.locate(0,1);
                   lcd.printf("%02d",hora2);
                   wait(0.1);
                   goto loop8 ; 
            }}
 
 //Configuración minutos     
loop9:      diferencia=encoder.getPulses()-pulsos;
            pulsos=encoder.getPulses();
            if (!alarmaE){
            pc.printf("\n");     
            pc.printf("Segundos de la alarma:\n"); 
            lcd.cls();
            lcd.printf("Segundos");
            diferencia=0;
            pulsos=0; 
            wait(1);
            goto loop10;  
                }else{
            if (diferencia==0){
             wait(0.1);
            goto loop9;                    
                }else if (diferencia+minutos2>=59){
                minutos2=59;
                  pc.printf("%02d\n", minutos2);
                  lcd.locate(0,1);
                  lcd.printf("%02d", minutos2);
                  wait(0.1);
                  goto loop9;
                  }else if(diferencia+minutos2<0)   {
                    minutos2=0;
                  pc.printf("%02d\n", minutos2);
                  lcd.locate(0,1);
                  lcd.printf("%02d",minutos2);
                  wait(0.1);
                  goto loop9;
                    }else{
                   minutos2+=diferencia;
                   pc.printf("%02d\n", minutos2);
                   lcd.locate(0,1);
                   lcd.printf("%02d",minutos2);
                   wait(0.1);
                   goto loop9 ; 
            }}

//Configuración segundos

loop10:      diferencia=encoder.getPulses()-pulsos;
            pulsos=encoder.getPulses();
            if (!alarmaE){
            pc.printf("\n");     
            pc.printf("*    Fin de la configuracion    *\n"); 
            lcd.cls();
            lcd.printf("Fin de la configuracion");
            diferencia=0;
            pulsos=0; 
            alarma2=1;
            wait(1);
            goto loop1;  
                }else{
            if (diferencia==0){
             wait(0.1);
            goto loop10;                    
                }else if (diferencia+seg2>=59){
                seg2=59;
                  pc.printf("%02d\n", seg2);
                  lcd.locate(0,1);
                  lcd.printf("%02d", seg2);
                  wait(0.1);
                  goto loop10;
                  }else if(diferencia+seg2<0)   {
                    seg2=0;
                  pc.printf("%02d\n", seg2);
                  lcd.locate(0,1);
                  lcd.printf("%02d",seg2);
                  wait(0.1);
                  goto loop10;
                    }else{
                   seg2+=diferencia;
                   pc.printf("%02d\n", seg2);
                   lcd.locate(0,1);
                   lcd.printf("%02d",seg2);
                   wait(0.1);
                   goto loop10 ; 
            }}

           
            }else {
                //Actualizo la hora y la fecha
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("%02d:%02d:%02d", tm.hour, tm.min, tm.sec);
                lcd.locate(0,1);
                lcd.printf("%s/%02d/%02d/%4d", rtc.weekdayToString(tm.wday), tm.date, tm.mon, tm.year);
                wait_ms(200);
                goto loop1;
            }//else
        }



    }// while (1)
}// main