Reloj con alarma y snooze
Dependencies: RTC-DS1307-Modificada TextLCD mbed QEI
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
Generated on Wed Jul 13 2022 07:53:11 by 1.7.2