gabriel jaime useche ossa / Mbed 2 deprecated Tarea_Alarma

Dependencies:   DebouncedIn QEI TextLCD mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "Rtc_Ds1307.h"
00003 #include "TextLCD.h"
00004 #include "DebouncedIn.h" 
00005 #include "QEI.h" 
00006 
00007 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
00008 //RtcCls rtc(p28, p27, p29, true);
00009 Rtc_Ds1307 rtc(PTE0, PTE1);
00010  
00011 Serial pc(USBTX, USBRX, "pc");
00012  
00013 QEI wheel (PTA13, PTD5, NC, 100); // Puertos del encoder
00014  
00015 //Se programan los botones 
00016 DebouncedIn BotonENC(PTC17); // botón propio del encoder 
00017 DebouncedIn Boton2(PTE31);   // boton utilizado para confirmar
00018  
00019 //Salidas digitales para el uso de leds, los cuales simulan el sonido de la alarma
00020 DigitalOut myled(PTE20);
00021 DigitalOut myled2(PTE21);
00022 
00023 //Se inicializan las variables
00024 int dia = 1,mes = 1,ano = 2016,hh = 0,mm = 0,ss = 0;
00025 char buffer[128];
00026 int readptr = 0;
00027 int start = 0;
00028 int Config;
00029 int contador = 0;
00030 
00031  
00032 int main() {
00033     char c;
00034     Rtc_Ds1307::Time_rtc tm = {};
00035     
00036     while(1) {
00037         set_reloj:           
00038         pc.printf("*************************************\n");
00039         pc.printf("* Menu for RTC Test :               *\n");
00040         pc.printf("* read  - reads the clock           *\n");
00041         pc.printf("* start - start the clock           *\n");
00042         pc.printf("* stop  - stop the clock            *\n");
00043         pc.printf("* write - write the clock           *\n");
00044         pc.printf("*************************************\n");
00045         
00046         while( (c = pc.getc()) != '\n') {
00047             buffer[readptr++] = c;
00048         }
00049         buffer[readptr++] = 0;
00050         if (strncmp(buffer, "read", 4) == 0) {
00051               //perform read
00052             pc.printf("Lectura del reloj\n");
00053             
00054 lop1:   if (rtc.getTime(tm) ) {
00055             
00056             pc.printf("La hora actual es : %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec); // Me entrega la hora actual
00057             pc.printf("La fecha actual es : %s, %02d/%02d/%04d\n", rtc.weekdayToString(tm.wday), tm.mon, tm.date, tm.year); // Me entrega la fecha actual
00058           
00059            lcd.cls();
00060                 lcd.locate(0,0);
00061                 lcd.printf("%02d:%02d:%02d", tm.hour, tm.min, tm.sec); // Me entrega la hora actual
00062                 lcd.locate(0,1);
00063                 lcd.printf("%s/%02d/%02d/%4d", rtc.weekdayToString(tm.wday), tm.date, tm.mon, tm.year);// Me entrega la fecha actual
00064                 wait_ms(200); 
00065                 if(BotonENC.falling()){
00066                     goto set_prev;
00067                     }           
00068                 goto lop1;
00069             }
00070             
00071         }
00072         else if (strncmp(buffer, "write", 5) == 0) {
00073             // Se despliega el siguiente menú para configurar fecha y hora actual
00074             
00075             pc.printf("Ingrese el dia (fecha 1..31):");// Se pide ingresar un número del 1 al 31 equivalente al día del mes
00076             pc.scanf("%d", &tm.date);
00077             pc.printf("Ingrese el mes (mes 1..12):");  // se pide ingresar un valor entre 1 y 12 que representa el mes  
00078             pc.scanf("%d", &tm.mon);
00079             pc.printf("Ingrese el ano (2016):");        // a continuación se ingresa el valor del año
00080             pc.scanf("%d", &tm.year);
00081             pc.printf("Ingrese la hora (horas 0..23):");// Luego se ingresa la hora en formato 24 horas
00082             pc.scanf("%d", &tm.hour);
00083             pc.printf("Ingrese los minutos (minutos 0..59):");// Se ingresan los minutos
00084             pc.scanf("%d", &tm.min);
00085             pc.printf("Ingrese los segundos (segundos 0..59)"); //Y por último los segundos (cualquier valor, ya que es díficil su precisión)
00086             pc.scanf("%d", &tm.sec);
00087             pc.printf("Ingrese el dia(Sab=0, Dom=1, Lun=2, Mar=3, Mier=4, Juev=5, Vier=6):");
00088             pc.scanf("%d", &tm.wday);
00089             pc.printf("Realizando la operacion... Por favor espere\n"); // Se espera la configuración de esos valores
00090             
00091             while(pc.readable()) 
00092                 pc.getc();
00093             rtc.setTime(tm, false, false);
00094         }
00095         else if (strncmp(buffer, "start", 5) == 0) {
00096             // start
00097             readptr = 0;
00098             lcd.cls();
00099                 lcd.locate(0,0);
00100                 lcd.printf("Dispositivo");
00101                 lcd.locate(0,1);
00102                 lcd.printf("Iniciado");
00103             pc.printf("Dispositivo Iniciado\n");
00104             rtc.startClock();          
00105             
00106         }
00107         else if (strncmp(buffer, "stop", 4) == 0) {
00108             //  stop
00109             pc.printf("Dispositivo detenido\n");
00110             rtc.stopClock();
00111         }
00112         else {
00113             pc.printf("syntax error\n");
00114         }
00115         readptr = 0;
00116         }
00117 
00118         set_prev: /// Función de verificación, se usa para confirmar la hora y  fecha del reloj y luego pasar a configurar la hora
00119         
00120         pc.printf("Es correcto? Si = 1  No = 2\n"); // se habilita esta opción para que el usuario 
00121         pc.scanf("%d", &Config);                           // verifique si la configuración ingresada es correcta o no
00122         
00123         if (Config == 2){                // Si se presiona 2, hubo errores en la configuración
00124             readptr = 0;
00125             goto set_reloj;             // se regresa a la función set_reloj para volver a configurar
00126             }
00127         
00128                   
00129         else if (Config == 1){           // se si presiona 1, la configuración fue correcta
00130              
00131              pc.printf("Dispositivo Configurado Correctamente  Espere ....\n"); // se espera un tiempo
00132              wait(3);
00133              goto set_alarma;           // y se va a la función correspondiente a la alarma
00134         }
00135         else {
00136             pc.printf("syntax error\n");
00137             goto set_prev;
00138         }
00139         //termina la función set_prev
00140 
00141         // Aquí se encuentra la función ALARMA, en la cual se configura los valores para la activación de esta
00142         set_alarma:             
00143         pc.printf("******* Configuracion Alarma *******\n");        
00144         
00145         set_dia: // Para que el usuario ingrese el día con el encoder
00146         while(1){
00147          
00148             dia=dia+wheel.getPulses();
00149             wheel.reset();
00150      
00151             if(dia>=31){        //En este if, se garantiza que los días esten entre 1 y 31
00152                 dia=31;
00153             }
00154             else if (dia<=1){
00155              dia=1;
00156             }
00157             
00158      pc.printf(">Dia=%d    Mes=%d    Ano=%d    Hora=%d    Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
00159      wait(3);
00160      
00161     // A continuación se programan los botones del encoder para configurar con este las diferentes necesidades de la alarma
00162     
00163     if(BotonENC.falling()){ // Con el boton del encoder se pasa ingresar el siguiente dato necesario
00164         goto set_mes;
00165         }
00166     if(Boton2.falling()){ // Boton para aceptar la alarma y proceder a activarla
00167         goto set_comp;
00168     }
00169            
00170             
00171     }
00172         
00173         set_mes:
00174         while(1){
00175          
00176             mes=mes+wheel.getPulses();
00177             wheel.reset();
00178      
00179             if(mes>=12){                // Se garantiza que el valor del mes se encuentre entre los valores 1 y 12
00180                 mes=12;
00181             }
00182             else if (mes<=1){
00183              mes=1;
00184             }
00185      pc.printf(" Dia=%d   >Mes=%d    Ano=%d    Hora=%d    Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
00186      wait(3);
00187     
00188     if(BotonENC.falling()){
00189         goto set_ano;
00190     }
00191     if(Boton2.falling()){ 
00192         goto set_comp;
00193     }           
00194             
00195     }
00196      set_ano:
00197         while(1){
00198          
00199             ano=ano+wheel.getPulses();
00200             wheel.reset();
00201      
00202             if(ano>=2100){              //Se programan alarmas para los próximos 84 años (entre los años 2016 y 2030)
00203                 ano=2100;
00204             }
00205             else if (ano<=2016){
00206              ano=2016;
00207             }
00208      pc.printf(" Dia=%d    Mes=%d   >Ano=%d    Hora=%d    Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
00209      wait(3);    
00210     
00211     if(BotonENC.falling()){
00212         goto set_hh;
00213     }
00214     if(Boton2.falling()){
00215         goto set_comp;
00216     }      
00217            
00218     }
00219     set_hh:
00220         while(1){
00221          
00222             hh=hh+wheel.getPulses();
00223             wheel.reset();
00224      
00225             if(hh>=23){         // Las horas deben encontrarse siempre en el rango de 0 a 23 (La hora 24 = La hora 0)
00226                 hh=23;
00227             }
00228             else if (hh<=0){
00229              hh=0;
00230             }
00231      pc.printf(" Dia=%d    Mes=%d    Ano=%d   >Hora=%d    Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
00232      wait(3);
00233     
00234     if(BotonENC.falling()){
00235         goto set_mm;
00236     }
00237     if(Boton2.falling()){
00238         goto set_comp;
00239     }           
00240             
00241     }
00242      set_mm:
00243         while(1){
00244          
00245             mm=mm+wheel.getPulses();
00246             wheel.reset();
00247      
00248             if(mm>=59){         //Minutos siempre positivos entre 0 y 59 (El minuto 60 es igual al 0)
00249                 mm=59;
00250             }
00251             else if (mm<=0){
00252              mm=0;
00253             }
00254      pc.printf(" Dia=%d    Mes=%d    Ano=%d    Hora=%d   >Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
00255      wait(3);
00256     
00257     if(BotonENC.falling()){
00258         goto set_ss;
00259     }
00260     if(Boton2.falling()){
00261         goto set_comp;
00262     }          
00263             
00264     }
00265     
00266     set_ss:
00267         while(1){
00268          
00269             ss=ss+wheel.getPulses();
00270             wheel.reset();
00271             
00272             if(ss>=59){         //De nuevo, en un minuto hay 60 segundos ( partiendo del 0 al 59)
00273                 ss=59;
00274             }
00275             else if (ss<=0){
00276              ss=0;
00277             }
00278      pc.printf(" Dia=%d    Mes=%d    Ano=%d    Hora=%d    Min=%d   >Seg=%d\n ",dia,mes,ano,hh,mm,ss);
00279      wait(3);
00280     
00281     if(BotonENC.falling()){
00282         goto set_dia;
00283     }
00284     if(Boton2.falling()){
00285         goto set_comp;
00286     }           
00287             
00288     }
00289     
00290     // Luego de tener totalmente ingresador los datos de la alarma, se ingresa a la sección donde se compara la fecha y hora actual con la fecha y hora de la alarma programada
00291     set_comp:
00292     
00293     pc.printf("***Datos ingresados para alarma****\n");
00294     pc.printf(" Dia=%d    Mes=%d    Ano=%d    Hora=%d    Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
00295     
00296     while(1){
00297        rtc.getTime(tm);
00298        pc.printf("El tiempo actual es : %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec);
00299        pc.printf("La fecha actual es %s, %02d/%02d/%04d\n", rtc.weekdayToString(tm.wday), tm.mon, tm.date, tm.year);
00300        lcd.cls();
00301                 lcd.locate(0,0);
00302                 lcd.printf("%02d:%02d:%02d", tm.hour, tm.min, tm.sec);
00303                 lcd.locate(0,1);
00304                 lcd.printf("%s/%02d/%02d/%4d", rtc.weekdayToString(tm.wday), tm.date, tm.mon, tm.year);
00305                 wait_ms(200);
00306     if(tm.hour>=hh && tm.min>=mm &&tm.sec>=ss && tm.mon>=mes && tm.date>=dia && tm.year>=ano){
00307      alarma1:
00308        
00309         myled=0;        // En estas líneas de código se busca mostrar el funcionamiento de la alarma cuando 
00310         myled2=1;       // esta es encendida mediante el encendido y apagado alternado de dos diodos leds.
00311         wait(0.5);      // con un pequeño tiempo de diferencia para lograr dicho efecto.
00312         myled=1;
00313         myled2=0;
00314         wait(0.5);
00315         
00316     if(BotonENC.falling()){ // Si la alarma esta activada y se presiona el boton del encoder se pasa a la función snooze 
00317             goto snooze;     
00318         }
00319     if(Boton2.falling()){ // Si la alarma esta activada y se presiona el boton externo se desactiva la alarma y ya solo muestra la hora
00320         myled=0;
00321         myled2=0;
00322         goto lop1;
00323     }
00324             
00325     }
00326     } 
00327      snooze:  // Se desactivan ambos leds representando que se detuvo la alarma 
00328         myled=0;
00329         myled2=0;   
00330         contador = contador+1; // El contador se usa para permitir que lafunción snooze solo se active 3 veces
00331         if (contador == 4){
00332             goto lop1; // Cuando se activa la cuarta vez, el boton del encoder la alarma se desactiva
00333             }
00334         wait(10); // Espera 10 segundos para volver a activar la alarma
00335         goto alarma1;
00336     }