Procesadores, 2016 - II. Tarea #2. Oswaldo Andrés Giraldo Giraldo, Héctor Andrés Hoyos Ceballos, Jose Fernando Montoya Vargas, María Fernanda Villa Tamayo. Programa para establecer alarmas con ayuda del reloj DS1307 por comunicación I2C.
Dependencies: Debounced QEI RTC-DS1307 TextLCD mbed
Fork of Reloj_alarma by
main.cpp
- Committer:
- joshema216
- Date:
- 2016-11-16
- Revision:
- 2:cb1f588caed7
- Parent:
- 1:0639f31dd59f
File content as of revision 2:cb1f588caed7:
// Programa para configurar 4 alarmas con el reloj DS1307 por comunicación I2C. Se configurarán los tiempos de // encendido y apagado de cada una de las alarmas y la acción de las mismas se verá representada por el estado // de un LED para cada una (cuando se active una alarma se deberá encender, cuando se desactive se deberá de // apagar), por lo que las alarmas son independientes. Luego, se deberá estar comparando constantemente el // tiempo actual con cada una de las alarmas por a parte. // Oswaldo Andrés Giraldo Giraldo - C.C.: 1152458465 // Héctor Andrés Hoyos Ceballos - C.C.: 1039466317 // Jose Fernando Montoya Vargas - C.C.: 1039468676 // María Fernanda Villa Tamayo - C.C.: 1152457490 #include "mbed.h" #include "DebouncedIn.h" // Librería para los botones. #include "TextLCD.h" #include "QEI.h" #include "Rtc_Ds1307.h" TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // RS, E, D4 - D7 Rtc_Ds1307 rtc(PTE0, PTE1); // Configura el reloj. QEI wheel (PTA13, PTD5, NC, 48); // Configura el encoder. DebouncedIn button_enco(PTC16); // Configura el botón del encoder. DigitalOut ALED1(PTA5);// Salida del LED de la alarma 1. DigitalOut ALED2(PTA4);// Salida del LED de la alarma 2. DigitalOut ALED3(PTA12);// Salida del LED de la alarma 3. DigitalOut ALED4(PTD4);// Salida del LED de la alarma 4. Serial pc(USBTX, USBRX); // TX, RX. int C1 = 0x0C; int m; int Conf = 0; // 0: Reloj, 1: Alarmas. int Lugar = 0; // Definen el punto en el cual va el programa. int i = 0, ala = 1, a1 = 0, a2 = 0, a3 = 0, a4 = 0, cont = 0; int visual = 0; int alarma = 0; int main(){ Rtc_Ds1307::Time_rtc tm = {}; // Inicializa el reloj. Rtc_Ds1307::Time_rtc A1on = {}; // Inicializa el tiempo de encendido de la alarma 1. Rtc_Ds1307::Time_rtc A2on = {}; // Inicializa el tiempo de encendido de la alarma 2. Rtc_Ds1307::Time_rtc A3on = {}; // Inicializa el tiempo de encendido de la alarma 3. Rtc_Ds1307::Time_rtc A4on = {}; // Inicializa el tiempo de encendido de la alarma 4. Rtc_Ds1307::Time_rtc A1off = {}; // Inicializa el tiempo de apagado de la alarma 1. Rtc_Ds1307::Time_rtc A2off = {}; // Inicializa el tiempo de apagado de la alarma 2. Rtc_Ds1307::Time_rtc A3off = {}; // Inicializa el tiempo de apagado de la alarma 3. Rtc_Ds1307::Time_rtc A4off = {}; // Inicializa el tiempo de apagado de la alarma 4. lcd.cls(); // Borra la pantalla. lcd.writeCommand(C1); // Escribimos un comando segun el manual del modulo LCD. lcd.locate(0,0); lcd.printf("** Reloj de"); lcd.locate(0,1); lcd.printf(" 4 alarmas **"); wait(2); lcd.cls(); lcd.locate(0,0); lcd.printf("--Reloj"); // Sin flechas. lcd.locate(0,1); lcd.printf("--Alarmas"); rtc.getTime(tm); // Lee el tiempo del DS1307. Leyó todo el hijuemadre reloj de un golpe, hora, min, seg y lo mete en tm while(1){ // Etapa de menú. if (Lugar == 0){ // Varía entre reloj y alarma. Por el boton del encoder incrementa una variable que se llama lugar. m = wheel.getPulses(); // m son los datos del encoder. if(m!=0 && Conf == 0){// Si se movió el encoder y está en Reloj. Conf = 1; // Lo cambia a Alarmas. wheel.reset(); // Si está en un estado inferior, la resetea. m=0; ala++; pc.printf("%d", ala, "\n"); } if(m!=0 && Conf == 1){ // Si se movió el encoder y está en Alarmas. Conf = 0; // Lo pone en Reloj. wheel.reset(); // Resetea. m=0; ala = 1; pc.printf("%d", ala, "\n"); } if(Conf == 0){ // Si la configuración cambia pone la flechita en Reloj. lcd.locate(1,1); lcd.printf("-"); lcd.locate(1,0); lcd.printf(">"); lcd.locate(16,1); wait(0.1); } if(Conf == 1){ // Poner la flechita en Alarmas. lcd.locate(1,0); lcd.printf("-"); lcd.locate(1,1); // Tira la flechita para abajo. lcd.printf(">"); lcd.locate(16,1); wait(0.1); } if (button_enco.falling()){ // Si se pulsa botón del encoder. Lugar++; //aumenta lugar m = 0; pc.printf("%d", Conf, "\n"); pc.printf("%d", ala, "\n"); } } // Etapa de llenado de variables (Reloj y Alarmas). else if (Lugar == 1){ if (i == 0){ if(Conf == 0){ // Empieza a configurar el Reloj. lcd.cls(); lcd.locate(0,0); lcd.printf("Configurar reloj"); wait(1.5); lcd.cls(); i++; m = 0; } if(Conf == 1 && ala == 2){ // Empieza a configurar inicialmente la alarma 1 encendido. lcd.cls(); lcd.locate(0,0); lcd.printf("Config. Alarma 1"); lcd.locate(0,1); lcd.printf("encendido"); wait(1.5); lcd.cls(); i++; m=0; } if(Conf == 1 && ala == 3){ // Configurar alarma 1 apagado. lcd.cls(); lcd.locate(0,0); lcd.printf("Config. Alarma 1"); lcd.locate(0,1); lcd.printf("apagado"); wait(1.5); lcd.cls(); i++; m=0; } if(Conf == 1 && ala == 4){ // Configurar alarma 3 encendido. lcd.cls(); lcd.locate(0,0); lcd.printf("Config. Alarma 2"); lcd.locate(0,1); lcd.printf("encendido"); wait(1.5); lcd.cls(); i++; m=0; } if(Conf == 1 && ala == 5){ // Configurar alarma 2 apagado. lcd.cls(); lcd.locate(0,0); lcd.printf("Config. Alarma 2"); lcd.locate(0,1); lcd.printf("apagado"); wait(1.5); lcd.cls(); i++; m=0; } if(Conf == 1 && ala == 6){ // Configurar alarma 3 encendido. lcd.cls(); lcd.locate(0,0); lcd.printf("Config. Alarma 3"); lcd.locate(0,1); lcd.printf("encendido"); wait(1.5); lcd.cls(); i++; m=0; } if(Conf == 1 && ala == 7){ // Configurar alarma 3 apagado. lcd.cls(); lcd.locate(0,0); lcd.printf("Config. Alarma 3"); lcd.locate(0,1); lcd.printf("apagado"); wait(1.5); lcd.cls(); i++; m=0; } if(Conf == 1 && ala == 8){ // Configurar alarma 4 encendido. lcd.cls(); lcd.locate(0,0); lcd.printf("Config. Alarma 4"); lcd.locate(0,1); lcd.printf("encendido"); wait(1.5); lcd.cls(); i++; m=0; } if(Conf == 1 && ala == 9){ // Configurar alarma 4 apagado. lcd.cls(); lcd.locate(0,0); lcd.printf("Config. Alarma 4"); lcd.locate(0,1); lcd.printf("apagado"); wait(1.5); lcd.cls(); i++; m=0; } } if (i == 1){ // Modificar Día. //pc.printf("Estoy en el llenado.\n"); m = wheel.getPulses(); if (m!=0) { tm.date = tm.date+m; // modifica el dia, maximo en 31 y min en 1 if(tm.date > 31){ tm.date=1; } if(tm.date<1){ tm.date=1; } wheel.reset(); m = 0; } lcd.locate(0,0); lcd.printf("Dia: "); lcd.locate(5,0); lcd.printf("%02d",tm.date); if (button_enco.falling()){ i++; m=0; } } else if (i == 2){ // Modificar Mes. m = wheel.getPulses(); if (m!=0) { tm.mon=tm.mon+m; if(tm.mon>12){ tm.mon=1; } if(tm.mon<1){ tm.mon=1; } wheel.reset(); m=0; } lcd.locate(0,0); lcd.printf("Mes: "); lcd.locate(5,0); lcd.printf("%02d",tm.mon); if (button_enco.falling()){ i++; m=0; } } else if (i == 3){ // Modificar Año. m = wheel.getPulses(); if (m!=0){ tm.year=tm.year+m; if(tm.year>2032){ tm.year=2016; } if(tm.year<2000){ tm.year=2000; } wheel.reset(); m=0; } lcd.locate(0,0); lcd.printf("Year: "); lcd.locate(6,0); lcd.printf("%02d",tm.year); if (button_enco.falling()){ i++; m = 0; } } else if (i == 4){ // Modificar Hora. m = wheel.getPulses(); if (m!=0){ tm.hour=tm.hour + m; if(tm.hour>23){ tm.hour=0; } if(tm.hour<0){ tm.hour=0; } wheel.reset(); m=0; } lcd.locate(0,0); lcd.printf("Hora: "); lcd.locate(6,0); lcd.printf("%02d",tm.hour); lcd.locate(8,0); lcd.printf(" "); if (button_enco.falling()){ i++; m = 0; } } else if (i == 5){ // Modificar Minuto. m = wheel.getPulses(); if (m!=0){ tm.min=tm.min+m; if(tm.min>59){ tm.min=0; } if(tm.min<0){ tm.min=0; } wheel.reset(); m = 0; } lcd.locate(0,0); lcd.printf("Minuto: "); lcd.locate(8,0); lcd.printf("%02d",tm.min); if (button_enco.falling()){ i++; m = 0; } } else if (i == 6){ // Modificar Segundo. m = wheel.getPulses(); if (m!=0){ tm.sec=tm.sec+m; if(tm.sec>59){ tm.sec=0; } if(tm.sec<0){ tm.sec=0; } wheel.reset(); m = 0; } lcd.locate(0,0); lcd.printf("Segundo: "); lcd.locate(9,0); lcd.printf("%02d",tm.sec); if (button_enco.falling()){ // Empieza a asignar los datos del Reloj o las Alarmas. if(Conf == 0){ // Asignar datos del Reloj. rtc.setTime(tm, false, false); pc.printf("Actualice el Reloj.\n"); rtc.startClock(); lcd.cls(); lcd.locate(0,0); lcd.printf("Reloj"); lcd.locate(0,1); lcd.printf("configurado"); wait(1.5); i=0; m=0; Lugar = 0; lcd.cls(); lcd.locate(0,0); lcd.printf("--Reloj"); lcd.locate(0,1); lcd.printf("--Alarmas"); ala = 0; } if(Conf == 1 && ala == 2){ // Asignar datos de la Alarma 1 encendido. A1on = tm; // A la alarma le pone todo eso. pc.printf("Actualice Alarma 1 on.\n"); lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 1 (on)"); lcd.locate(0,1); lcd.printf("configurada"); wait(1.5); i=0; m=0; lcd.cls(); } if(Conf == 1 && ala == 3){ // Asignar datos de la Alarma 1 apagado. A1off = tm; // A la alarma le pone todo eso. pc.printf("Actualice Alarma 1 off.\n"); lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 1 (off)"); lcd.locate(0,1); lcd.printf("configurada"); wait(1.5); i=0; m=0; lcd.cls(); } if(Conf == 1 && ala == 4){ // Asignar datos de la Alarma 2 encendido. A2on = tm; // A la alarma le pone todo eso. pc.printf("Actualice Alarma 2 on.\n"); lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 2 (on)"); lcd.locate(0,1); lcd.printf("configurada"); wait(1.5); i=0; m=0; lcd.cls(); } if(Conf == 1 && ala == 5){ // Asignar datos de la Alarma 2 apagado. A2off = tm; // A la alarma le pone todo eso. pc.printf("Actualice Alarma 2 off.\n"); lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 2 (off)"); lcd.locate(0,1); lcd.printf("configurada"); wait(1.5); i=0; m=0; lcd.cls(); } if(Conf == 1 && ala == 6){ // Asignar datos de la Alarma 3 encendido. A3on = tm; // A la alarma le pone todo eso. pc.printf("Actualice Alarma 3 on.\n"); lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 3 (on)"); lcd.locate(0,1); lcd.printf("configurada"); wait(1.5); i=0; m=0; lcd.cls(); } if(Conf == 1 && ala == 7){ // Asignar datos de la Alarma 3 apagado. A3off = tm; // A la alarma le pone todo eso. pc.printf("Actualice Alarma 3 off.\n"); lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 3 (off)"); lcd.locate(0,1); lcd.printf("configurada"); wait(1.5); i=0; m=0; lcd.cls(); } if(Conf == 1 && ala == 8){ // Asignar datos de la Alarma 4 encendido. A4on = tm; // A la alarma le pone todo eso. pc.printf("Actualice Alarma 4 on.\n"); lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 4 (on)"); lcd.locate(0,1); lcd.printf("configurada"); wait(1.5); i=0; m=0; lcd.cls(); } if(Conf == 1 && ala == 9){ // Asignar datos de la Alarma 4 apagado. A4off = tm; // A la alarma le pone todo eso. pc.printf("Actualice Alarma 4 off.\n"); lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 4 (off)"); lcd.locate(0,1); lcd.printf("configurada"); wait(1.5); i=0; m=0; lcd.cls(); Lugar++; } ala++; } // Cierre de if de mensaje de configuración. } // Cierre de if de i == 6 } // Cierre de if de Lugar == 1 // Etapa de comparación e impresión. else if (Lugar == 2){ // La visualización del los tiempos de las alarmas y el reloj varían si se manipula en encoder. rtc.getTime(tm); if(visual == 0){ // Imprime el Reloj. lcd.locate(0,0); lcd.printf("Hora: "); lcd.locate(8,0); lcd.printf("%02d:",tm.hour); lcd.printf("%02d:",tm.min); lcd.printf("%02d",tm.sec); lcd.locate(0,1); lcd.printf("%02d/",tm.mon); lcd.printf("%02d/",tm.date); lcd.printf("%02d",tm.year); wait(0.1); m = wheel.getPulses(); if(m!=0){ visual++; wheel.reset(); m = 0; } } if(visual == 1){ // Imprime la alarma 1 encendido. lcd.locate(0,0); lcd.printf("A1 on: "); lcd.locate(8,0); lcd.printf("%02d:",A1on.hour); lcd.printf("%02d:",A1on.min); lcd.printf("%02d",A1on.sec); lcd.locate(0,1); lcd.printf("%02d/",A1on.mon); lcd.printf("%02d/",A1on.date); lcd.printf("%02d",A1on.year); wait(0.1); m = wheel.getPulses(); if(m!=0){ visual++; wheel.reset(); m=0; } } if(visual == 2){ // Imprime la alarma 1 apagado. lcd.locate(0,0); lcd.printf("A1 off: "); lcd.locate(8,0); lcd.printf("%02d:",A1off.hour); lcd.printf("%02d:",A1off.min); lcd.printf("%02d",A1off.sec); lcd.locate(0,1); lcd.printf("%02d/",A1off.mon); lcd.printf("%02d/",A1off.date); lcd.printf("%02d",A1off.year); wait(0.1); m = wheel.getPulses(); if(m!=0){ visual++; wheel.reset(); m=0; } } if(visual == 3){ // Imprime la alarma 2 encendido. lcd.locate(0,0); lcd.printf("A2 on: "); lcd.locate(8,0); lcd.printf("%02d:",A2on.hour); lcd.printf("%02d:",A2on.min); lcd.printf("%02d",A2on.sec); lcd.locate(0,1); lcd.printf("%02d/",A2on.mon); lcd.printf("%02d/",A2on.date); lcd.printf("%02d",A2on.year); wait(0.1); m = wheel.getPulses(); if(m!=0){ visual++; wheel.reset(); m=0; } } if(visual == 4){ // Imprime la alarma 2 apagado. lcd.locate(0,0); lcd.printf("A2 off: "); lcd.locate(8,0); lcd.printf("%02d:",A2off.hour); lcd.printf("%02d:",A2off.min); lcd.printf("%02d",A2off.sec); lcd.locate(0,1); lcd.printf("%02d/",A2off.mon); lcd.printf("%02d/",A2off.date); lcd.printf("%02d",A2off.year); wait(0.1); m = wheel.getPulses(); if(m!=0){ visual++; wheel.reset(); m=0; } } if(visual == 5){ // Imprime la alarma 3 encendido. lcd.locate(0,0); lcd.printf("A3 on: "); lcd.locate(8,0); lcd.printf("%02d:",A3on.hour); lcd.printf("%02d:",A3on.min); lcd.printf("%02d",A3on.sec); lcd.locate(0,1); lcd.printf("%02d/",A3on.mon); lcd.printf("%02d/",A3on.date); lcd.printf("%02d",A3on.year); wait(0.1); m = wheel.getPulses(); if(m!=0){ visual++; wheel.reset(); m=0; } } if(visual == 6){ // Imprime la alarma 3 apagado. lcd.locate(0,0); lcd.printf("A3 off: "); lcd.locate(8,0); lcd.printf("%02d:",A3off.hour); lcd.printf("%02d:",A3off.min); lcd.printf("%02d",A3off.sec); lcd.locate(0,1); lcd.printf("%02d/",A3off.mon); lcd.printf("%02d/",A3off.date); lcd.printf("%02d",A3off.year); wait(0.1); m = wheel.getPulses(); if(m!=0){ visual++; wheel.reset(); m=0; } } if(visual == 7){ // Imprime la alarma 4 encendido. lcd.locate(0,0); lcd.printf("A4 on: "); lcd.locate(8,0); lcd.printf("%02d:",A4on.hour); lcd.printf("%02d:",A4on.min); lcd.printf("%02d",A4on.sec); lcd.locate(0,1); lcd.printf("%02d/",A4on.mon); lcd.printf("%02d/",A4on.date); lcd.printf("%02d",A4on.year); wait(0.1); m = wheel.getPulses(); if(m!=0){ visual++; wheel.reset(); m=0; } } if(visual == 8){ // Imprime la alarma 4 apagado. lcd.locate(0,0); lcd.printf("A4 off: "); lcd.locate(8,0); lcd.printf("%02d:",A4off.hour); lcd.printf("%02d:",A4off.min); lcd.printf("%02d",A4off.sec); lcd.locate(0,1); lcd.printf("%02d/",A4off.mon); lcd.printf("%02d/",A4off.date); lcd.printf("%02d",A4off.year); wait(0.1); m = wheel.getPulses(); if(m!=0){ visual = 0; wheel.reset(); m=0; } } // Compara el Reloj con la alarma 1 encendido. if( (tm.date==A1on.date)&&(tm.mon==A1on.mon)&&(tm.year==A1on.year)&&(tm.hour==A1on.hour)&&(tm.min==A1on.min)&&(tm.sec==A1on.sec) ){ ALED1 = 1; // Prende el LED 1. a1 = 1; lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 1"); lcd.locate(0,1); lcd.printf("activada!"); wait(2); lcd.cls(); visual = 0; m = 0; } // Compara el Reloj con la alarma 1 apagado. if( (tm.date == A1off.date)&&(tm.mon == A1off.mon)&&(tm.year == A1off.year)&&(tm.hour == A1off.hour)&&(tm.min == A1off.min)&&(tm.sec == A1off.sec)&&(a1 == 1)){ ALED1 = 0; // Apaga el LED 1. a1 = 0; //Lugar++; lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 1"); lcd.locate(0,1); lcd.printf("desactivada"); wait(2); lcd.cls(); visual = 0; m = 0; cont++; } // Compara el Reloj con la alarma 2 encendido. if( (tm.date == A2on.date)&&(tm.mon == A2on.mon)&&(tm.year == A2on.year)&&(tm.hour == A2on.hour)&&(tm.min == A2on.min)&&(tm.sec == A2on.sec)){ ALED2= 2; // Prende el LED 2. a2 = 1; lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 2"); lcd.locate(0,1); lcd.printf("activada!"); wait(2); lcd.cls(); visual = 0; m = 0; } // Compara el Reloj con la alarma 2 apagado. if( (tm.date == A2off.date)&&(tm.mon == A2off.mon)&&(tm.year == A2off.year)&&(tm.hour == A2off.hour)&&(tm.min == A2off.min)&&(tm.sec == A2off.sec)&&(a2 == 1)){ ALED2 = 0; // Apaga el LED 2. a2 = 0; lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 2"); lcd.locate(0,1); lcd.printf("desactivada"); wait(2); lcd.cls(); visual = 0; m = 0; cont++; } // Compara el Reloj con la alarma 3 encendido. if( (tm.date == A3on.date)&&(tm.mon == A3on.mon)&&(tm.year == A3on.year)&&(tm.hour == A3on.hour)&&(tm.min == A3on.min)&&(tm.sec == A3on.sec)){ ALED3 = 1; // Prende el LED 3. a3 = 1; lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 3"); lcd.locate(0,1); lcd.printf("activada!"); wait(2); lcd.cls(); visual = 0; m = 0; } // Compara el Reloj con la alarma 3 apagado. if( (tm.date == A3off.date)&&(tm.mon == A3off.mon)&&(tm.year == A3off.year)&&(tm.hour == A3off.hour)&&(tm.min == A3off.min)&&(tm.sec == A3off.sec)&&(a3 == 1)){ ALED3 = 0; // Apaga el LED 3. a3 = 0; lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 3"); lcd.locate(0,1); lcd.printf("desactivada"); wait(2); lcd.cls(); visual = 0; m = 0; cont++; } // Compara el Reloj con la alarma 4 encendido. if( (tm.date == A4on.date)&&(tm.mon == A4on.mon)&&(tm.year == A4on.year)&&(tm.hour == A4on.hour)&&(tm.min == A4on.min)&&(tm.sec == A4on.sec)){ ALED4 = 1; // Prende el LED 4. a4 = 1; lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 4"); lcd.locate(0,1); lcd.printf("activada!"); wait(2); lcd.cls(); visual = 0; m = 0; } // Compara el Reloj con la alarma 4 apagado. if( (tm.date == A4off.date)&&(tm.mon == A4off.mon)&&(tm.year == A4off.year)&&(tm.hour == A4off.hour)&&(tm.min == A4off.min)&&(tm.sec == A4off.sec)&&(a4 == 1)){ ALED4 = 0; // Apaga el LED 4. a4 = 0; lcd.cls(); lcd.locate(0,0); lcd.printf("Alarma 4"); lcd.locate(0,1); lcd.printf("desactivada"); wait(2); lcd.cls(); visual = 0; m = 0; cont++; } if(cont == 4){ // Cuando se cumplen todas las Alarmas se regresa al menú principal. Lugar = 0; lcd.cls(); lcd.locate(0,0); lcd.printf("--Reloj"); // Sin flechitas. lcd.locate(0,1); lcd.printf("--Alarmas"); m = 0; } } } }