Reloj con alarma y snooze

Dependencies:   RTC-DS1307-Modificada TextLCD mbed QEI

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 "QEI.h"
00005 
00006 //Configuración de la pantalla
00007 TextLCD lcd(PTE20,PTE21,PTE22,PTE23,PTE29,PTE30, TextLCD::LCD16x2); //Rs, E, d4, d5, d6, d7
00008 
00009 //Configuración del reloj
00010 Rtc_Ds1307 rtc(PTE0, PTE1); // SDA, SCL
00011 
00012 //Configuración del puerto
00013 Serial pc(USBTX, USBRX, "pc");
00014 
00015 //Configuración del encoder
00016 QEI encoder(PTD5, PTD0, NC,624);
00017 
00018 DigitalIn alarma(PTC12);
00019 DigitalIn snooze(PTC13); 
00020 DigitalIn alarmaE(PTC16);
00021 PwmOut speaker(PTA13);
00022 
00023 
00024 char buffer[128];
00025 int readptr = 0;
00026 int hora=0;
00027 int hora2=0;
00028 int minutos=0;
00029 int minutos2=0;
00030 int seg=0;
00031 int seg2=0;
00032 int mes=0; 
00033 int mes2=0;
00034 int fecha=0; 
00035 int fecha2=0;
00036 int anno=0;
00037 int anno2=0;
00038 int pulsador;
00039 int pulsador2;
00040 int a=0;
00041 int b=0;
00042 int pulsos=0;
00043 int diferencia=0;
00044 int alarma2=0;
00045 
00046 
00047 int main()
00048 {
00049     char c;
00050     Rtc_Ds1307::Time_rtc tm = {};
00051 
00052     lcd.cls();
00053     lcd.locate(0,0);
00054     lcd.printf("Configurando");
00055     lcd.locate(0,1);
00056     lcd.printf("el reloj");
00057 
00058     pc.printf("*************************************\n");
00059     pc.printf("*       Configurar el reloj         *\n");
00060     pc.printf("*************************************\n");
00061 
00062     while(1) {
00063 
00064 
00065         pc.printf("Ingrese la fecha (entre 1 y 31)");
00066         pc.scanf("%d", &tm.date);
00067         pc.printf("Ingrese el mes (entre 1 y 12)");
00068         pc.scanf("%d", &tm.mon);
00069         pc.printf("Ingrese el anno (ejemplo: 2016)");
00070         pc.scanf("%d", &tm.year);
00071         pc.printf("Ingrese la hora (entre 0 y 23)");
00072         pc.scanf("%d", &tm.hour);
00073         pc.printf("Ingrese los minutos (entre 0 y 59)");
00074         pc.scanf("%d", &tm.min);
00075         pc.printf("Ingrese los segundos (entre 0 y 59)");
00076         pc.scanf("%d", &tm.sec);
00077         pc.printf("Ingrese el dia (siendo Domingo=1)");
00078         pc.scanf("%d", &tm.wday);
00079         pc.printf("*************************************\n");
00080         pc.printf("Configurando el reloj\n");
00081        
00082         
00083         while(pc.readable()) {
00084             pc.getc();
00085             rtc.setTime(tm, false, false);}
00086 
00087         wait_ms(200);
00088 
00089         pc.printf("Inicializando el reloj\n");
00090         rtc.startClock();
00091   
00092         wait_ms(200);
00093 
00094         pc.printf("Leyendo el reloj\n");
00095 
00096 loop1:     if (rtc.getTime(tm) ) {
00097            pulsador=alarma.read();
00098            
00099            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
00100            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
00101            
00102            //pc.printf("%d\n",a);
00103            
00104            if (a*b==0)
00105            {
00106 loop3:      lcd.cls();
00107             lcd.printf("ALARMA");
00108             pc.printf("*************************************\n");
00109             pc.printf("*               ALARMA              *\n");
00110             pc.printf("*************************************\n");
00111             speaker.period(1.0/500.0);
00112             speaker=0.5;
00113             
00114 loop4:      pulsador2=snooze.read(); // Estado del pulsador para detener o posponer la alarma
00115             
00116             if (pulsador2==0){            
00117             speaker=0.0;
00118             pc.printf("Pulsar 5 segundos para detener\n");
00119             lcd.cls();
00120             lcd.printf("Mantenga pulsado");
00121             lcd.locate(0,1);
00122             lcd.printf("para detener");
00123             wait(5); 
00124             pulsador2=snooze.read();
00125             if (pulsador2==0){ // Si despues de 5 segundos el pulsador todavia está oprimido, se detiene la alarma
00126                 lcd.cls();
00127                 lcd.printf("Alarma");
00128                 lcd.locate(0,1);
00129                 lcd.printf("desactivada");
00130                 pc.printf("*************************************\n");
00131                 pc.printf("*           Alarma desactivada      *\n");
00132                 pc.printf("*************************************\n");
00133                 wait(2);
00134                 goto loop1;   
00135                 }else{ // Si el pulsador ya no está oprimido, se pospone la alarma un minuto
00136                 lcd.cls();
00137                 lcd.printf("Snooze");
00138                 pc.printf("*************************************\n");
00139                 pc.printf("*           Snooze                  *\n");
00140                 pc.printf("*************************************\n");
00141                 wait(60);
00142                 goto loop3;     
00143                    } 
00144                         
00145              }else {
00146                goto loop4;  }
00147              }
00148              
00149             //pc.printf("La hora actual es: %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec);
00150             //pc.printf("La fecha actual es : %s, %02d/%02d/%04d\n", rtc.weekdayToString(tm.wday), tm.mon, tm.date, tm.year);
00151 
00152            else if (pulsador==0) {
00153                 lcd.cls();
00154                 lcd.printf("Ver/Configurar");
00155                 lcd.locate(0,1);
00156                 lcd.printf("alarma");
00157                 pc.printf("*************************************\n");
00158                 pc.printf("* alarma  - configurar alarma       *\n");
00159                 pc.printf("* ver     - ver alarma              *\n");
00160                 pc.printf("*************************************\n");
00161 
00162 loop2:          readptr = 0;
00163                
00164                //Obtengo la cadena de caracteres correspondiente a la orden
00165                
00166                 while( (c = pc.getc()) != '\n') {
00167                 buffer[readptr++] = c; }
00168                 buffer[readptr++] = 0;
00169 
00170                // Configurar alarma desde el computador  
00171                 if (strncmp(buffer, "alarma", 6) == 0) {
00172                     
00173                     lcd.cls();
00174                     lcd.printf("Configurando");
00175                     lcd.locate(0,1);
00176                     lcd.printf("alarma");
00177                     pc.printf("*************************************\n");
00178                     pc.printf("*             Nueva alarma          *\n");
00179                     pc.printf("Fecha de la alarma  (0..31)");
00180                     pc.scanf("%d", &fecha);
00181                     pc.printf("Mes de la alarma (1..12)");
00182                     pc.scanf("%d", &mes);
00183                     pc.printf("Anno de la alarma");
00184                     pc.scanf("%d", &anno);
00185                     pc.printf("Hora de la alarma (0..23)");
00186                     pc.scanf("%d", &hora);
00187                     pc.printf("Minutos de la alarma (0..59)");
00188                     pc.scanf("%d",&minutos);
00189                     pc.printf("Segundos de la alarma (0..59)");
00190                     pc.scanf("%d", &seg);
00191                     pc.printf("*      Fin de la configuracion      *\n");
00192                     pc.printf("*************************************\n");
00193                     lcd.cls();
00194                     lcd.printf("Fin de la configuracion");
00195                     wait_ms(500);
00196                     goto loop1;
00197                     
00198                 } else if (strncmp(buffer, "ver", 3) == 0) {
00199                     
00200                     if(anno==0){
00201                     pc.printf("No hay alarma 1\n");
00202                     lcd.cls();
00203                     lcd.printf("No hay alarma 1");
00204                     wait_ms(500);    
00205                      }else{
00206                     pc.printf("Hora de la alarma : %02d:%02d:%02d\n", hora, minutos, seg);
00207                     pc.printf("Fecha de la alarma : %02d/%02d/%04d\n", fecha, mes, anno);
00208                     lcd.cls();
00209                     lcd.printf("Alarma 1");
00210                     wait (1);
00211                     lcd.printf("%02d:%02d:%02d", hora, minutos, seg);
00212                     lcd.locate(0,1);
00213                     lcd.printf("%02d:%02d:%02d", fecha, mes, anno);
00214                     wait(2);}
00215                     
00216                     if(alarma2==0){
00217                     pc.printf("No hay alarma 2\n");
00218                     lcd.locate(0,1);
00219                     lcd.printf("No hay alarma 2");
00220                     wait_ms(500);    
00221                      }else{
00222                     pc.printf("Hora de la alarma 2 : %02d:%02d:%02d\n", hora2, minutos2, seg2);
00223                     pc.printf("Fecha de la alarma 2: %02d/%02d/%04d\n", fecha2, mes2, anno2);
00224                     lcd.cls();
00225                     lcd.printf("Alarma 2");
00226                     wait (1);
00227                     lcd.printf("%02d:%02d:%02d", hora2, minutos2, seg2);
00228                     lcd.locate(0,1);
00229                     lcd.printf("%02d:%02d:%02d", fecha2, mes2, anno2);
00230                     wait(2);}
00231                     
00232                                        
00233                     goto loop1;
00234                     
00235                 } else {
00236                     goto loop2;
00237                 }
00238 
00239 
00240             } 
00241             
00242             // Configura alarma con encoder
00243             else if (alarmaE==0){
00244             pc.printf("*    Configurar alarma con encoder     *\n");
00245             lcd.cls();
00246             lcd.printf("Alarma con");
00247             lcd.locate(0,1);
00248             lcd.printf("encoder");
00249             wait (1);
00250  
00251  
00252  //Configuración fecha             
00253             
00254             pc.printf("Fecha de la alarma:\n");
00255             lcd.cls();
00256             lcd.printf("Fecha");
00257             
00258 loop5:      diferencia=encoder.getPulses()-pulsos;
00259             pulsos=encoder.getPulses();
00260             if (!alarmaE){
00261             pc.printf("\n");     
00262             pc.printf("Mes de la alarma:\n"); 
00263             lcd.cls();
00264             lcd.printf("Mes");
00265             diferencia=0;
00266             pulsos=0; 
00267             wait(1);
00268             goto loop6;  
00269                 }else{
00270             if (diferencia==0){
00271              wait(0.1);
00272             goto loop5;                    
00273                 }else if (diferencia+fecha2>=31){
00274                 fecha2=31;
00275                   pc.printf("%02d\n", fecha2);
00276                   lcd.locate(0,1);
00277                   lcd.printf("%02d",fecha2);
00278                   wait(0.1);
00279                   goto loop5;
00280                   }else if(diferencia+fecha2<1)   {
00281                     fecha2=1;
00282                   pc.printf("%02d\n", fecha2);
00283                   lcd.locate(0,1);
00284                   lcd.printf("%02d",fecha2);
00285                   wait(0.1);
00286                   goto loop5;
00287                     }else{
00288                    fecha2+=diferencia;
00289                    pc.printf("%02d\n", fecha2);
00290                    lcd.locate(0,1);
00291                    lcd.printf("%02d",fecha2);
00292                    wait(0.1);
00293                    goto loop5; 
00294             }}
00295  
00296  
00297  
00298  //Configuración mes    
00299  
00300  
00301  loop6:     diferencia=encoder.getPulses()-pulsos;
00302             pulsos=encoder.getPulses();
00303             if (!alarmaE){
00304             pc.printf("\n");     
00305             pc.printf("Anno de la alarma:\n"); 
00306             lcd.cls();
00307             lcd.printf("Anno");
00308             diferencia=0;
00309             pulsos=0; 
00310             wait(1);
00311             goto loop7;  
00312                 }else{
00313             if (diferencia==0){
00314              wait(0.1);
00315             goto loop6;                    
00316                 }else if (diferencia+mes2>=12){
00317                 mes2=12;
00318                   pc.printf("%02d\n", mes2);
00319                   lcd.locate(0,1);
00320                   lcd.printf("%02d",mes2);
00321                   wait(0.1);
00322                   goto loop6;
00323                   }else if(diferencia+mes2<1)   {
00324                     mes2=1;
00325                   pc.printf("%02d\n", mes2);
00326                   lcd.locate(0,1);
00327                   lcd.printf("%02d",mes2);
00328                   wait(0.1);
00329                   goto loop6;
00330                     }else{
00331                    mes2+=diferencia;
00332                    pc.printf("%02d\n", mes2);
00333                    lcd.locate(0,1);
00334                    lcd.printf("%02d",mes2);
00335                    wait(0.1);
00336                    goto loop6 ; 
00337             }}
00338  
00339  
00340  
00341  //Configuración año
00342  loop7:     diferencia=encoder.getPulses()-pulsos;
00343             pulsos=encoder.getPulses();
00344             if (!alarmaE){
00345             pc.printf("\n");     
00346             pc.printf("Hora de la alarma:\n"); 
00347             lcd.cls();
00348             lcd.printf("Hora");
00349             diferencia=0;
00350             pulsos=0; 
00351             wait(1);
00352             goto loop8;  
00353                 }else{
00354             if (diferencia==0){
00355              wait(0.1);
00356             goto loop7;                    
00357                 }else if (diferencia+anno2>=2255){
00358                 anno2=2255;
00359                   pc.printf("%04d\n", anno2);
00360                   lcd.locate(0,1);
00361                   lcd.printf("%04d", anno2);
00362                   wait(0.1);
00363                   goto loop7;
00364                   }else if(diferencia+anno2<2000)   {
00365                     anno2=2000;
00366                   pc.printf("%04d\n", anno2);
00367                   lcd.locate(0,1);
00368                   lcd.printf("%04d",anno2);
00369                   wait(0.1);
00370                   goto loop7;
00371                     }else{
00372                    anno2+=diferencia;
00373                    pc.printf("%04d\n", anno2);
00374                    lcd.locate(0,1);
00375                    lcd.printf("%04d",anno2);
00376                    wait(0.1);
00377                    goto loop7 ; 
00378             }}
00379  
00380  
00381  //Configuración hora
00382  
00383  
00384  loop8:     diferencia=encoder.getPulses()-pulsos;
00385             pulsos=encoder.getPulses();
00386             if (!alarmaE){
00387             pc.printf("\n");     
00388             pc.printf("Minutos de la alarma:\n"); 
00389             lcd.cls();
00390             lcd.printf("Minutos");
00391             diferencia=0;
00392             pulsos=0; 
00393             wait(1);
00394             goto loop9;  
00395                 }else{
00396             if (diferencia==0){
00397              wait(0.1);
00398             goto loop8;                    
00399                 }else if (diferencia+hora2>=23){
00400                 hora2=23;
00401                   pc.printf("%02d\n", hora2);
00402                   lcd.locate(0,1);
00403                   lcd.printf("%02d", hora2);
00404                   wait(0.1);
00405                   goto loop8;
00406                   }else if(diferencia+hora2<0)   {
00407                     hora2=0;
00408                   pc.printf("%02d\n", hora2);
00409                   lcd.locate(0,1);
00410                   lcd.printf("%02d",hora2);
00411                   wait(0.1);
00412                   goto loop8;
00413                     }else{
00414                    hora2+=diferencia;
00415                    pc.printf("%02d\n", hora2);
00416                    lcd.locate(0,1);
00417                    lcd.printf("%02d",hora2);
00418                    wait(0.1);
00419                    goto loop8 ; 
00420             }}
00421  
00422  //Configuración minutos     
00423 loop9:      diferencia=encoder.getPulses()-pulsos;
00424             pulsos=encoder.getPulses();
00425             if (!alarmaE){
00426             pc.printf("\n");     
00427             pc.printf("Segundos de la alarma:\n"); 
00428             lcd.cls();
00429             lcd.printf("Segundos");
00430             diferencia=0;
00431             pulsos=0; 
00432             wait(1);
00433             goto loop10;  
00434                 }else{
00435             if (diferencia==0){
00436              wait(0.1);
00437             goto loop9;                    
00438                 }else if (diferencia+minutos2>=59){
00439                 minutos2=59;
00440                   pc.printf("%02d\n", minutos2);
00441                   lcd.locate(0,1);
00442                   lcd.printf("%02d", minutos2);
00443                   wait(0.1);
00444                   goto loop9;
00445                   }else if(diferencia+minutos2<0)   {
00446                     minutos2=0;
00447                   pc.printf("%02d\n", minutos2);
00448                   lcd.locate(0,1);
00449                   lcd.printf("%02d",minutos2);
00450                   wait(0.1);
00451                   goto loop9;
00452                     }else{
00453                    minutos2+=diferencia;
00454                    pc.printf("%02d\n", minutos2);
00455                    lcd.locate(0,1);
00456                    lcd.printf("%02d",minutos2);
00457                    wait(0.1);
00458                    goto loop9 ; 
00459             }}
00460 
00461 //Configuración segundos
00462 
00463 loop10:      diferencia=encoder.getPulses()-pulsos;
00464             pulsos=encoder.getPulses();
00465             if (!alarmaE){
00466             pc.printf("\n");     
00467             pc.printf("*    Fin de la configuracion    *\n"); 
00468             lcd.cls();
00469             lcd.printf("Fin de la configuracion");
00470             diferencia=0;
00471             pulsos=0; 
00472             alarma2=1;
00473             wait(1);
00474             goto loop1;  
00475                 }else{
00476             if (diferencia==0){
00477              wait(0.1);
00478             goto loop10;                    
00479                 }else if (diferencia+seg2>=59){
00480                 seg2=59;
00481                   pc.printf("%02d\n", seg2);
00482                   lcd.locate(0,1);
00483                   lcd.printf("%02d", seg2);
00484                   wait(0.1);
00485                   goto loop10;
00486                   }else if(diferencia+seg2<0)   {
00487                     seg2=0;
00488                   pc.printf("%02d\n", seg2);
00489                   lcd.locate(0,1);
00490                   lcd.printf("%02d",seg2);
00491                   wait(0.1);
00492                   goto loop10;
00493                     }else{
00494                    seg2+=diferencia;
00495                    pc.printf("%02d\n", seg2);
00496                    lcd.locate(0,1);
00497                    lcd.printf("%02d",seg2);
00498                    wait(0.1);
00499                    goto loop10 ; 
00500             }}
00501 
00502            
00503             }else {
00504                 //Actualizo la hora y la fecha
00505                 lcd.cls();
00506                 lcd.locate(0,0);
00507                 lcd.printf("%02d:%02d:%02d", tm.hour, tm.min, tm.sec);
00508                 lcd.locate(0,1);
00509                 lcd.printf("%s/%02d/%02d/%4d", rtc.weekdayToString(tm.wday), tm.date, tm.mon, tm.year);
00510                 wait_ms(200);
00511                 goto loop1;
00512             }//else
00513         }
00514 
00515 
00516 
00517     }// while (1)
00518 }// main