Alarma de pico y placa usando módulo RTC.

Dependencies:   QEI TextLCD mbed

Fork of grafica_PID_android by Nicolás Villegas Echavarría

main.cpp

Committer:
NicolasV
Date:
2017-06-03
Revision:
4:d57cde44861e
Parent:
3:2e823b16a4a1

File content as of revision 4:d57cde44861e:

/*
 * Código por: Laura Álvila
 *             Daniela López
 *             Nicolás Villegas            
 */
 
#include "mbed.h"
#include "QEI.h"
#include "TextLCD.h"
#include "Rtc_Ds1307.h"

Rtc_Ds1307 rtc(PTC9, PTC8);
Serial GSM(PTE0,PTE1);  // Módulo Bluetooh
TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
QEI encoder (PTA13, PTD5, NC, 300);
DigitalOut alarma(PTA5);
DigitalOut carro(PTA4);
DigitalOut led2(LED2);
Timer t;

AnalogIn y(PTC2);   // Entrada análoga: Salida del sistema
AnalogOut u(PTE30); // Salida análoga: Señal de control

DigitalIn button3(PTC16); // Botón del encoder
DigitalIn button4(PTC17); // Pulsador

// Códigos movimiento del cursor:
const int C1 = 0x0F; // Habilitar cursor
const int C2 = 0x18; // Desplazar pantalla izq.
const int C4 = 0x0C; // Quitar cursor

