En este archivo se encuentra la programación completa de la tarea de I2C (Alarma)

Dependencies:   DebouncedIn QEI RTC-DS1307 mbed

main.cpp

Committer:
squinteroz
Date:
2015-11-23
Revision:
0:640817dd805d

File content as of revision 0:640817dd805d:

// Sebastian Vergara-Sebastian Quintero-Eliana Mejía

// A continuación definimos las librerias necesarias para la ejecución de este programa
#include "mbed.h"
#include "Rtc_Ds1307.h"
#include "DebouncedIn.h" 
#include "QEI.h"

// Definimos las salidas digitales a usar en la freescale
DigitalOut LedVerde(LED2);
DigitalOut LedRojo(LED1);
DigitalOut LedAzul(LED3);
DigitalOut P(PTE20);

//RtcCls rtc(p28, p27, p29, true);
Rtc_Ds1307 rtc(PTE0,PTE1);
 
Serial pc(USBTX, USBRX, "pc");
 
//Aquí se configuran los puertos del encoder
QEI wheel (PTD5, PTD0, NC, 100);
 
//Se programan los botones 
DebouncedIn BotonENC(PTA16); // botón propio del encoder 
DebouncedIn Boton2(PTE21);   // boton utilizado para confirmar
 
//Salidas digitales para el uso de leds (verificar funcionamiento de alarma)
DigitalOut myled(PTE20);
DigitalOut myled2(PTE5);

//Se inicializan las variables
int dia=0,mes=0,ano=2015,hh=0,mm=0,ss=0;
char buffer[128];
int readptr = 0;
int start=0;
int Config;
 
