Reloj con alarma y snooze

Dependencies:   RTC-DS1307-Modificada TextLCD mbed QEI

/media/uploads/Susanaranjo/img_20160519_141804.jpg

Revision:
0:1c2ae7e04432
Child:
2:32f3a407a8ea
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue May 17 03:52:27 2016 +0000
@@ -0,0 +1,219 @@
+#include "mbed.h"
+#include "Rtc_Ds1307.h"
+#include "TextLCD.h"
+
+//Configuración de la pantalla
+TextLCD lcd(PTE20,PTE21,PTE22,PTE23,PTE29,PTE30, TextLCD::LCD16x2); //Rs, E, d4, d5, d6, d7
+
+//Configuración del reloj
+Rtc_Ds1307 rtc(PTE0, PTE1); // SDA, SCL
+
+//Configuración del puerto
+Serial pc(USBTX, USBRX, "pc");
+
+DigitalIn alarma(PTC12);
+DigitalIn snooze(PTC13); 
+PwmOut speaker(PTA13);
+
+
+char buffer[128];
+int readptr = 0;
+int hora=0;
+int minutos=0;
+int seg=0;
+int mes=0; 
+int fecha=0; 
+int anno=0;
+int pulsador;
+int pulsador2;
+int a=0;
+
+
+int main()
+{
+    char c;
+    Rtc_Ds1307::Time_rtc tm = {};
+
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("Configurando");
+    lcd.locate(0,1);
+    lcd.printf("el reloj");
+
+    pc.printf("*************************************\n");
+    pc.printf("*       Configurar el reloj         *\n");
+    pc.printf("*************************************\n");
+
+    while(1) {
+
+
+        pc.printf("Ingrese la fecha (entre 1 y 31)");
+        pc.scanf("%d", &tm.date);
+        pc.printf("Ingrese el mes (entre 1 y 12)");
+        pc.scanf("%d", &tm.mon);
+        pc.printf("Ingrese el anno (ejemplo: 2016)");
+        pc.scanf("%d", &tm.year);
+        pc.printf("Ingrese la hora (entre 0 y 23)");
+        pc.scanf("%d", &tm.hour);
+        pc.printf("Ingrese los minutos (entre 0 y 59)");
+        pc.scanf("%d", &tm.min);
+        pc.printf("Ingrese los segundos (entre 0 y 59)");
+        pc.scanf("%d", &tm.sec);
+        pc.printf("Ingrese el dia (siendo Domingo=1)");
+        pc.scanf("%d", &tm.wday);
+        pc.printf("*************************************\n");
+        pc.printf("Configurando el reloj\n");
+       
+        
+        while(pc.readable()) {
+            pc.getc();
+            rtc.setTime(tm, false, false);}
+
+        wait_ms(200);
+
+        pc.printf("Inicializando el reloj\n");
+        rtc.startClock();
+  
+        wait_ms(200);
+
+        pc.printf("Leyendo el reloj\n");
+
+loop1:     if (rtc.getTime(tm) ) {
+           pulsador=alarma.read();
+           
+           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
+           
+           //pc.printf("%d\n",a);
+           
+           if (a==0)
+           {
+loop3:      lcd.cls();
+            lcd.printf("ALARMA");
+            pc.printf("*************************************\n");
+            pc.printf("*               ALARMA              *\n");
+            pc.printf("*************************************\n");
+            speaker.period(1.0/500.0);
+            speaker=0.5;
+            
+loop4:      pulsador2=snooze.read(); // Estado del pulsador para detener o posponer la alarma
+            
+            if (pulsador2==0){            
+            speaker=0.0;
+            pc.printf("Pulsar 5 segundos para detener\n");
+            lcd.cls();
+            lcd.printf("Mantenga pulsado");
+            lcd.locate(0,1);
+            lcd.printf("para detener");
+            wait(5); 
+            pulsador2=snooze.read();
+            if (pulsador2==0){ // Si despues de 5 segundos el pulsador todavia está oprimido, se detiene la alarma
+                lcd.cls();
+                lcd.printf("Alarma");
+                lcd.locate(0,1);
+                lcd.printf("desactivada");
+                pc.printf("*************************************\n");
+                pc.printf("*           Alarma desactivada      *\n");
+                pc.printf("*************************************\n");
+                wait(2);
+                goto loop1;   
+                }else{ // Si el pulsador ya no está oprimido, se pospone la alarma un minuto
+                lcd.cls();
+                lcd.printf("Snooze");
+                pc.printf("*************************************\n");
+                pc.printf("*           Snooze                  *\n");
+                pc.printf("*************************************\n");
+                wait(60);
+                goto loop3;     
+                   } 
+                        
+             }else {
+               goto loop4;  }
+             }
+             
+            //pc.printf("La hora actual es: %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec);
+            //pc.printf("La fecha actual es : %s, %02d/%02d/%04d\n", rtc.weekdayToString(tm.wday), tm.mon, tm.date, tm.year);
+
+           else if (pulsador==0) {
+                lcd.cls();
+                lcd.printf("Ver/Configurar");
+                lcd.locate(0,1);
+                lcd.printf("alarma");
+                pc.printf("*************************************\n");
+                pc.printf("* alarma  - configurar alarma       *\n");
+                pc.printf("* ver     - ver alarma              *\n");
+                pc.printf("*************************************\n");
+
+loop2:          readptr = 0;
+               
+               //Obtengo la cadena de caracteres correspondiente a la orden
+               
+                while( (c = pc.getc()) != '\n') {
+                buffer[readptr++] = c; }
+                buffer[readptr++] = 0;
+
+                if (strncmp(buffer, "alarma", 6) == 0) {
+                    
+                    lcd.cls();
+                    lcd.printf("Configurando");
+                    lcd.locate(0,1);
+                    lcd.printf("alarma");
+                    pc.printf("*************************************\n");
+                    pc.printf("*             Nueva alarma          *\n");
+                    pc.printf("Fecha de la alarma  (0..31)");
+                    pc.scanf("%d", &fecha);
+                    pc.printf("Mes de la alarma (1..12)");
+                    pc.scanf("%d", &mes);
+                    pc.printf("Anno de la alarma");
+                    pc.scanf("%d", &anno);
+                    pc.printf("Hora de la alarma (0..23)");
+                    pc.scanf("%d", &hora);
+                    pc.printf("Minutos de la alarma (0..59)");
+                    pc.scanf("%d",&minutos);
+                    pc.printf("Segundos de la alarma (0..59)");
+                    pc.scanf("%d", &seg);
+                    pc.printf("*      Fin de la configuracion      *\n");
+                    pc.printf("*************************************\n");
+                    lcd.cls();
+                    lcd.printf("Fin de la configuracion");
+                    wait_ms(500);
+                    goto loop1;
+                    
+                } else if (strncmp(buffer, "ver", 3) == 0) {
+                    
+                    if(anno==0){
+                    pc.printf("No hay alarma\n");
+                    lcd.cls();
+                    lcd.printf("No hay alarma");
+                    wait_ms(500);    
+                     }else{
+                    pc.printf("Hora de la alarma : %02d:%02d:%02d\n", hora, minutos, seg);
+                    pc.printf("Fecha de la alarma : %02d/%02d/%04d\n", fecha, mes, anno);
+                    lcd.cls();
+                    lcd.printf("%02d:%02d:%02d", hora, minutos, seg);
+                    lcd.locate(0,1);
+                    lcd.printf("%02d:%02d:%02d", fecha, mes, anno);
+                    wait(2);}
+                    
+                    goto loop1;
+                    
+                } else {
+                    goto loop2;
+                }
+
+
+            } else {
+                //Actualizo la hora y la fecha
+                lcd.cls();
+                lcd.locate(0,0);
+                lcd.printf("%02d:%02d:%02d", tm.hour, tm.min, tm.sec);
+                lcd.locate(0,1);
+                lcd.printf("%s/%02d/%02d/%4d", rtc.weekdayToString(tm.wday), tm.date, tm.mon, tm.year);
+                wait_ms(200);
+                goto loop1;
+            }
+        }
+
+
+
+    }
+}