El objetivo del código es avisarle al usuario, si para una hora y fecha dada, la placa de su auto se encuentra en pico y placa.
Dependencies: mbed QEI ds3231 TextLCD
main.cpp
- Committer:
- lmrinconp
- Date:
- 2019-08-28
- Revision:
- 0:62608f504846
File content as of revision 0:62608f504846:
#include "mbed.h" #include "TextLCD.h" //Librería del LCD #include "QEI.h" //Librería del encoder #include "ds3231.h" // Librería del módulo #include <string> DigitalOut myled(LED1); //Led LD3 de la tarjeta TextLCD lcd(PF_1, PA_9, PA_11, PA_12, PB_1, PA_0);// Declaración de los puertos QEI encoder (PA_1, PB_3, NC, 624); // (DT, Clk) DigitalIn mybuttonE(PA_3); //Cambia posicion del numero de la placa (Encoder-SW) DigitalIn mybutton(PA_4); //Termina y consolida valores de la placa y sale del loop (Pulsador) Ds3231 rtc(PB_7, PB_6); //rtc object Ds3231::Ds3231(PinName sda, PinName scl) : I2C(sda, scl) ds3231_alrm_t alarm ; uint16_t rtn_val; int year,month,date,hours,minutes,seconds; //Mejor manejo de las variables. int cambio=0, diferencia=0; //Para mover la placa del auto. void imprimir(int pos, int linea, const char * datoParaMostrar, bool limpiar) { if (limpiar) { lcd.cls(); } lcd.locate(pos,linea); lcd.printf(datoParaMostrar); } void Saludo() { imprimir(0,0," Alarma Para",true); imprimir(0,1," Pico y Placa",false); wait(4); lcd.cls(); } void MostrarFecha() { ds3231_cntl_stat_t rtc_control_status = {0,0}; ds3231_calendar_t rtc_calendar={0,0,0,0}; rtc.set_cntl_stat_reg(rtc_control_status); rtc.get_calendar(&rtc_calendar); year=rtc_calendar.year; month=rtc_calendar.month; date=rtc_calendar.date; lcd.cls(); lcd.locate(0,0); lcd.printf("\nFecha:%02d/%02d/%02d",date,month,year); wait(4); lcd.cls(); } void MostrarHora() { ds3231_time_t rtc_time={0,0,0,0,0}; lcd.cls(); lcd.locate(0,0); rtc.get_time(&rtc_time); hours=rtc_time.hours; minutes=rtc_time.minutes; seconds=rtc_time.seconds; lcd.printf("\nHora:%02d:%02d:%02d",hours,minutes,seconds); wait(4); lcd.cls(); } void mensajePicoYPlaca(bool picoYPlaca) { if (picoYPlaca) { imprimir(0,0," Se encuentra",true); imprimir(0,1,"en pico y placa",false); rtn_val = rtc.set_alarm(alarm, true); } else { imprimir(0,0,"No se encuentra",true); imprimir(0,1,"en pico y placa",false); rtn_val = rtc.set_alarm(alarm, false); } wait(4); lcd.cls(); } bool horaPicoYPlaca(int h, int m)//Para poner los limietes de las horas del pico y placa { if(h >= 7 && (h <= 8 && m <= 30)) { return true; } else if (h < 19 && (h >= 17 && m >= 30)) { return true; } else { return false; } } void calcularPicoYPlaca(int udp, int dia, int hora, int minuto)//Para calcular el pico y placa { bool horaPyP = horaPicoYPlaca(hora, minuto); switch(dia) { case 0: mensajePicoYPlaca(false); break; case 1: if((udp==2 || udp==3 || udp==4 || udp==5)&& horaPyP) { mensajePicoYPlaca(true); } else{ mensajePicoYPlaca(false); } break; case 2: if((udp==6 || udp==7 || udp==8 || udp==9)&& horaPyP) { mensajePicoYPlaca(true); } else{ mensajePicoYPlaca(false); } break; case 3: if((udp==0 || udp==1 || udp==2 || udp==3)&& horaPyP) { mensajePicoYPlaca(true); } else{ mensajePicoYPlaca(false); } break; case 4: if((udp==4 || udp==5 || udp==6 || udp==7)&& horaPyP) { mensajePicoYPlaca(true); } else{ mensajePicoYPlaca(false); } break; case 5: if((udp==8 || udp==9 || udp==0 || udp==1) && horaPyP) { mensajePicoYPlaca(true); } else{ mensajePicoYPlaca(false); } break; case 6: mensajePicoYPlaca(false); break; } } int ObtenerNumero(const char * datoParaMostrar, int rangoInicial, int rangoFinal) { //Para obtener los diferentes numeros del encoder int resultado = rangoInicial; imprimir(0,0,datoParaMostrar,true); lcd.locate(1,1); lcd.printf("%d",resultado); while(true) { diferencia=encoder.getPulses()-cambio; cambio=encoder.getPulses(); if(diferencia>0) { if(resultado+diferencia >= rangoFinal) { resultado = rangoFinal; imprimir(1,1," ",false); lcd.locate(1,1); lcd.printf("%d",resultado); } else { resultado+=diferencia; imprimir(1,1," ",false); lcd.locate(1,1); lcd.printf("%d",resultado); } } else if(diferencia<0) { if(resultado+diferencia < rangoInicial) { resultado = rangoInicial; imprimir(1,1," ",false); lcd.locate(1,1); lcd.printf("%d",resultado); } else { resultado+=diferencia; imprimir(1,1," ",false); lcd.locate(1,1); lcd.printf("%d",resultado); } } if (mybutton == 0) //Para identificar si esta en pico y placa { break; //sale del bucle si se pulsa el swich } wait(0.1); } wait(0.5); return resultado; } int main() { Saludo(); MostrarFecha(); int dayWeek = ObtenerNumero("Day of the week",0,6); int date = ObtenerNumero("Date",1,31); int month = ObtenerNumero("Month",1,12); int year = ObtenerNumero("Year",15,22); ds3231_calendar_t rtc_calendar={dayWeek,date,month,year}; rtc.set_calendar(rtc_calendar); rtc.get_calendar(&rtc_calendar); lcd.cls(); lcd.locate(0,0); lcd.printf("\nFecha:%02d/%02d/%02d",date,month,year); wait(4); imprimir(0,0,"Time Set",true); wait(1); MostrarHora(); int hours = ObtenerNumero("Hours",0,23); int minutes = ObtenerNumero("Minutes",0,59); int seconds = ObtenerNumero("Seconds",0,59); lcd.cls(); ds3231_time_t rtc_time={0,0,hours,minutes,seconds}; rtc.set_time(rtc_time); rtc.get_time(&rtc_time); lcd.locate(0,0); lcd.printf("\nHora:%02d:%02d:%02d", hours,minutes,seconds ); wait(4); imprimir(0,0,"Hour Set",true); wait(1); int digitoPlaca = ObtenerNumero("Ultimo # Placa",0,9); calcularPicoYPlaca(digitoPlaca,dayWeek,hours,minutes); imprimir(0,0," Feliz",true); //Mensaje de despedida imprimir(0,1," dia!",false); }