Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: DebouncedIn QEI TextLCD mbed
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 }
Generated on Fri Jul 15 2022 02:10:52 by
1.7.2