reloj de tiempo real con alarma aplazable

Dependencies:   Debounced RTC-DS1307 TextLCD mbed

Fork of Rtc_Ds1307_Sample by Henry Leinen

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 
00006 Rtc_Ds1307 rtc(PTE0, PTE1);
00007 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5);// rs, e, d4-d7
00008 Serial pc(USBTX, USBRX, "pc");
00009 DebouncedIn button1(PTC12); //Incremental
00010 DebouncedIn button2(PTC13); //Decremental
00011 DebouncedIn button3(PTC16); //Cambiador de variable
00012 DebouncedIn button4(PTC17); //Configurador de modo
00013 PwmOut pw(PTA12); //se define la salida del pwm para hacer sonar la bocina
00014 
00015 //esta parte es para definir la frecuencia a la que suenan los botones
00016 float Tdo=1/2093.005;
00017 float Pdo=Tdo/2;
00018 float Tre=1/2637.02;
00019 float Pre=Tre/2;
00020 float Tmi=1/3135.963;
00021 float Pmi=Tmi/2;
00022 float Tfa=1/4186.009;
00023 float Pfa=Tfa/2;
00024 //**********************************
00025 int C1=0x0F; // comando para el lcd
00026 //*************************************
00027 int modo=0; //modo es para el boton 4. Indica: 0-mostrar datos, 1-configurar datos, 2-config alarma
00028 int p=0; //p es el valor del boton 3 para la ubicación del modificador de variables 0-no aparece, 1-h, 2-m, 3-s, 4-D, 5-M, 6-Y.
00029 //***************************************
00030 //Definicion de variables para la configuración de alarma
00031 int houral=2,minal=4,secal=0,dateal=8,monal=5,yearal=2014;
00032 Timer t; // se define la variable t, contabilizadora del tiempo desde el inicio de la alarma
00033 //*************************************
00034 int main(){
00035     //Definiciones del ds1307
00036     Rtc_Ds1307::Time_rtc tm = {};
00037     rtc.startClock();
00038     //Comandos para la LCD
00039     lcd.cls(); //borrar pantalla
00040     lcd.writeCommand(C1);
00041 //**************************************
00042     while(1) {   //Comienza el ciclo principal
00043         //PARTE PARA EL MODO 0: MUESTRA DE HORA Y FECHA
00044         if (modo==0) {
00045             while(modo==0) {  
00046                     rtc.getTime(tm);
00047                     lcd.locate(0,0); //las coordenadas van del 0 al 15 en la primera entrada, y de 0 a 1 en la segunda casilla
00048                     lcd.printf("Hora:%02d:%02d:%02d",tm.hour, tm.min, tm.sec); //%02d indica que la variable tiene maximo dos (2) digitos y si en algun caso solo tiene 1 digito,
00049                     lcd.locate(0,1);                         // el otro espacio que queda vacio debe llenarse con un cero (0)
00050                     lcd.printf("Fech:%02d/%02d/%04d", tm.date, tm.mon, tm.year);
00051                 //Verificación de hora alarma
00052                 if (tm.hour==houral && tm.min==minal && tm.sec==secal && tm.date==dateal && tm.mon==monal && tm.year==yearal) {
00053                      
00054                     while( button2==1) { // si el boton 2 se deja presionado sale del while lo que implica  que apaga la alarma
00055                    
00056                         pw.period(Tdo); // aqui se indica la frecuencia para el sonido al pulsar el boton 1
00057                         pw.pulsewidth(Pdo);
00058                         wait(0.5);
00059                         pw=0;
00060                         pw.period(Tre); // aqui se indica la frecuencia para el sonido al pulsar el boton 1
00061                         pw.pulsewidth(Pre);
00062                         wait(0.5);
00063                         pw=0;
00064                         pw.period(Tmi); // aqui se indica la frecuencia para el sonido al pulsar el boton 1
00065                         pw.pulsewidth(Pmi);
00066                         wait(0.5);
00067                         pw=0;
00068                         pw.period(Tfa); // aqui se indica la frecuencia para el sonido al pulsar el boton 1
00069                         pw.pulsewidth(Pfa);
00070                         wait(0.5);
00071                         pw=0; 
00072                          if(button1.falling() ==1) { // si dentro del while se produce una interrupción en el boton 1 retrasa la alarma 1 min
00073                         minal=minal+1;
00074                         pw=0;
00075                         } 
00076                     }
00077                     
00078     
00079                 }   
00080                     
00081     
00082                 if (button4.falling()) {
00083                     pw.period(Tfa); // aqui se indica la frecuencia para el sonido al pulsar el boton 1
00084                     pw.pulsewidth(Pfa);
00085                     wait(0.1);
00086                     pw=0;            
00087                     ++modo;
00088                     lcd.locate(0,0);
00089                     lcd.printf("Conf");
00090                 }
00091             }
00092         }//fIN DEL MODO CERO 
00093         if (modo==1) {
00094             rtc.getTime(tm);
00095                 while(modo==1){
00096                     if (button4.falling()) { //CAMBIADOR DE MODO
00097                         pw.period(Tfa); // aqui se indica la frecuencia para el sonido al pulsar el boton 1
00098                         pw.pulsewidth(Pfa);
00099                         wait(0.1);
00100                         pw=0;
00101                         ++modo;
00102                         lcd.locate(0,0); //las coordenadas van del 0 al 15 en la primera entrada, y de 0 a 1 en la segunda casilla
00103                         lcd.printf("Alrm:%02d:%02d:%02d",houral, minal, secal); //%02d indica que la variable tiene maximo dos (2) digitos y si en algun caso solo tiene 1 digito,
00104                         lcd.locate(0,1);                         // el otro espacio que queda vacio debe llenarse con un cero (0)
00105                         lcd.printf("Fech:%02d/%02d/%04d", dateal, monal, yearal); 
00106                     }
00107                     if (button1.falling()) { //INCREMENTAL
00108                         if (p==0) {pw=0;} //Condicion: incremental no suena si no estoy ubicado en una variable
00109                         else{
00110                             pw.period(Tdo); // aqui se indica la frecuencia para el sonido al pulsar el boton 1
00111                             pw.pulsewidth(Pdo);
00112                             wait(0.1);
00113                             pw=0;
00114                         }
00115                         if (p==1) { //posicion de variable hora
00116                             if (tm.hour==23) {
00117                                 tm.hour=0;
00118                                 lcd.locate(5,0);
00119                                 lcd.printf(" ");
00120                                 lcd.locate(5,0);
00121                                 lcd.printf("%02d", tm.hour);
00122                             } else {
00123                                 ++tm.hour;
00124                                 lcd.locate(5,0);
00125                                 lcd.printf(" ");
00126                                 lcd.locate(5,0);
00127                                 lcd.printf("%02d", tm.hour);
00128                             }
00129                          }
00130                          else if (p==2) { //p=2: posicion de variable minutos
00131                             if (tm.min==59) {
00132                                 tm.min=0;
00133                                 lcd.locate(8,0);
00134                                 lcd.printf(" ");
00135                                 lcd.locate(8,0);
00136                                 lcd.printf("%02d", tm.min);
00137                             } 
00138                             else {
00139                                 ++tm.min;
00140                                 lcd.locate(8,0);
00141                                 lcd.printf(" ");
00142                                 lcd.locate(8,0);
00143                                 lcd.printf("%02d", tm.min);
00144                             }
00145                         }
00146                          else if (p==3) {//p=3: posicion de variable segundos
00147                             if (tm.sec==59) {
00148                                 tm.sec=0;
00149                                 lcd.locate(11,0);
00150                                 lcd.printf(" ");
00151                                 lcd.locate(11,0);
00152                                 lcd.printf("%02d", tm.sec);
00153                             } 
00154                             else {
00155                                 ++tm.sec;
00156                                 lcd.locate(11,0);
00157                                 lcd.printf(" ");
00158                                 lcd.locate(11,0);
00159                                 lcd.printf("%02d", tm.sec);
00160                             }
00161                          }
00162                          else if (p==4) {//p=4: posicion de variable dia del mes
00163                              if (tm.date==31) {
00164                                  tm.date=1;
00165                                  lcd.locate(5,1);
00166                                  lcd.printf(" ");
00167                                  lcd.locate(5,1);
00168                                  lcd.printf("%02d", tm.date);
00169                              } 
00170                              else {
00171                                  ++tm.date;
00172                                  lcd.locate(5,1);
00173                                  lcd.printf(" ");
00174                                  lcd.locate(5,1);
00175                                  lcd.printf("%02d", tm.date);
00176                              }
00177                          } 
00178                          else if (p==5) {//p=5: posicion de variable mes
00179                              if (tm.mon==12) {
00180                                  tm.mon=1;
00181                                  lcd.locate(8,1);
00182                                  lcd.printf(" ");
00183                                  lcd.locate(8,1);
00184                                  lcd.printf("%02d", tm.mon);
00185                              } 
00186                              else {
00187                                  ++tm.mon;
00188                                  lcd.locate(8,1);
00189                                  lcd.printf(" ");
00190                                  lcd.locate(8,1);
00191                                  lcd.printf("%02d", tm.mon);
00192                              }
00193                         } 
00194                         else if (p==6) { //p=6: posicion de variable años
00195                             ++tm.year;
00196                             lcd.locate(11,1);
00197                             lcd.printf(" ");
00198                             lcd.locate(11,1);
00199                             lcd.printf("%04d", tm.year);
00200                         }
00201                     }
00202                     if (button2.falling()) { //boton decremental
00203                         if (p==0) {pw=0;} 
00204                         else{
00205                             pw.period(Tre);
00206                             pw.pulsewidth(Pre);
00207                             wait(0.1);
00208                             pw=0;
00209                         }
00210                         if (p==1) {
00211                             if (tm.hour==0) {
00212                                 tm.hour=24;
00213                                 lcd.locate(5,0);
00214                                 lcd.printf(" ");
00215                                 lcd.locate(5,0);
00216                                 lcd.printf("%02d", tm.hour);
00217                             } 
00218                             else {
00219                                 --tm.hour;
00220                                 lcd.locate(5,0);
00221                                 lcd.printf(" ");
00222                                 lcd.locate(5,0);
00223                                 lcd.printf("%02d", tm.hour);
00224                             }
00225                         }
00226                         else if (p==2) {
00227                             if (tm.min==0) { // no mostrar nada
00228                                 tm.min=59;
00229                                 lcd.locate(8,0);
00230                                 lcd.printf(" ");
00231                                 lcd.locate(8,0);
00232                                 lcd.printf("%02d", tm.min);
00233                             } 
00234                             else {
00235                                 --tm.min;
00236                                 lcd.locate(8,0);
00237                                 lcd.printf(" ");
00238                                 lcd.locate(8,0);
00239                                 lcd.printf("%02d", tm.min);
00240                             }
00241                         }
00242                         else if (p==3) {
00243                             if (tm.sec==0) { // no mostrar nada
00244                                 tm.sec=59;
00245                                 lcd.locate(11,0);
00246                                 lcd.printf(" ");
00247                                 lcd.locate(11,0);
00248                                 lcd.printf("%02d", tm.sec);
00249                             } 
00250                             else {
00251                                 --tm.sec;
00252                                 lcd.locate(11,0);
00253                                 lcd.printf(" ");
00254                                 lcd.locate(11,0);
00255                                 lcd.printf("%02d", tm.sec);
00256                             }
00257                         }
00258                         else if (p==4) {
00259                             if (tm.date==1) { // no mostrar nada
00260                                 tm.date=31;
00261                                 lcd.locate(5,1);
00262                                 lcd.printf(" ");
00263                                 lcd.locate(5,1);
00264                                 lcd.printf("%02d", tm.date);
00265                             } 
00266                             else {
00267                                 --tm.date;
00268                                 lcd.locate(5,1);
00269                                 lcd.printf(" ");
00270                                 lcd.locate(5,1);
00271                                 lcd.printf("%02d", tm.date);
00272                             }
00273                         }
00274                         else if (p==5) {
00275                             if (tm.mon==1) {
00276                                 tm.mon=12;
00277                                 lcd.locate(8,1);
00278                                 lcd.printf(" ");
00279                                 lcd.locate(8,1);
00280                                 lcd.printf("%02d", tm.mon);
00281                             } 
00282                             else {
00283                                 --tm.mon;
00284                                 lcd.locate(8,1);
00285                                 lcd.printf(" ");
00286                                 lcd.locate(8,1);
00287                                 lcd.printf("%02d", tm.mon);
00288                             }
00289                         }
00290                         else if (p==6) {
00291                             if (tm.year==2000) {
00292                                 lcd.locate(11,1);
00293                                 lcd.printf(" ");
00294                                 lcd.locate(11,1);
00295                                 lcd.printf("%04d", tm.year);
00296                             } 
00297                             else {
00298                                 --tm.year;
00299                                 lcd.locate(11,1);
00300                                 lcd.printf(" ");
00301                                 lcd.locate(11,1);
00302                                 lcd.printf("%04d", tm.year);
00303                             }
00304                         }
00305                     }
00306                     if (button3.falling()) { //boton 3: cambiador de variable
00307                         pw.period(Tmi);
00308                         pw.pulsewidth(Pmi);
00309                         wait(0.1);
00310                         pw=0;
00311     
00312                         if (p==0) { //p=0: no esta parado en ninguna variable
00313                             ++p;
00314                             lcd.locate(5,0);
00315                             lcd.printf(" ");
00316                             lcd.locate(5,0);
00317                             lcd.printf("%02d", tm.hour);
00318                         } else if (p==1) { //p=1: ubicacion de variable hora
00319                             ++p;
00320                             lcd.locate(8,0);
00321                             lcd.printf(" ");
00322                             lcd.locate(8,0);
00323                             lcd.printf("%02d", tm.min);
00324                         } else if (p==2) {
00325                             ++p;
00326                             lcd.locate(11,0);
00327                             lcd.printf(" ");
00328                             lcd.locate(11,0);
00329                             lcd.printf("%02d", tm.sec);
00330                         } else if (p==3) {
00331                             ++p;
00332                             lcd.locate(5,1);
00333                             lcd.printf(" ");
00334                             lcd.locate(5,1);
00335                             lcd.printf("%02d", tm.date);
00336                         } else if (p==4) {
00337                             ++p;
00338                             lcd.locate(8,1);
00339                             lcd.printf(" ");
00340                             lcd.locate(8,1);
00341                             lcd.printf("%02d", tm.mon);
00342                         } else if (p==5) {
00343                             ++p;
00344                             lcd.locate(11,1);
00345                             lcd.printf(" ");
00346                             lcd.locate(11,1);
00347                             lcd.printf("%04d", tm.year);
00348                         } else if (p==6) {
00349                             p=0;
00350                             rtc.setTime(tm, true, false);//SOLO SI CONFIGURO TODAS LAS VARIOABLES Y RETORNO A P=0, LA HORA SE CONFIGURA
00351                         }
00352                     }
00353                 }
00354             }
00355             //MODO 2: PROGRAMACION DE LA ALARMA
00356             if (modo==2) {
00357                 rtc.getTime(tm);
00358                 while(modo==2){
00359                     if (button1.falling()) {
00360                         if (p==0) {pw=0;} 
00361                         else{
00362                             pw.period(Tdo); // aqui se indica la frecuencia para el sonido al pulsar el boton 1
00363                             pw.pulsewidth(Pdo);
00364                             wait(0.1);
00365                             pw=0;
00366                         }
00367                         if (p==0) {
00368                         } else if (p==1) {
00369                             if (houral==23) {
00370                                 houral=0;
00371                                 lcd.locate(5,0);
00372                                 lcd.printf(" ");
00373                                 lcd.locate(5,0);
00374                                 lcd.printf("%02d", houral);
00375                             } else {
00376                                 ++houral;
00377                                 lcd.locate(5,0);
00378                                 lcd.printf(" ");
00379                                 lcd.locate(5,0);
00380                                 lcd.printf("%02d", houral);
00381                             }
00382                         } else if (p==2) {
00383                             if (minal==59) {
00384                                 minal=0;
00385                                 lcd.locate(8,0);
00386                                 lcd.printf(" ");
00387                                 lcd.locate(8,0);
00388                                 lcd.printf("%02d", minal);
00389                             } else {
00390                                 ++minal;
00391                                 lcd.locate(8,0);
00392                                 lcd.printf(" ");
00393                                 lcd.locate(8,0);
00394                                 lcd.printf("%02d", minal);
00395                             }
00396                         } else if (p==3) {
00397                             if (secal==59) {
00398                                 secal=0;
00399                                 lcd.locate(11,0);
00400                                 lcd.printf(" ");
00401                                 lcd.locate(11,0);
00402                                 lcd.printf("%02d", secal);
00403                             } else {
00404                                 ++secal;
00405                                 lcd.locate(11,0);
00406                                 lcd.printf(" ");
00407                                 lcd.locate(11,0);
00408                                 lcd.printf("%02d", secal);
00409                             }
00410                         } else if (p==4) {
00411                             if (dateal==31) {
00412                                 dateal=1;
00413                                 lcd.locate(5,1);
00414                                 lcd.printf(" ");
00415                                 lcd.locate(5,1);
00416                                 lcd.printf("%02d", dateal);
00417                             } else {
00418                                 ++dateal;
00419                                 lcd.locate(5,1);
00420                                 lcd.printf(" ");
00421                                 lcd.locate(5,1);
00422                                 lcd.printf("%02d", dateal);
00423                             }
00424                         } else if (p==5) {
00425                             if (monal==12) {
00426                                 monal=1;
00427                                 lcd.locate(8,1);
00428                                 lcd.printf(" ");
00429                                 lcd.locate(8,1);
00430                                 lcd.printf("%02d", monal);
00431                             } else {
00432                                 ++monal;
00433                                 lcd.locate(8,1);
00434                                 lcd.printf(" ");
00435                                 lcd.locate(8,1);
00436                                 lcd.printf("%02d", monal);
00437                             }
00438                         } else if (p==6) {
00439                             ++yearal;
00440                             lcd.locate(11,1);
00441                             lcd.printf(" ");
00442                             lcd.locate(11,1);
00443                             lcd.printf("%04d", yearal);
00444                         }
00445                     }
00446                     if (button2.falling()) {
00447                         if (p==0) {pw=0;} 
00448                         else{
00449                             pw.period(Tre);
00450                             pw.pulsewidth(Pre);
00451                             wait(0.1);
00452                             pw=0;
00453                         }
00454                         if (p==1) {
00455                             if (houral==0) { // no mostrar nada
00456                                 houral=24;
00457                                 lcd.locate(5,0);
00458                                 lcd.printf(" ");
00459                                 lcd.locate(5,0);
00460                                 lcd.printf("%02d", houral);
00461                             } else {
00462                                 --houral;
00463                                 lcd.locate(5,0);
00464                                 lcd.printf(" ");
00465                                 lcd.locate(5,0);
00466                                 lcd.printf("%02d", houral);
00467                             }
00468                         }
00469                         if (p==2) {
00470                             if (minal==0) { // no mostrar nada
00471                                 minal=59;
00472                                 lcd.locate(8,0);
00473                                 lcd.printf(" ");
00474                                 lcd.locate(8,0);
00475                                 lcd.printf("%02d", minal);
00476                             } else {
00477                                 --minal;
00478                                 lcd.locate(8,0);
00479                                 lcd.printf(" ");
00480                                 lcd.locate(8,0);
00481                                 lcd.printf("%02d", minal);
00482                             }
00483                         }
00484                         if (p==3) {
00485                             if (secal==0) { // no mostrar nada
00486                                 secal=59;
00487                                 lcd.locate(11,0);
00488                                 lcd.printf(" ");
00489                                 lcd.locate(11,0);
00490                                 lcd.printf("%02d", secal);
00491                             } else {
00492                                 --secal;
00493                                 lcd.locate(11,0);
00494                                 lcd.printf(" ");
00495                                 lcd.locate(11,0);
00496                                 lcd.printf("%02d", secal);
00497                             }
00498                         }
00499                         if (p==4) {
00500                             if (dateal==1) { // no mostrar nada
00501                                 dateal=31;
00502                                 lcd.locate(5,1);
00503                                 lcd.printf(" ");
00504                                 lcd.locate(5,1);
00505                                 lcd.printf("%02d", dateal);
00506                             } else {
00507                                 --dateal;
00508                                 lcd.locate(5,1);
00509                                 lcd.printf(" ");
00510                                 lcd.locate(5,1);
00511                                 lcd.printf("%02d", dateal);
00512                             }
00513                         }
00514                         if (p==5) {
00515                             if (monal==1) {
00516                                 monal=12;
00517                                 lcd.locate(8,1);
00518                                 lcd.printf(" ");
00519                                 lcd.locate(8,1);
00520                                 lcd.printf("%02d", monal);
00521                             } else {
00522                                 --monal;
00523                                 lcd.locate(8,1);
00524                                 lcd.printf(" ");
00525                                 lcd.locate(8,1);
00526                                 lcd.printf("%02d", monal);
00527                             }
00528                         }
00529                         if (p==6) {
00530                             if (yearal==2000) {
00531                                 lcd.locate(11,1);
00532                                 lcd.printf(" ");
00533                                 lcd.locate(11,1);
00534                                 lcd.printf("%04d", yearal);
00535                             } else {
00536                                 --yearal;
00537                                 lcd.locate(11,1);
00538                                 lcd.printf(" ");
00539                                 lcd.locate(11,1);
00540                                 lcd.printf("%04d", yearal);
00541                             }
00542                         }
00543                     }
00544                     if (button3.falling()) {//BOTON 3: CAMBIADOR DE VARIABLE (POSICION EN LA LCD)    
00545                         pw.period(Tmi);
00546                         pw.pulsewidth(Pmi);
00547                         wait(0.1);
00548                         pw=0;
00549     
00550                         if (p==0) {
00551                             ++p;
00552                             lcd.locate(5,0);
00553                             lcd.printf(" ");
00554                             lcd.locate(5,0);
00555                             lcd.printf("%02d", houral);
00556                         } else if (p==1) {
00557                             ++p;
00558                             lcd.locate(8,0);
00559                             lcd.printf(" ");
00560                             lcd.locate(8,0);
00561                             lcd.printf("%02d", minal);
00562                         } else if (p==2) {
00563                             ++p;
00564                             lcd.locate(11,0);
00565                             lcd.printf(" ");
00566                             lcd.locate(11,0);
00567                             lcd.printf("%02d", secal);
00568                         } else if (p==3) {
00569                             ++p;
00570                             lcd.locate(5,1);
00571                             lcd.printf(" ");
00572                             lcd.locate(5,1);
00573                             lcd.printf("%02d", dateal);
00574                         } else if (p==4) {
00575                             ++p;
00576                             lcd.locate(8,1);
00577                             lcd.printf(" ");
00578                             lcd.locate(8,1);
00579                             lcd.printf("%02d", monal);
00580                         } else if (p==5) {
00581                             ++p;
00582                             lcd.locate(11,1);
00583                             lcd.printf(" ");
00584                             lcd.locate(11,1);
00585                             lcd.printf("%04d", yearal);
00586                         } else if (p==6) {
00587                             p=0;
00588                         }
00589                     }    
00590                     if (button4.falling()) { //BOTON 4: CAMBIADOR DE MODO
00591                             pw.period(Tfa); // aqui se indica la frecuencia para el sonido al pulsar el boton 1
00592                             pw.pulsewidth(Pfa);
00593                             wait(0.1);
00594                             pw=0;  
00595                             modo=0;
00596                             lcd.locate(0,0);
00597                             lcd.printf("Hora");
00598                     }
00599                 }
00600               }
00601             }       
00602     
00603 }