const char abc[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; // Abecedario para seleccionar la placa.
char* dias[] = {"Dia", "Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"}; // Dias de la semana para la configuración del reloj.
int p1 = 0, p2 = 0, p3 = 0, p4 = 0, p5 = 0, p6 = 0; // 6 dígitos de la placa.

bool menu = true;
bool min45 = false, min30 = false, min15 = false, min0 = false; // Indican si faltan X minutos para pico y placa.
bool alarma45 = false, alarma30 = false, alarma15 = false, alarma0 = false; // Indican si ya sonó o no la alarma correspondiente.
bool pico_y_placa = false; // Es verdadero si en el dia actual el carro tiene pico y placa, independientemente de la hora.
bool correccion = false; // Se identificaron rangos de horas para los cuales la configuración del reloj salía mal. Puede ser un problema de la librería o del integrado. Esta variable ayuda a mostrar y configurar la hora correcta.
int dia = 0, mes = 0, anno = 0, day = 1, hora = 0, min = 0; // Variables para almacenar las opciones de configuración del reloj.
int cambio = 0, diferencia = 0; // Variables del encoder.
int pos = 0;

int main() {
    
    carro = 1;
    alarma = 0;
    
    Rtc_Ds1307::Time_rtc tm = {};
    GSM.baud(9600);   
    GSM.format(8,Serial::None,1);
    t.start();
    
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("**Pico y placa**");
    wait(1);
    // Animación de bienvenida:
    for (int i = 0; i < 16; ++i) {
        lcd.writeCommand(C2);
        wait(0.1);
    }
    lcd.cls();
    
menu:
    // En este menu se escoge entre ingresar la placa o configurar el reloj.
    wait(0.3);
    lcd.cls();
    lcd.writeCommand(C1);
    lcd.locate(0,0);
    lcd.printf("Menu");
    lcd.locate(0,1);
    lcd.printf("1.Placa 2.Config");
    lcd.locate(0,1);
    lcd.printf("1"); 
    //
    menu = true;
    
    while(true) {
        if (!button3) {
            menu = !menu;
            if (menu) { 
                lcd.locate(0,1);
                lcd.printf("1");
            }
            else {
                lcd.locate(8,1);
                lcd.printf("2");
            }
            wait(0.5);
        }
        
        if (!button4) {
            wait(0.5);
            if (menu)  goto init;
            if (!menu) goto config;
        } 
    }
    
config:
    
    pos = 5;
    lcd.cls();
    lcd.writeCommand(C1);
    lcd.locate(0,1);
    lcd.printf("DD/MM/YY   HH:MM");
    lcd.locate(0,0);
    lcd.printf("Config.      Dia");
    
    // Se usa el botón del encoder para pasar la variable configurada y el encoder para ajustar su valor.
    // Usando el pulsador se guarda la configuración.
    while (true) {
        
        diferencia=(encoder.getPulses() - cambio);
        cambio=encoder.getPulses();
        
        if (diferencia != 0) {
            
            switch (pos) {
                case 0:
                    dia += diferencia;
                    if (dia > 31) dia = 1;
                    if (dia < 1) dia = 31;
                    lcd.locate(0,1);
                    lcd.printf("%02d", dia);
                    break;
                case 1:
                    mes += diferencia;
                    if (mes > 12) mes = 1;
                    if (mes < 1) mes = 12;
                    lcd.locate(3,1);
                    lcd.printf("%02d", mes);
                    break;
                case 2:
                    anno += diferencia;
                    if (anno > 99) anno = 0;
                    if (anno < 0) anno = 99;
                    lcd.locate(6,1);
                    lcd.printf("%02d", anno);
                    break;
                case 3:
                    hora += diferencia;
                    if (hora > 23) hora = 0;
                    if (hora < 0) hora = 23;
                    lcd.locate(11,1);
                    lcd.printf("%02d", hora);
                    break;
                case 4:
                    min += diferencia;
                    if (min > 59) min = 0;
                    if (min < 0) min = 59;
                    lcd.locate(14,1);
                    lcd.printf("%02d", min);
                    break;
                case 5:
                    day += diferencia;
                    if (day < 1) day = 7;
                    if (day > 7) day = 1;
                    lcd.locate(13, 0);
                    lcd.printf("%s", dias[day]); 
                    break;
            }
        }
            
        if (!button3) {
            if (++pos > 5) pos = 0;
            wait(0.3);
        }
        if (!button4) {
            
            if ((hora >= 18 && hora <= 23) || (hora >= 0 && hora <= 3) || (hora >= 8 && hora <= 13))
                correccion = true;
            else
                correccion = false;
                
            wait(0.3);
            lcd.cls();
            lcd.printf("Guardado!");
            menu = true;
            tm.date = dia;
            tm.mon = mes;
            tm.year = 2000 + anno;
            tm.hour = hora;
            tm.min = min;
            tm.sec = 0;
            tm.wday = day;
            rtc.setTime(tm, true, false);
            wait(1);
            lcd.cls();
            goto menu;
        }      
    }

init:
    
    // Se escribe la placa usando el encoder.
    lcd.cls();
    lcd.writeCommand(C1);
    lcd.locate(0,0);
    lcd.printf("Ingrese placa:");
    lcd.locate(0,1);
    lcd.printf("%c%c%c%1d%1d%1d", abc[p1], abc[p2], abc[p3], p4, p5, p6);
    lcd.writeCommand(0xC0); // Cursor en (0,1)
    pos = 0;
    
    while(true) {

        diferencia=(encoder.getPulses() - cambio);
        cambio=encoder.getPulses();
        
        if (diferencia != 0) {
            switch (pos) {
                case 0:
                    lcd.locate(0,1);
                    p1 += diferencia;
                    if (p1 > 25) p1 = 0;
                    if (p1 < 0) p1 = 25;
                    lcd.printf("%c", abc[p1]);
                    break;
                case 1:
                    lcd.locate(1,1);
                    p2 += diferencia;
                    if (p2 > 25) p2 = 0;
                    if (p2 < 0) p2 = 25;
                    lcd.printf("%c", abc[p2]);
                    break;
                case 2:
                    lcd.locate(2,1);
                    p3 += diferencia;
                    if (p3 > 25) p3 = 0;
                    if (p3 < 0) p3 = 25;
                    lcd.printf("%c", abc[p3]);
                    break;
                case 3:
                    lcd.locate(3,1);
                    p4 += diferencia;
                    if (p4 > 9) p4 = 0;
                    if (p4 < 0) p4 = 9;
                    lcd.printf("%d", p4);
                    break;
                case 4:
                    lcd.locate(4,1);
                    p5 += diferencia;
                    if (p5 > 9) p5 = 0;
                    if (p5 < 0) p5 = 9;
                    lcd.printf("%d", p5);
                    break;
                case 5:
                    lcd.locate(5,1);
                    p6 += diferencia;
                    if (p6 > 9) p6 = 0;
                    if (p6 < 0) p6 = 9;
                    lcd.printf("%d", p6);
                    break;
            }
        }      

        if (!button3) {
            led2 = !led2;
            pos++;
            pos = pos % 6;
            wait(0.2);
        }

        if (!button4) {
            lcd.cls();
            lcd.locate(0,0);
            lcd.printf("Guardado!");
            wait(2);
            break;
        }
        wait(0.1);        
    }
    
reloj:
    
    // En esta sección se muestran la placa, el reloj y los avisos de alarma.
    lcd.writeCommand(C4);
    lcd.cls();
    lcd.locate(0,0); 
    lcd.printf("%c%c%c%d%d%d", abc[p1], abc[p2], abc[p3], p4, p5, p6);
    
    while (true) {
        
        if (!button4) {
            wait(0.3);
            goto menu;
        }
        
        lcd.locate(0,1);
        
        if (rtc.getTime(tm)) {
            
            if (((tm.hour >= 22 && tm.hour <= 27) || (tm.hour >= 4 && tm.hour <= 7) || (tm.hour >= 12 && tm.hour <= 15)) && correccion)
                lcd.printf("%02d:%02d:%02d     %s", tm.hour-4, tm.min, tm.sec, dias[tm.wday]);
            else
                lcd.printf("%02d:%02d:%02d     %s", tm.hour, tm.min, tm.sec, dias[tm.wday]);

            wait(1);
        }
        
        // Se checkea si el automovil tiene pico y placa (Hora y dia): *********
        
        if (tm.wday == 2 && p6 >= 2 && p6 <= 5) { // Lunes
            pico_y_placa = true;
            lcd.locate(9,0);
            lcd.printf("Hoy P&P");
        }
        else if (tm.wday == 3 && p6 >= 6 && p6 <= 9) { // Martes
            pico_y_placa = true;
            lcd.locate(9,0);
            lcd.printf("Hoy P&P");
        }
        else if (tm.wday == 4 && p6 >= 0 && p6 <= 3) { // Miercoles
            pico_y_placa = true;
            lcd.locate(9,0);
            lcd.printf("Hoy P&P");
        }
        else if (tm.wday == 5 && p6 >= 4 && p6 <= 7) { // Jueves
            pico_y_placa = true;
            lcd.locate(9,0);
            lcd.printf("Hoy P&P");
        }
        else if (tm.wday == 6 && (p6 == 8 || p6 == 9 || p6 == 0 || p6 == 1)) { // Viernes
            pico_y_placa = true;
            lcd.locate(9,0);
            lcd.printf("Hoy P&P");
        }
        else {
            pico_y_placa = false;
            lcd.locate(9,0);
            lcd.printf("       ");
        }
        
        int hora_c;
        
        if (((tm.hour >= 22 && tm.hour <= 27) || (tm.hour >= 4 && tm.hour <= 7) || (tm.hour >= 12 && tm.hour <= 16)) && correccion)
            hora_c = 100*(tm.hour-4) + tm.min;
        else
            hora_c = 100*tm.hour + tm.min;

        if ((hora_c >= 700 && hora_c < 830) || (hora_c >= 1730 && hora_c < 1900))
            min0 = true;
        else
            min0 = false;
            
        if ((hora_c >= 615 && hora_c < 700) || (hora_c >= 1645 && hora_c < 1730))
            min45 = true;
        else
            min45 = false;
            
        if ((hora_c >= 630 && hora_c < 700) || (hora_c >= 1700 && hora_c < 1730))
            min30 = true;
        else
            min30 = false;
            
        if ((hora_c >= 645 && hora_c < 700) || (hora_c >= 1715 && hora_c < 1730))
            min15 = true;
        else
            min15 = false;
            
        if((hora_c == 830 || hora_c == 1900) && tm.sec < 10) {
            alarma0 = false; alarma15 = false;
            alarma30 = false; alarma45 = false;
        }
        
         
        // Se disparan las alarmas: ********************************************
        
        if (pico_y_placa && min45 && !alarma45) {
            alarma45 = true;
            lcd.cls();
            lcd.printf(" *** Faltan *** \n *** 45 min ***");
            for (int a = 0; a < 10; ++a) {
                alarma = !alarma;
                wait(1);
            }
            goto reloj;
        }
        if (pico_y_placa && min30 && !alarma30) {
            alarma30 = true;
            lcd.cls();
            lcd.printf(" *** Faltan *** \n *** 30 min ***");
            for (int a = 0; a < 20; ++a) {
                alarma = !alarma;
                wait(0.5);
            }
            goto reloj;
        }
        if (pico_y_placa && min15 && !alarma15) {
            alarma15 = true;
            lcd.cls();
            lcd.printf(" *** Faltan *** \n *** 15 min ***");
            for (int a = 0; a < 40; ++a) {
                alarma = !alarma;
                wait(0.25);
            }
            goto reloj;
        }
        if (pico_y_placa && min0 && !alarma0) {
            alarma0 = true;
            lcd.cls();
            lcd.printf(" *** Pico y *** \n ***  placa *** ");
            alarma = 1;
            carro = 0;
            goto reloj;
        }
        if (!pico_y_placa) {
            alarma = 0;
            carro = 1;
        }
    }
}