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

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 "DebouncedIn.h" 
00004 #include "QEI.h"
00005  
00006 Rtc_Ds1307 rtc(PTE0,PTE1);        //Puertos para el modulo
00007 Serial pc(USBTX, USBRX, "pc");    //Puertos para el PC
00008 QEI wheel (PTD5, PTD0, NC, 100);  //Configuracion encoder
00009 DebouncedIn Boton(PTA13);        //Boton Encoder
00010 DigitalOut led1(PTD2);          //Salida
00011 
00012 int Dia=0;
00013 int Mes=0;
00014 int Anio=2015;
00015 int Horas=0;
00016 int Minutos=0;
00017 int Segundos=0;
00018  
00019 char buffer[128];
00020 int readptr = 0;
00021  
00022 int main() 
00023     {
00024     char c;
00025     Rtc_Ds1307::Time_rtc tm = {};
00026     
00027     while(1) 
00028     {      
00029     pc.printf("*************************************\n");
00030     pc.printf("* Menu for RTC Test :               *\n");
00031     pc.printf("* leer  - reads the clock           *\n");
00032     pc.printf("* empezar - start the clock           *\n");
00033     pc.printf("* parar  - stop the clock            *\n");
00034     pc.printf("* configurar - write the clock           *\n");
00035     pc.printf("* ena   - enable Square wave output *\n");
00036     pc.printf("* dis   - disable square wave outp. *\n");
00037     pc.printf("*************************************\n");
00038         
00039         while( (c = pc.getc()) != '\n')
00040         {
00041         buffer[readptr++] = c;
00042         }
00043         buffer[readptr++] = 0;
00044         
00045         // para leer los valores que tiene el reloj 
00046         
00047             if (strncmp(buffer, "leer", 4) == 0)  
00048             {
00049             pc.printf("Performing read operation\n");
00050                 if (rtc.getTime(tm) ) 
00051                 {
00052                 pc.printf("La hora es: %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec);  // coloca en pantalla la hora actual que hay almacenada 
00053                 pc.printf("La fecha es: %s, %02d/%02d/%04d\n", rtc.weekdayToString(tm.wday), tm.mon, tm.date, tm.year); // coloca en pantalla la fecha actual que hay almacenada 
00054                 }
00055             
00056              }   
00057         else if (strncmp(buffer, "configurar", 5) == 0)  // se empieza por configurar el reloj interno
00058             pc.printf("Dia (0..31)");
00059             pc.scanf("%d", &tm.date); // coloca lo que uno le ingrese como dia
00060             pc.printf("Mes (1..12)");
00061             pc.scanf("%d", &tm.mon); // coloca lo que uno le ingrese como mes
00062             pc.printf("Anio");
00063             pc.scanf("%d", &tm.year); // coloca lo que uno le ingrese como año
00064             pc.printf("Hora (0..23)");
00065             pc.scanf("%d", &tm.hour); // coloca lo que uno le ingrese como hora
00066             pc.printf("Minutos (0..59)");
00067             pc.scanf("%d", &tm.min); // coloca lo que uno le ingrese como minutos
00068             pc.printf("Segundos (0..59)");
00069             pc.scanf("%d", &tm.sec); // coloca lo que uno le ingrese como segundos
00070             pc.printf("Performing write operation\n");
00071             
00072             while(pc.readable()) 
00073             pc.getc();
00074             rtc.setTime(tm, false, false);
00075             }
00076             
00077             // para empezar a correr el reloj que se programó arriba
00078             
00079         else if (strncmp(buffer, "empezar", 5) == 0)  
00080             {
00081             readptr = 0;
00082             pc.printf("Dispositivo Iniciado\n");
00083             rtc.startClock();
00084             goto alarma;
00085                         
00086         }
00087         else if (strncmp(buffer, "parar", 4) == 0) // para parar el reloj
00088         {
00089             pc.printf("Performing stop operation\n");
00090             rtc.stopClock();
00091         }
00092         else if (strncmp(buffer, "ena", 3) == 0) 
00093         {
00094             int rs;
00095             pc.printf("Please specify the frequency : [0 = 1Hz, 1 = 4.096kHz, 2 = 8.192kHz, 3 = 32.768kHz] ");
00096             scanf("%d", &rs);
00097             pc.printf("Enabling the output with %d option\n", rs);
00098             rtc.setSquareWaveOutput(true, (Rtc_Ds1307::SqwRateSelect_t)rs);
00099         }
00100         else if (strncmp(buffer, "dis", 3) == 0)
00101         {
00102             pc.printf("Disableing square wave output\n");
00103             rtc.setSquareWaveOutput(false, Rtc_Ds1307::RS1Hz);
00104         }
00105         else 
00106         {
00107             pc.printf("syntax error\n");
00108         }
00109         readptr = 0;
00110         }
00111         
00112          //se inicia a configurar la alarma
00113                  
00114         alarma:         
00115         pc.printf("Configuracion de la alarma\n");
00116         
00117         
00118         Dia:             //empieza con el dia 
00119         while(1)
00120         {         
00121             Dia=Dia+wheel.getPulses();  //con el encoder se aumenta el dia 
00122             wheel.reset();
00123      
00124             if(Dia>=31)
00125             {               //como el dia no tiene mas de 31 dias, se mantiene en 31 al ingresar un valor diferente
00126             Dia=31;
00127             }
00128             else if (Dia<=0)
00129             {          //no se pueden ingresar numeros negativos
00130              Dia=0;
00131             }
00132      pc.printf("Dia=  %d\n",Dia);        //muestra el valor 
00133     
00134     
00135     if(Boton.falling())
00136     {                    //presionando el encoder cambiamos al configurar el mes
00137     goto Mes;
00138     }
00139     }
00140         
00141 Mes:                           //Configuracion del Mes para la alarma
00142 
00143         while(1)
00144         {
00145          
00146         Mes=Mes+wheel.getPulses();     //con el encoder aumentamos el mes 
00147         wheel.reset();
00148         
00149         if(Mes>=12)
00150         {                   //maximo a 12 meses si es mayor, matiene a 12
00151                 Mes=12;
00152             }
00153             else if (Mes<=0)
00154             {                 //se mantiene en 0 
00155              Mes=0;
00156             }
00157      pc.printf("Mes=  %d\n ",Mes);          //muestra el mes
00158     
00159     
00160     if(Boton.falling())
00161     {
00162         goto Anio;
00163     }
00164     
00165             
00166     }
00167      
00168      Anio:
00169         while(1)
00170         {         
00171             Anio=Anio+wheel.getPulses();
00172             wheel.reset();
00173  
00174      
00175             if(Anio>=3000) //se mantiene hasta el año 3000 si se ingresa un año mas grande
00176             {
00177                 Anio=3000;
00178             }
00179             else if (Anio<=2015){ //como estamos en el 2015 una alarma no puede sonar antes de esa fecha
00180              Anio=2015;
00181             }
00182      pc.printf("Anio=  %d\n",Anio);
00183     
00184     
00185     if(Boton.falling()) //presionando el encoder cambiamos a configurar la hora
00186     {
00187         goto Horas;
00188     }
00189         
00190     }
00191     Horas:
00192         while(1)
00193         {
00194         
00195         Horas=Horas+wheel.getPulses();
00196             wheel.reset();
00197         
00198      
00199             if(Horas>=23)
00200             {
00201                 Horas=23;
00202             }
00203             else if (Horas<=0)
00204             {
00205              Horas=0;
00206             }
00207      pc.printf(" Hora=%d\n ",Horas);
00208     
00209     
00210     if(Boton.falling()){  //presionando el encoder cambiamos a configurar los minutos
00211         goto Minutos;
00212     }
00213             
00214             
00215     }
00216      Minutos:
00217         while(1)
00218         {
00219          
00220             Minutos=Minutos+wheel.getPulses();
00221             wheel.reset();
00222      
00223      
00224             if(Minutos>=59)
00225             {
00226                 Minutos=59;
00227             }
00228             else if (Horas<=0)
00229             {
00230              Minutos=0;
00231             }
00232      pc.printf(" Minuto=%d\n ",Minutos);
00233     
00234     
00235     if(Boton.falling())
00236     {
00237         goto comp;
00238     }
00239    
00240     }
00241     
00242     comp:       // para que muestre cuándo quedó configurada la alarma
00243     
00244     pc.printf("La alarma se programara el:   \n");
00245     pc.printf(" Dia=%d    Mes=%d    Anio=%d    Hora=%d    Minuto=%d    Segundo=%d\n ",Dia,Mes,Anio,Horas,Minutos,Segundos);
00246     
00247     wait (3);
00248     
00249     while(1)
00250     {
00251        rtc.getTime(tm);
00252        pc.printf("Hora actual:  %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec);
00253        pc.printf("Fecha actual:  %02d/%02d/%04d\n", tm.mon, tm.date, tm.year);
00254     if(tm.hour>=Horas && tm.min>=Minutos &&tm.sec>=Segundos && tm.mon>=Mes && tm.date>=Dia && tm.year>=Anio){
00255         led1=0;
00256       //  pc.printf("La alarma se ha activado:   \n");
00257     }
00258     else {
00259         led1=1;
00260         }
00261         wait(1);
00262     } 
00263     }