Código para programar una alarma por medio de un encoder y usando un LCD.
Dependencies: DebouncedIn QEI TextLCD mbed
main.cpp@0:d3ef5e53b6d3, 2016-06-01 (annotated)
- Committer:
- gjusecheo
- Date:
- Wed Jun 01 15:29:05 2016 +0000
- Revision:
- 0:d3ef5e53b6d3
Tarea_Alarma
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gjusecheo | 0:d3ef5e53b6d3 | 1 | #include "mbed.h" |
gjusecheo | 0:d3ef5e53b6d3 | 2 | #include "Rtc_Ds1307.h" |
gjusecheo | 0:d3ef5e53b6d3 | 3 | #include "TextLCD.h" |
gjusecheo | 0:d3ef5e53b6d3 | 4 | #include "DebouncedIn.h" |
gjusecheo | 0:d3ef5e53b6d3 | 5 | #include "QEI.h" |
gjusecheo | 0:d3ef5e53b6d3 | 6 | |
gjusecheo | 0:d3ef5e53b6d3 | 7 | TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 |
gjusecheo | 0:d3ef5e53b6d3 | 8 | //RtcCls rtc(p28, p27, p29, true); |
gjusecheo | 0:d3ef5e53b6d3 | 9 | Rtc_Ds1307 rtc(PTE0, PTE1); |
gjusecheo | 0:d3ef5e53b6d3 | 10 | |
gjusecheo | 0:d3ef5e53b6d3 | 11 | Serial pc(USBTX, USBRX, "pc"); |
gjusecheo | 0:d3ef5e53b6d3 | 12 | |
gjusecheo | 0:d3ef5e53b6d3 | 13 | QEI wheel (PTA13, PTD5, NC, 100); // Puertos del encoder |
gjusecheo | 0:d3ef5e53b6d3 | 14 | |
gjusecheo | 0:d3ef5e53b6d3 | 15 | //Se programan los botones |
gjusecheo | 0:d3ef5e53b6d3 | 16 | DebouncedIn BotonENC(PTC17); // botón propio del encoder |
gjusecheo | 0:d3ef5e53b6d3 | 17 | DebouncedIn Boton2(PTE31); // boton utilizado para confirmar |
gjusecheo | 0:d3ef5e53b6d3 | 18 | |
gjusecheo | 0:d3ef5e53b6d3 | 19 | //Salidas digitales para el uso de leds, los cuales simulan el sonido de la alarma |
gjusecheo | 0:d3ef5e53b6d3 | 20 | DigitalOut myled(PTE20); |
gjusecheo | 0:d3ef5e53b6d3 | 21 | DigitalOut myled2(PTE21); |
gjusecheo | 0:d3ef5e53b6d3 | 22 | |
gjusecheo | 0:d3ef5e53b6d3 | 23 | //Se inicializan las variables |
gjusecheo | 0:d3ef5e53b6d3 | 24 | int dia = 1,mes = 1,ano = 2016,hh = 0,mm = 0,ss = 0; |
gjusecheo | 0:d3ef5e53b6d3 | 25 | char buffer[128]; |
gjusecheo | 0:d3ef5e53b6d3 | 26 | int readptr = 0; |
gjusecheo | 0:d3ef5e53b6d3 | 27 | int start = 0; |
gjusecheo | 0:d3ef5e53b6d3 | 28 | int Config; |
gjusecheo | 0:d3ef5e53b6d3 | 29 | int contador = 0; |
gjusecheo | 0:d3ef5e53b6d3 | 30 | |
gjusecheo | 0:d3ef5e53b6d3 | 31 | |
gjusecheo | 0:d3ef5e53b6d3 | 32 | int main() { |
gjusecheo | 0:d3ef5e53b6d3 | 33 | char c; |
gjusecheo | 0:d3ef5e53b6d3 | 34 | Rtc_Ds1307::Time_rtc tm = {}; |
gjusecheo | 0:d3ef5e53b6d3 | 35 | |
gjusecheo | 0:d3ef5e53b6d3 | 36 | while(1) { |
gjusecheo | 0:d3ef5e53b6d3 | 37 | set_reloj: |
gjusecheo | 0:d3ef5e53b6d3 | 38 | pc.printf("*************************************\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 39 | pc.printf("* Menu for RTC Test : *\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 40 | pc.printf("* read - reads the clock *\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 41 | pc.printf("* start - start the clock *\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 42 | pc.printf("* stop - stop the clock *\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 43 | pc.printf("* write - write the clock *\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 44 | pc.printf("*************************************\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 45 | |
gjusecheo | 0:d3ef5e53b6d3 | 46 | while( (c = pc.getc()) != '\n') { |
gjusecheo | 0:d3ef5e53b6d3 | 47 | buffer[readptr++] = c; |
gjusecheo | 0:d3ef5e53b6d3 | 48 | } |
gjusecheo | 0:d3ef5e53b6d3 | 49 | buffer[readptr++] = 0; |
gjusecheo | 0:d3ef5e53b6d3 | 50 | if (strncmp(buffer, "read", 4) == 0) { |
gjusecheo | 0:d3ef5e53b6d3 | 51 | //perform read |
gjusecheo | 0:d3ef5e53b6d3 | 52 | pc.printf("Lectura del reloj\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 53 | |
gjusecheo | 0:d3ef5e53b6d3 | 54 | lop1: if (rtc.getTime(tm) ) { |
gjusecheo | 0:d3ef5e53b6d3 | 55 | |
gjusecheo | 0:d3ef5e53b6d3 | 56 | pc.printf("La hora actual es : %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec); // Me entrega la hora actual |
gjusecheo | 0:d3ef5e53b6d3 | 57 | 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 |
gjusecheo | 0:d3ef5e53b6d3 | 58 | |
gjusecheo | 0:d3ef5e53b6d3 | 59 | lcd.cls(); |
gjusecheo | 0:d3ef5e53b6d3 | 60 | lcd.locate(0,0); |
gjusecheo | 0:d3ef5e53b6d3 | 61 | lcd.printf("%02d:%02d:%02d", tm.hour, tm.min, tm.sec); // Me entrega la hora actual |
gjusecheo | 0:d3ef5e53b6d3 | 62 | lcd.locate(0,1); |
gjusecheo | 0:d3ef5e53b6d3 | 63 | lcd.printf("%s/%02d/%02d/%4d", rtc.weekdayToString(tm.wday), tm.date, tm.mon, tm.year);// Me entrega la fecha actual |
gjusecheo | 0:d3ef5e53b6d3 | 64 | wait_ms(200); |
gjusecheo | 0:d3ef5e53b6d3 | 65 | if(BotonENC.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 66 | goto set_prev; |
gjusecheo | 0:d3ef5e53b6d3 | 67 | } |
gjusecheo | 0:d3ef5e53b6d3 | 68 | goto lop1; |
gjusecheo | 0:d3ef5e53b6d3 | 69 | } |
gjusecheo | 0:d3ef5e53b6d3 | 70 | |
gjusecheo | 0:d3ef5e53b6d3 | 71 | } |
gjusecheo | 0:d3ef5e53b6d3 | 72 | else if (strncmp(buffer, "write", 5) == 0) { |
gjusecheo | 0:d3ef5e53b6d3 | 73 | // Se despliega el siguiente menú para configurar fecha y hora actual |
gjusecheo | 0:d3ef5e53b6d3 | 74 | |
gjusecheo | 0:d3ef5e53b6d3 | 75 | pc.printf("Ingrese el dia (fecha 1..31):");// Se pide ingresar un número del 1 al 31 equivalente al día del mes |
gjusecheo | 0:d3ef5e53b6d3 | 76 | pc.scanf("%d", &tm.date); |
gjusecheo | 0:d3ef5e53b6d3 | 77 | pc.printf("Ingrese el mes (mes 1..12):"); // se pide ingresar un valor entre 1 y 12 que representa el mes |
gjusecheo | 0:d3ef5e53b6d3 | 78 | pc.scanf("%d", &tm.mon); |
gjusecheo | 0:d3ef5e53b6d3 | 79 | pc.printf("Ingrese el ano (2016):"); // a continuación se ingresa el valor del año |
gjusecheo | 0:d3ef5e53b6d3 | 80 | pc.scanf("%d", &tm.year); |
gjusecheo | 0:d3ef5e53b6d3 | 81 | pc.printf("Ingrese la hora (horas 0..23):");// Luego se ingresa la hora en formato 24 horas |
gjusecheo | 0:d3ef5e53b6d3 | 82 | pc.scanf("%d", &tm.hour); |
gjusecheo | 0:d3ef5e53b6d3 | 83 | pc.printf("Ingrese los minutos (minutos 0..59):");// Se ingresan los minutos |
gjusecheo | 0:d3ef5e53b6d3 | 84 | pc.scanf("%d", &tm.min); |
gjusecheo | 0:d3ef5e53b6d3 | 85 | pc.printf("Ingrese los segundos (segundos 0..59)"); //Y por último los segundos (cualquier valor, ya que es díficil su precisión) |
gjusecheo | 0:d3ef5e53b6d3 | 86 | pc.scanf("%d", &tm.sec); |
gjusecheo | 0:d3ef5e53b6d3 | 87 | pc.printf("Ingrese el dia(Sab=0, Dom=1, Lun=2, Mar=3, Mier=4, Juev=5, Vier=6):"); |
gjusecheo | 0:d3ef5e53b6d3 | 88 | pc.scanf("%d", &tm.wday); |
gjusecheo | 0:d3ef5e53b6d3 | 89 | pc.printf("Realizando la operacion... Por favor espere\n"); // Se espera la configuración de esos valores |
gjusecheo | 0:d3ef5e53b6d3 | 90 | |
gjusecheo | 0:d3ef5e53b6d3 | 91 | while(pc.readable()) |
gjusecheo | 0:d3ef5e53b6d3 | 92 | pc.getc(); |
gjusecheo | 0:d3ef5e53b6d3 | 93 | rtc.setTime(tm, false, false); |
gjusecheo | 0:d3ef5e53b6d3 | 94 | } |
gjusecheo | 0:d3ef5e53b6d3 | 95 | else if (strncmp(buffer, "start", 5) == 0) { |
gjusecheo | 0:d3ef5e53b6d3 | 96 | // start |
gjusecheo | 0:d3ef5e53b6d3 | 97 | readptr = 0; |
gjusecheo | 0:d3ef5e53b6d3 | 98 | lcd.cls(); |
gjusecheo | 0:d3ef5e53b6d3 | 99 | lcd.locate(0,0); |
gjusecheo | 0:d3ef5e53b6d3 | 100 | lcd.printf("Dispositivo"); |
gjusecheo | 0:d3ef5e53b6d3 | 101 | lcd.locate(0,1); |
gjusecheo | 0:d3ef5e53b6d3 | 102 | lcd.printf("Iniciado"); |
gjusecheo | 0:d3ef5e53b6d3 | 103 | pc.printf("Dispositivo Iniciado\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 104 | rtc.startClock(); |
gjusecheo | 0:d3ef5e53b6d3 | 105 | |
gjusecheo | 0:d3ef5e53b6d3 | 106 | } |
gjusecheo | 0:d3ef5e53b6d3 | 107 | else if (strncmp(buffer, "stop", 4) == 0) { |
gjusecheo | 0:d3ef5e53b6d3 | 108 | // stop |
gjusecheo | 0:d3ef5e53b6d3 | 109 | pc.printf("Dispositivo detenido\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 110 | rtc.stopClock(); |
gjusecheo | 0:d3ef5e53b6d3 | 111 | } |
gjusecheo | 0:d3ef5e53b6d3 | 112 | else { |
gjusecheo | 0:d3ef5e53b6d3 | 113 | pc.printf("syntax error\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 114 | } |
gjusecheo | 0:d3ef5e53b6d3 | 115 | readptr = 0; |
gjusecheo | 0:d3ef5e53b6d3 | 116 | } |
gjusecheo | 0:d3ef5e53b6d3 | 117 | |
gjusecheo | 0:d3ef5e53b6d3 | 118 | set_prev: /// Función de verificación, se usa para confirmar la hora y fecha del reloj y luego pasar a configurar la hora |
gjusecheo | 0:d3ef5e53b6d3 | 119 | |
gjusecheo | 0:d3ef5e53b6d3 | 120 | pc.printf("Es correcto? Si = 1 No = 2\n"); // se habilita esta opción para que el usuario |
gjusecheo | 0:d3ef5e53b6d3 | 121 | pc.scanf("%d", &Config); // verifique si la configuración ingresada es correcta o no |
gjusecheo | 0:d3ef5e53b6d3 | 122 | |
gjusecheo | 0:d3ef5e53b6d3 | 123 | if (Config == 2){ // Si se presiona 2, hubo errores en la configuración |
gjusecheo | 0:d3ef5e53b6d3 | 124 | readptr = 0; |
gjusecheo | 0:d3ef5e53b6d3 | 125 | goto set_reloj; // se regresa a la función set_reloj para volver a configurar |
gjusecheo | 0:d3ef5e53b6d3 | 126 | } |
gjusecheo | 0:d3ef5e53b6d3 | 127 | |
gjusecheo | 0:d3ef5e53b6d3 | 128 | |
gjusecheo | 0:d3ef5e53b6d3 | 129 | else if (Config == 1){ // se si presiona 1, la configuración fue correcta |
gjusecheo | 0:d3ef5e53b6d3 | 130 | |
gjusecheo | 0:d3ef5e53b6d3 | 131 | pc.printf("Dispositivo Configurado Correctamente Espere ....\n"); // se espera un tiempo |
gjusecheo | 0:d3ef5e53b6d3 | 132 | wait(3); |
gjusecheo | 0:d3ef5e53b6d3 | 133 | goto set_alarma; // y se va a la función correspondiente a la alarma |
gjusecheo | 0:d3ef5e53b6d3 | 134 | } |
gjusecheo | 0:d3ef5e53b6d3 | 135 | else { |
gjusecheo | 0:d3ef5e53b6d3 | 136 | pc.printf("syntax error\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 137 | goto set_prev; |
gjusecheo | 0:d3ef5e53b6d3 | 138 | } |
gjusecheo | 0:d3ef5e53b6d3 | 139 | //termina la función set_prev |
gjusecheo | 0:d3ef5e53b6d3 | 140 | |
gjusecheo | 0:d3ef5e53b6d3 | 141 | // Aquí se encuentra la función ALARMA, en la cual se configura los valores para la activación de esta |
gjusecheo | 0:d3ef5e53b6d3 | 142 | set_alarma: |
gjusecheo | 0:d3ef5e53b6d3 | 143 | pc.printf("******* Configuracion Alarma *******\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 144 | |
gjusecheo | 0:d3ef5e53b6d3 | 145 | set_dia: // Para que el usuario ingrese el día con el encoder |
gjusecheo | 0:d3ef5e53b6d3 | 146 | while(1){ |
gjusecheo | 0:d3ef5e53b6d3 | 147 | |
gjusecheo | 0:d3ef5e53b6d3 | 148 | dia=dia+wheel.getPulses(); |
gjusecheo | 0:d3ef5e53b6d3 | 149 | wheel.reset(); |
gjusecheo | 0:d3ef5e53b6d3 | 150 | |
gjusecheo | 0:d3ef5e53b6d3 | 151 | if(dia>=31){ //En este if, se garantiza que los días esten entre 1 y 31 |
gjusecheo | 0:d3ef5e53b6d3 | 152 | dia=31; |
gjusecheo | 0:d3ef5e53b6d3 | 153 | } |
gjusecheo | 0:d3ef5e53b6d3 | 154 | else if (dia<=1){ |
gjusecheo | 0:d3ef5e53b6d3 | 155 | dia=1; |
gjusecheo | 0:d3ef5e53b6d3 | 156 | } |
gjusecheo | 0:d3ef5e53b6d3 | 157 | |
gjusecheo | 0:d3ef5e53b6d3 | 158 | pc.printf(">Dia=%d Mes=%d Ano=%d Hora=%d Min=%d Seg=%d\n ",dia,mes,ano,hh,mm,ss); |
gjusecheo | 0:d3ef5e53b6d3 | 159 | wait(3); |
gjusecheo | 0:d3ef5e53b6d3 | 160 | |
gjusecheo | 0:d3ef5e53b6d3 | 161 | // A continuación se programan los botones del encoder para configurar con este las diferentes necesidades de la alarma |
gjusecheo | 0:d3ef5e53b6d3 | 162 | |
gjusecheo | 0:d3ef5e53b6d3 | 163 | if(BotonENC.falling()){ // Con el boton del encoder se pasa ingresar el siguiente dato necesario |
gjusecheo | 0:d3ef5e53b6d3 | 164 | goto set_mes; |
gjusecheo | 0:d3ef5e53b6d3 | 165 | } |
gjusecheo | 0:d3ef5e53b6d3 | 166 | if(Boton2.falling()){ // Boton para aceptar la alarma y proceder a activarla |
gjusecheo | 0:d3ef5e53b6d3 | 167 | goto set_comp; |
gjusecheo | 0:d3ef5e53b6d3 | 168 | } |
gjusecheo | 0:d3ef5e53b6d3 | 169 | |
gjusecheo | 0:d3ef5e53b6d3 | 170 | |
gjusecheo | 0:d3ef5e53b6d3 | 171 | } |
gjusecheo | 0:d3ef5e53b6d3 | 172 | |
gjusecheo | 0:d3ef5e53b6d3 | 173 | set_mes: |
gjusecheo | 0:d3ef5e53b6d3 | 174 | while(1){ |
gjusecheo | 0:d3ef5e53b6d3 | 175 | |
gjusecheo | 0:d3ef5e53b6d3 | 176 | mes=mes+wheel.getPulses(); |
gjusecheo | 0:d3ef5e53b6d3 | 177 | wheel.reset(); |
gjusecheo | 0:d3ef5e53b6d3 | 178 | |
gjusecheo | 0:d3ef5e53b6d3 | 179 | if(mes>=12){ // Se garantiza que el valor del mes se encuentre entre los valores 1 y 12 |
gjusecheo | 0:d3ef5e53b6d3 | 180 | mes=12; |
gjusecheo | 0:d3ef5e53b6d3 | 181 | } |
gjusecheo | 0:d3ef5e53b6d3 | 182 | else if (mes<=1){ |
gjusecheo | 0:d3ef5e53b6d3 | 183 | mes=1; |
gjusecheo | 0:d3ef5e53b6d3 | 184 | } |
gjusecheo | 0:d3ef5e53b6d3 | 185 | pc.printf(" Dia=%d >Mes=%d Ano=%d Hora=%d Min=%d Seg=%d\n ",dia,mes,ano,hh,mm,ss); |
gjusecheo | 0:d3ef5e53b6d3 | 186 | wait(3); |
gjusecheo | 0:d3ef5e53b6d3 | 187 | |
gjusecheo | 0:d3ef5e53b6d3 | 188 | if(BotonENC.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 189 | goto set_ano; |
gjusecheo | 0:d3ef5e53b6d3 | 190 | } |
gjusecheo | 0:d3ef5e53b6d3 | 191 | if(Boton2.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 192 | goto set_comp; |
gjusecheo | 0:d3ef5e53b6d3 | 193 | } |
gjusecheo | 0:d3ef5e53b6d3 | 194 | |
gjusecheo | 0:d3ef5e53b6d3 | 195 | } |
gjusecheo | 0:d3ef5e53b6d3 | 196 | set_ano: |
gjusecheo | 0:d3ef5e53b6d3 | 197 | while(1){ |
gjusecheo | 0:d3ef5e53b6d3 | 198 | |
gjusecheo | 0:d3ef5e53b6d3 | 199 | ano=ano+wheel.getPulses(); |
gjusecheo | 0:d3ef5e53b6d3 | 200 | wheel.reset(); |
gjusecheo | 0:d3ef5e53b6d3 | 201 | |
gjusecheo | 0:d3ef5e53b6d3 | 202 | if(ano>=2100){ //Se programan alarmas para los próximos 84 años (entre los años 2016 y 2030) |
gjusecheo | 0:d3ef5e53b6d3 | 203 | ano=2100; |
gjusecheo | 0:d3ef5e53b6d3 | 204 | } |
gjusecheo | 0:d3ef5e53b6d3 | 205 | else if (ano<=2016){ |
gjusecheo | 0:d3ef5e53b6d3 | 206 | ano=2016; |
gjusecheo | 0:d3ef5e53b6d3 | 207 | } |
gjusecheo | 0:d3ef5e53b6d3 | 208 | pc.printf(" Dia=%d Mes=%d >Ano=%d Hora=%d Min=%d Seg=%d\n ",dia,mes,ano,hh,mm,ss); |
gjusecheo | 0:d3ef5e53b6d3 | 209 | wait(3); |
gjusecheo | 0:d3ef5e53b6d3 | 210 | |
gjusecheo | 0:d3ef5e53b6d3 | 211 | if(BotonENC.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 212 | goto set_hh; |
gjusecheo | 0:d3ef5e53b6d3 | 213 | } |
gjusecheo | 0:d3ef5e53b6d3 | 214 | if(Boton2.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 215 | goto set_comp; |
gjusecheo | 0:d3ef5e53b6d3 | 216 | } |
gjusecheo | 0:d3ef5e53b6d3 | 217 | |
gjusecheo | 0:d3ef5e53b6d3 | 218 | } |
gjusecheo | 0:d3ef5e53b6d3 | 219 | set_hh: |
gjusecheo | 0:d3ef5e53b6d3 | 220 | while(1){ |
gjusecheo | 0:d3ef5e53b6d3 | 221 | |
gjusecheo | 0:d3ef5e53b6d3 | 222 | hh=hh+wheel.getPulses(); |
gjusecheo | 0:d3ef5e53b6d3 | 223 | wheel.reset(); |
gjusecheo | 0:d3ef5e53b6d3 | 224 | |
gjusecheo | 0:d3ef5e53b6d3 | 225 | if(hh>=23){ // Las horas deben encontrarse siempre en el rango de 0 a 23 (La hora 24 = La hora 0) |
gjusecheo | 0:d3ef5e53b6d3 | 226 | hh=23; |
gjusecheo | 0:d3ef5e53b6d3 | 227 | } |
gjusecheo | 0:d3ef5e53b6d3 | 228 | else if (hh<=0){ |
gjusecheo | 0:d3ef5e53b6d3 | 229 | hh=0; |
gjusecheo | 0:d3ef5e53b6d3 | 230 | } |
gjusecheo | 0:d3ef5e53b6d3 | 231 | pc.printf(" Dia=%d Mes=%d Ano=%d >Hora=%d Min=%d Seg=%d\n ",dia,mes,ano,hh,mm,ss); |
gjusecheo | 0:d3ef5e53b6d3 | 232 | wait(3); |
gjusecheo | 0:d3ef5e53b6d3 | 233 | |
gjusecheo | 0:d3ef5e53b6d3 | 234 | if(BotonENC.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 235 | goto set_mm; |
gjusecheo | 0:d3ef5e53b6d3 | 236 | } |
gjusecheo | 0:d3ef5e53b6d3 | 237 | if(Boton2.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 238 | goto set_comp; |
gjusecheo | 0:d3ef5e53b6d3 | 239 | } |
gjusecheo | 0:d3ef5e53b6d3 | 240 | |
gjusecheo | 0:d3ef5e53b6d3 | 241 | } |
gjusecheo | 0:d3ef5e53b6d3 | 242 | set_mm: |
gjusecheo | 0:d3ef5e53b6d3 | 243 | while(1){ |
gjusecheo | 0:d3ef5e53b6d3 | 244 | |
gjusecheo | 0:d3ef5e53b6d3 | 245 | mm=mm+wheel.getPulses(); |
gjusecheo | 0:d3ef5e53b6d3 | 246 | wheel.reset(); |
gjusecheo | 0:d3ef5e53b6d3 | 247 | |
gjusecheo | 0:d3ef5e53b6d3 | 248 | if(mm>=59){ //Minutos siempre positivos entre 0 y 59 (El minuto 60 es igual al 0) |
gjusecheo | 0:d3ef5e53b6d3 | 249 | mm=59; |
gjusecheo | 0:d3ef5e53b6d3 | 250 | } |
gjusecheo | 0:d3ef5e53b6d3 | 251 | else if (mm<=0){ |
gjusecheo | 0:d3ef5e53b6d3 | 252 | mm=0; |
gjusecheo | 0:d3ef5e53b6d3 | 253 | } |
gjusecheo | 0:d3ef5e53b6d3 | 254 | pc.printf(" Dia=%d Mes=%d Ano=%d Hora=%d >Min=%d Seg=%d\n ",dia,mes,ano,hh,mm,ss); |
gjusecheo | 0:d3ef5e53b6d3 | 255 | wait(3); |
gjusecheo | 0:d3ef5e53b6d3 | 256 | |
gjusecheo | 0:d3ef5e53b6d3 | 257 | if(BotonENC.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 258 | goto set_ss; |
gjusecheo | 0:d3ef5e53b6d3 | 259 | } |
gjusecheo | 0:d3ef5e53b6d3 | 260 | if(Boton2.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 261 | goto set_comp; |
gjusecheo | 0:d3ef5e53b6d3 | 262 | } |
gjusecheo | 0:d3ef5e53b6d3 | 263 | |
gjusecheo | 0:d3ef5e53b6d3 | 264 | } |
gjusecheo | 0:d3ef5e53b6d3 | 265 | |
gjusecheo | 0:d3ef5e53b6d3 | 266 | set_ss: |
gjusecheo | 0:d3ef5e53b6d3 | 267 | while(1){ |
gjusecheo | 0:d3ef5e53b6d3 | 268 | |
gjusecheo | 0:d3ef5e53b6d3 | 269 | ss=ss+wheel.getPulses(); |
gjusecheo | 0:d3ef5e53b6d3 | 270 | wheel.reset(); |
gjusecheo | 0:d3ef5e53b6d3 | 271 | |
gjusecheo | 0:d3ef5e53b6d3 | 272 | if(ss>=59){ //De nuevo, en un minuto hay 60 segundos ( partiendo del 0 al 59) |
gjusecheo | 0:d3ef5e53b6d3 | 273 | ss=59; |
gjusecheo | 0:d3ef5e53b6d3 | 274 | } |
gjusecheo | 0:d3ef5e53b6d3 | 275 | else if (ss<=0){ |
gjusecheo | 0:d3ef5e53b6d3 | 276 | ss=0; |
gjusecheo | 0:d3ef5e53b6d3 | 277 | } |
gjusecheo | 0:d3ef5e53b6d3 | 278 | pc.printf(" Dia=%d Mes=%d Ano=%d Hora=%d Min=%d >Seg=%d\n ",dia,mes,ano,hh,mm,ss); |
gjusecheo | 0:d3ef5e53b6d3 | 279 | wait(3); |
gjusecheo | 0:d3ef5e53b6d3 | 280 | |
gjusecheo | 0:d3ef5e53b6d3 | 281 | if(BotonENC.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 282 | goto set_dia; |
gjusecheo | 0:d3ef5e53b6d3 | 283 | } |
gjusecheo | 0:d3ef5e53b6d3 | 284 | if(Boton2.falling()){ |
gjusecheo | 0:d3ef5e53b6d3 | 285 | goto set_comp; |
gjusecheo | 0:d3ef5e53b6d3 | 286 | } |
gjusecheo | 0:d3ef5e53b6d3 | 287 | |
gjusecheo | 0:d3ef5e53b6d3 | 288 | } |
gjusecheo | 0:d3ef5e53b6d3 | 289 | |
gjusecheo | 0:d3ef5e53b6d3 | 290 | // 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 |
gjusecheo | 0:d3ef5e53b6d3 | 291 | set_comp: |
gjusecheo | 0:d3ef5e53b6d3 | 292 | |
gjusecheo | 0:d3ef5e53b6d3 | 293 | pc.printf("***Datos ingresados para alarma****\n"); |
gjusecheo | 0:d3ef5e53b6d3 | 294 | pc.printf(" Dia=%d Mes=%d Ano=%d Hora=%d Min=%d Seg=%d\n ",dia,mes,ano,hh,mm,ss); |
gjusecheo | 0:d3ef5e53b6d3 | 295 | |
gjusecheo | 0:d3ef5e53b6d3 | 296 | while(1){ |
gjusecheo | 0:d3ef5e53b6d3 | 297 | rtc.getTime(tm); |
gjusecheo | 0:d3ef5e53b6d3 | 298 | pc.printf("El tiempo actual es : %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec); |
gjusecheo | 0:d3ef5e53b6d3 | 299 | pc.printf("La fecha actual es %s, %02d/%02d/%04d\n", rtc.weekdayToString(tm.wday), tm.mon, tm.date, tm.year); |
gjusecheo | 0:d3ef5e53b6d3 | 300 | lcd.cls(); |
gjusecheo | 0:d3ef5e53b6d3 | 301 | lcd.locate(0,0); |
gjusecheo | 0:d3ef5e53b6d3 | 302 | lcd.printf("%02d:%02d:%02d", tm.hour, tm.min, tm.sec); |
gjusecheo | 0:d3ef5e53b6d3 | 303 | lcd.locate(0,1); |
gjusecheo | 0:d3ef5e53b6d3 | 304 | lcd.printf("%s/%02d/%02d/%4d", rtc.weekdayToString(tm.wday), tm.date, tm.mon, tm.year); |
gjusecheo | 0:d3ef5e53b6d3 | 305 | wait_ms(200); |
gjusecheo | 0:d3ef5e53b6d3 | 306 | if(tm.hour>=hh && tm.min>=mm &&tm.sec>=ss && tm.mon>=mes && tm.date>=dia && tm.year>=ano){ |
gjusecheo | 0:d3ef5e53b6d3 | 307 | alarma1: |
gjusecheo | 0:d3ef5e53b6d3 | 308 | |
gjusecheo | 0:d3ef5e53b6d3 | 309 | myled=0; // En estas líneas de código se busca mostrar el funcionamiento de la alarma cuando |
gjusecheo | 0:d3ef5e53b6d3 | 310 | myled2=1; // esta es encendida mediante el encendido y apagado alternado de dos diodos leds. |
gjusecheo | 0:d3ef5e53b6d3 | 311 | wait(0.5); // con un pequeño tiempo de diferencia para lograr dicho efecto. |
gjusecheo | 0:d3ef5e53b6d3 | 312 | myled=1; |
gjusecheo | 0:d3ef5e53b6d3 | 313 | myled2=0; |
gjusecheo | 0:d3ef5e53b6d3 | 314 | wait(0.5); |
gjusecheo | 0:d3ef5e53b6d3 | 315 | |
gjusecheo | 0:d3ef5e53b6d3 | 316 | if(BotonENC.falling()){ // Si la alarma esta activada y se presiona el boton del encoder se pasa a la función snooze |
gjusecheo | 0:d3ef5e53b6d3 | 317 | goto snooze; |
gjusecheo | 0:d3ef5e53b6d3 | 318 | } |
gjusecheo | 0:d3ef5e53b6d3 | 319 | if(Boton2.falling()){ // Si la alarma esta activada y se presiona el boton externo se desactiva la alarma y ya solo muestra la hora |
gjusecheo | 0:d3ef5e53b6d3 | 320 | myled=0; |
gjusecheo | 0:d3ef5e53b6d3 | 321 | myled2=0; |
gjusecheo | 0:d3ef5e53b6d3 | 322 | goto lop1; |
gjusecheo | 0:d3ef5e53b6d3 | 323 | } |
gjusecheo | 0:d3ef5e53b6d3 | 324 | |
gjusecheo | 0:d3ef5e53b6d3 | 325 | } |
gjusecheo | 0:d3ef5e53b6d3 | 326 | } |
gjusecheo | 0:d3ef5e53b6d3 | 327 | snooze: // Se desactivan ambos leds representando que se detuvo la alarma |
gjusecheo | 0:d3ef5e53b6d3 | 328 | myled=0; |
gjusecheo | 0:d3ef5e53b6d3 | 329 | myled2=0; |
gjusecheo | 0:d3ef5e53b6d3 | 330 | contador = contador+1; // El contador se usa para permitir que lafunción snooze solo se active 3 veces |
gjusecheo | 0:d3ef5e53b6d3 | 331 | if (contador == 4){ |
gjusecheo | 0:d3ef5e53b6d3 | 332 | goto lop1; // Cuando se activa la cuarta vez, el boton del encoder la alarma se desactiva |
gjusecheo | 0:d3ef5e53b6d3 | 333 | } |
gjusecheo | 0:d3ef5e53b6d3 | 334 | wait(10); // Espera 10 segundos para volver a activar la alarma |
gjusecheo | 0:d3ef5e53b6d3 | 335 | goto alarma1; |
gjusecheo | 0:d3ef5e53b6d3 | 336 | } |