int main() {
    char c;
    Rtc_Ds1307::Time_rtc tm = {};
    
    while(1) {
        // Se despliega el set de comandos que se usan en Movil-On para habilitar el reloj
        set_reloj:
       
        pc.printf("*************************************\n");
        pc.printf("* Menu for RTC Test :               *\n");
        pc.printf("* read  - reads the clock           *\n");
        pc.printf("* start - start the clock           *\n");
        pc.printf("* stop  - stop the clock            *\n");
        pc.printf("* write - write the clock           *\n");
        pc.printf("* ena   - enable Square wave output *\n");
        pc.printf("* dis   - disable square wave outp. *\n");
        pc.printf("*************************************\n");
        
        while( (c = pc.getc()) != '\n') {
            buffer[readptr++] = c;
        }
        buffer[readptr++] = 0;
        if (strncmp(buffer, "read", 4) == 0) {
            //  perform read
            pc.printf("Performing read operation\n");
            if (rtc.getTime(tm) ) {
                pc.printf("El tiempo 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 (strncmp(buffer, "write", 5) == 0) {
            // Se despliega el siguiente menú para configurar fecha y hora actual
            pc.printf("Ingrese el dia (fecha 0..31)");// Se pide ingresar un número del 0 al 31 equivalente al día del mes
            pc.scanf("%d", &tm.date);
            pc.printf("Ingrese el mes (mes 1..12)");  // se pide ingresar un valor entre 1 y 12 que representa el mes  
            pc.scanf("%d", &tm.mon);
            pc.printf("Ingrese el ano (ano)");        // a continuación se ingresa el valor del año
            pc.scanf("%d", &tm.year);
            pc.printf("Ingrese la hora (horas 0..23)");// Luego se ingresa la hora en formato 24 horas
            pc.scanf("%d", &tm.hour);
            pc.printf("Ingrese los minutos (minutos 0..59)");// Se ingresa los minutos
            pc.scanf("%d", &tm.min);
            pc.printf("Ingrese los segundos (segundos 0..59)"); //Y por último los segundos (cualquier valor, ya que es díficil su precisión)
            pc.scanf("%d", &tm.sec);
            pc.printf("Realizando la operacion... Por favor espere\n"); // Se espera la configuración de esos valores
            
            while(pc.readable()) 
                pc.getc();
            rtc.setTime(tm, false, false);
        }
        else if (strncmp(buffer, "start", 5) == 0) {
            //  start
            readptr = 0;
            pc.printf("Dispositivo Iniciado\n");
            rtc.startClock();
            goto set_prev;
            
            
        }
        else if (strncmp(buffer, "stop", 4) == 0) {
            //  stop
            pc.printf("Performing stop operation\n");
            rtc.stopClock();
        }
        else if (strncmp(buffer, "ena", 3) == 0) {
            int rs;
            pc.printf("Please specify the frequency : [0 = 1Hz, 1 = 4.096kHz, 2 = 8.192kHz, 3 = 32.768kHz] ");
            scanf("%d", &rs);
            pc.printf("Enabling the output with %d option\n", rs);
            rtc.setSquareWaveOutput(true, (Rtc_Ds1307::SqwRateSelect_t)rs);
        }
        else if (strncmp(buffer, "dis", 3) == 0) {
            pc.printf("Disableing square wave output\n");
            rtc.setSquareWaveOutput(false, Rtc_Ds1307::RS1Hz);
        }
        else {
            pc.printf("syntax error\n");
        }
        readptr = 0;
        }

        set_prev:
        pc.printf("Es correcto?  ---- 1 = Si   2 = No\n"); // se habilita esta opción para que el usuario 
        pc.scanf("%d", &Config);                           // verifique si la configuración ingresada es correcta o no
        
        if (Config ==2){                // Si se presiona 2, hubo errores en la configuración
            readptr = 0;
            goto set_reloj;             // se regresa a la función set_reloj para volver a configurar
            }
        
                  
        else if (Config ==1){           // se si presiona 1, la configuración fue correcta
             
             pc.printf("Dispositivo Configurado Correctamente  Espere ....\n"); // se espera un tiempo
             wait(5);
             goto set_alarma;           // y se va a la función correspondiente a la alarma
        }
        else {
            pc.printf("syntax error\n");
            goto set_prev;
        }

        // Aquí se encuentra la función ALARMA, en la cual se configura los valores para la activación de esta
        set_alarma:             
        pc.printf("******* Configuracion Alarma *******\n");
        
        
        set_dia:
        while(1){
         
            dia=dia+wheel.getPulses();
            wheel.reset();
     
            if(dia>=31){        //En este if, se garantiza que los días esten entre 0 y 31
                dia=31;
            }
            else if (dia<=0){
             dia=0;
            }
     pc.printf(">Dia=%d    Mes=%d    Ano=%d    Hora=%d    Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
    
    // A continuación se programan los botones del encoder para configurar con este las diferentes necesidades de la alarma
    if(BotonENC.falling()){
        goto set_mes;
        }
    if(Boton2.falling()){
        goto set_comp;
    }
           
            
    }
        
        set_mes:
        while(1){
         
            mes=mes+wheel.getPulses();
            wheel.reset();
     
            if(mes>=12){                // Se garantiza que el valor del mes se encuentre entre los valores 0 y 12
                mes=12;
            }
            else if (mes<=0){
             mes=0;
            }
     pc.printf(" Dia=%d   >Mes=%d    Ano=%d    Hora=%d    Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
    
    
    if(BotonENC.falling()){
        goto set_ano;
    }
    if(Boton2.falling()){
        goto set_comp;
    }
           
            
    }
     set_ano:
        while(1){
         
            ano=ano+wheel.getPulses();
            wheel.reset();
     
            if(ano>=2030){              //Se programan alarmas para los próximos 15 años (entre los años 2015 y 2030)
                ano=2030;
            }
            else if (ano<=2015){
             ano=2015;
            }
     pc.printf(" Dia=%d    Mes=%d   >Ano=%d    Hora=%d    Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
    
    
    if(BotonENC.falling()){
        goto set_hh;
    }
    if(Boton2.falling()){
        goto set_comp;
    }       
            
    }
    set_hh:
        while(1){
         
            hh=hh+wheel.getPulses();
            wheel.reset();
     
            if(hh>=23){         // Las horas deben encontrarse siempre en el rango de 0 a 23 (La hora 24 = La hora 0)
                hh=23;
            }
            else if (hh<=0){
             hh=0;
            }
     pc.printf(" Dia=%d    Mes=%d    Ano=%d   >Hora=%d    Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
    
    
    if(BotonENC.falling()){
        goto set_mm;
    }
    if(Boton2.falling()){
        goto set_comp;
    }
           
            
    }
     set_mm:
        while(1){
         
            mm=mm+wheel.getPulses();
            wheel.reset();
     
            if(mm>=59){         //Minutos siempre positivos entre 0 y 59 (El minuto 60 es igual al 0)
                mm=59;
            }
            else if (mm<=0){
             mm=0;
            }
     pc.printf(" Dia=%d    Mes=%d    Ano=%d    Hora=%d   >Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
    
    
    if(BotonENC.falling()){
        goto set_ss;
    }
    if(Boton2.falling()){
        goto set_comp;
    }
           
            
    }
    
    set_ss:
        while(1){
         
            ss=ss+wheel.getPulses();
            wheel.reset();
            
            if(ss>=59){         //De nuevo, en un minuto hay 60 segundos ( partiendo del 0 al 59)
                ss=59;
            }
            else if (ss<=0){
             ss=0;
            }
     pc.printf(" Dia=%d    Mes=%d    Ano=%d    Hora=%d    Min=%d   >Seg=%d\n ",dia,mes,ano,hh,mm,ss);
    
    
    if(BotonENC.falling()){
        goto set_dia;
    }
    if(Boton2.falling()){
        goto set_comp;
    }
           
            
    }
    
    // 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
    set_comp:
    
    pc.printf("***Datos ingresados para alarma****\n");
    pc.printf(" Dia=%d    Mes=%d    Ano=%d    Hora=%d    Min=%d    Seg=%d\n ",dia,mes,ano,hh,mm,ss);
    
    while(1){
       rtc.getTime(tm);
       pc.printf("El tiempo 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);
    if(tm.hour>=hh && tm.min>=mm &&tm.sec>=ss && tm.mon>=mes && tm.date>=dia && tm.year>=ano){
        myled=0;        // En estas líneas de código se busca mostrar el funcionamiento de la alarma cuando 
        myled2=1;       // esta es encendida mediante el encendido y apagado alternado de dos diodos leds.
        wait(0.5);      // con un pequeño tiempo de diferencia para lograr dicho efecto.
        myled=1;
        myled2=0;
        wait(0.5);
    }
    else {
        myled=1;
        }
        wait(1);
    } 
     
    }