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

Committer:
lmrinconp
Date:
Wed Aug 28 22:05:21 2019 +0000
Revision:
0:62608f504846
Aviso para estado de pico y placa

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lmrinconp 0:62608f504846 1 #include "mbed.h"
lmrinconp 0:62608f504846 2 #include "TextLCD.h" //Librería del LCD
lmrinconp 0:62608f504846 3 #include "QEI.h" //Librería del encoder
lmrinconp 0:62608f504846 4 #include "ds3231.h" // Librería del módulo
lmrinconp 0:62608f504846 5 #include <string>
lmrinconp 0:62608f504846 6
lmrinconp 0:62608f504846 7 DigitalOut myled(LED1); //Led LD3 de la tarjeta
lmrinconp 0:62608f504846 8 TextLCD lcd(PF_1, PA_9, PA_11, PA_12, PB_1, PA_0);// Declaración de los puertos
lmrinconp 0:62608f504846 9 QEI encoder (PA_1, PB_3, NC, 624); // (DT, Clk)
lmrinconp 0:62608f504846 10 DigitalIn mybuttonE(PA_3); //Cambia posicion del numero de la placa (Encoder-SW)
lmrinconp 0:62608f504846 11 DigitalIn mybutton(PA_4); //Termina y consolida valores de la placa y sale del loop (Pulsador)
lmrinconp 0:62608f504846 12 Ds3231 rtc(PB_7, PB_6); //rtc object Ds3231::Ds3231(PinName sda, PinName scl) : I2C(sda, scl)
lmrinconp 0:62608f504846 13
lmrinconp 0:62608f504846 14 ds3231_alrm_t alarm ;
lmrinconp 0:62608f504846 15 uint16_t rtn_val;
lmrinconp 0:62608f504846 16 int year,month,date,hours,minutes,seconds; //Mejor manejo de las variables.
lmrinconp 0:62608f504846 17 int cambio=0, diferencia=0; //Para mover la placa del auto.
lmrinconp 0:62608f504846 18
lmrinconp 0:62608f504846 19 void imprimir(int pos, int linea, const char * datoParaMostrar, bool limpiar)
lmrinconp 0:62608f504846 20 {
lmrinconp 0:62608f504846 21 if (limpiar)
lmrinconp 0:62608f504846 22 {
lmrinconp 0:62608f504846 23 lcd.cls();
lmrinconp 0:62608f504846 24 }
lmrinconp 0:62608f504846 25 lcd.locate(pos,linea);
lmrinconp 0:62608f504846 26 lcd.printf(datoParaMostrar);
lmrinconp 0:62608f504846 27 }
lmrinconp 0:62608f504846 28
lmrinconp 0:62608f504846 29 void Saludo()
lmrinconp 0:62608f504846 30 {
lmrinconp 0:62608f504846 31 imprimir(0,0," Alarma Para",true);
lmrinconp 0:62608f504846 32 imprimir(0,1," Pico y Placa",false);
lmrinconp 0:62608f504846 33 wait(4);
lmrinconp 0:62608f504846 34 lcd.cls();
lmrinconp 0:62608f504846 35 }
lmrinconp 0:62608f504846 36
lmrinconp 0:62608f504846 37 void MostrarFecha()
lmrinconp 0:62608f504846 38 {
lmrinconp 0:62608f504846 39 ds3231_cntl_stat_t rtc_control_status = {0,0};
lmrinconp 0:62608f504846 40 ds3231_calendar_t rtc_calendar={0,0,0,0};
lmrinconp 0:62608f504846 41 rtc.set_cntl_stat_reg(rtc_control_status);
lmrinconp 0:62608f504846 42 rtc.get_calendar(&rtc_calendar);
lmrinconp 0:62608f504846 43 year=rtc_calendar.year;
lmrinconp 0:62608f504846 44 month=rtc_calendar.month;
lmrinconp 0:62608f504846 45 date=rtc_calendar.date;
lmrinconp 0:62608f504846 46 lcd.cls();
lmrinconp 0:62608f504846 47 lcd.locate(0,0);
lmrinconp 0:62608f504846 48 lcd.printf("\nFecha:%02d/%02d/%02d",date,month,year);
lmrinconp 0:62608f504846 49 wait(4);
lmrinconp 0:62608f504846 50 lcd.cls();
lmrinconp 0:62608f504846 51 }
lmrinconp 0:62608f504846 52
lmrinconp 0:62608f504846 53 void MostrarHora()
lmrinconp 0:62608f504846 54 {
lmrinconp 0:62608f504846 55 ds3231_time_t rtc_time={0,0,0,0,0};
lmrinconp 0:62608f504846 56 lcd.cls();
lmrinconp 0:62608f504846 57 lcd.locate(0,0);
lmrinconp 0:62608f504846 58 rtc.get_time(&rtc_time);
lmrinconp 0:62608f504846 59 hours=rtc_time.hours;
lmrinconp 0:62608f504846 60 minutes=rtc_time.minutes;
lmrinconp 0:62608f504846 61 seconds=rtc_time.seconds;
lmrinconp 0:62608f504846 62 lcd.printf("\nHora:%02d:%02d:%02d",hours,minutes,seconds);
lmrinconp 0:62608f504846 63 wait(4);
lmrinconp 0:62608f504846 64 lcd.cls();
lmrinconp 0:62608f504846 65 }
lmrinconp 0:62608f504846 66
lmrinconp 0:62608f504846 67 void mensajePicoYPlaca(bool picoYPlaca)
lmrinconp 0:62608f504846 68 {
lmrinconp 0:62608f504846 69 if (picoYPlaca)
lmrinconp 0:62608f504846 70 {
lmrinconp 0:62608f504846 71 imprimir(0,0," Se encuentra",true);
lmrinconp 0:62608f504846 72 imprimir(0,1,"en pico y placa",false);
lmrinconp 0:62608f504846 73 rtn_val = rtc.set_alarm(alarm, true);
lmrinconp 0:62608f504846 74 }
lmrinconp 0:62608f504846 75 else
lmrinconp 0:62608f504846 76 {
lmrinconp 0:62608f504846 77 imprimir(0,0,"No se encuentra",true);
lmrinconp 0:62608f504846 78 imprimir(0,1,"en pico y placa",false);
lmrinconp 0:62608f504846 79 rtn_val = rtc.set_alarm(alarm, false);
lmrinconp 0:62608f504846 80 }
lmrinconp 0:62608f504846 81 wait(4);
lmrinconp 0:62608f504846 82 lcd.cls();
lmrinconp 0:62608f504846 83 }
lmrinconp 0:62608f504846 84
lmrinconp 0:62608f504846 85 bool horaPicoYPlaca(int h, int m)//Para poner los limietes de las horas del pico y placa
lmrinconp 0:62608f504846 86 {
lmrinconp 0:62608f504846 87 if(h >= 7 && (h <= 8 && m <= 30))
lmrinconp 0:62608f504846 88 {
lmrinconp 0:62608f504846 89 return true;
lmrinconp 0:62608f504846 90 }
lmrinconp 0:62608f504846 91 else if (h < 19 && (h >= 17 && m >= 30))
lmrinconp 0:62608f504846 92 {
lmrinconp 0:62608f504846 93 return true;
lmrinconp 0:62608f504846 94 }
lmrinconp 0:62608f504846 95 else
lmrinconp 0:62608f504846 96 {
lmrinconp 0:62608f504846 97 return false;
lmrinconp 0:62608f504846 98 }
lmrinconp 0:62608f504846 99 }
lmrinconp 0:62608f504846 100
lmrinconp 0:62608f504846 101 void calcularPicoYPlaca(int udp, int dia, int hora, int minuto)//Para calcular el pico y placa
lmrinconp 0:62608f504846 102 {
lmrinconp 0:62608f504846 103 bool horaPyP = horaPicoYPlaca(hora, minuto);
lmrinconp 0:62608f504846 104 switch(dia)
lmrinconp 0:62608f504846 105 {
lmrinconp 0:62608f504846 106 case 0:
lmrinconp 0:62608f504846 107 mensajePicoYPlaca(false);
lmrinconp 0:62608f504846 108 break;
lmrinconp 0:62608f504846 109 case 1:
lmrinconp 0:62608f504846 110 if((udp==2 || udp==3 || udp==4 || udp==5)&& horaPyP)
lmrinconp 0:62608f504846 111 {
lmrinconp 0:62608f504846 112 mensajePicoYPlaca(true);
lmrinconp 0:62608f504846 113 }
lmrinconp 0:62608f504846 114 else{
lmrinconp 0:62608f504846 115 mensajePicoYPlaca(false);
lmrinconp 0:62608f504846 116 }
lmrinconp 0:62608f504846 117 break;
lmrinconp 0:62608f504846 118 case 2:
lmrinconp 0:62608f504846 119 if((udp==6 || udp==7 || udp==8 || udp==9)&& horaPyP)
lmrinconp 0:62608f504846 120 {
lmrinconp 0:62608f504846 121 mensajePicoYPlaca(true);
lmrinconp 0:62608f504846 122 }
lmrinconp 0:62608f504846 123 else{
lmrinconp 0:62608f504846 124 mensajePicoYPlaca(false);
lmrinconp 0:62608f504846 125 }
lmrinconp 0:62608f504846 126 break;
lmrinconp 0:62608f504846 127 case 3:
lmrinconp 0:62608f504846 128 if((udp==0 || udp==1 || udp==2 || udp==3)&& horaPyP)
lmrinconp 0:62608f504846 129 {
lmrinconp 0:62608f504846 130 mensajePicoYPlaca(true);
lmrinconp 0:62608f504846 131 }
lmrinconp 0:62608f504846 132 else{
lmrinconp 0:62608f504846 133 mensajePicoYPlaca(false);
lmrinconp 0:62608f504846 134 }
lmrinconp 0:62608f504846 135 break;
lmrinconp 0:62608f504846 136 case 4:
lmrinconp 0:62608f504846 137 if((udp==4 || udp==5 || udp==6 || udp==7)&& horaPyP)
lmrinconp 0:62608f504846 138 {
lmrinconp 0:62608f504846 139 mensajePicoYPlaca(true);
lmrinconp 0:62608f504846 140 }
lmrinconp 0:62608f504846 141 else{
lmrinconp 0:62608f504846 142 mensajePicoYPlaca(false);
lmrinconp 0:62608f504846 143 }
lmrinconp 0:62608f504846 144 break;
lmrinconp 0:62608f504846 145 case 5:
lmrinconp 0:62608f504846 146 if((udp==8 || udp==9 || udp==0 || udp==1) && horaPyP)
lmrinconp 0:62608f504846 147 {
lmrinconp 0:62608f504846 148 mensajePicoYPlaca(true);
lmrinconp 0:62608f504846 149 }
lmrinconp 0:62608f504846 150 else{
lmrinconp 0:62608f504846 151 mensajePicoYPlaca(false);
lmrinconp 0:62608f504846 152 }
lmrinconp 0:62608f504846 153 break;
lmrinconp 0:62608f504846 154 case 6:
lmrinconp 0:62608f504846 155 mensajePicoYPlaca(false);
lmrinconp 0:62608f504846 156 break;
lmrinconp 0:62608f504846 157 }
lmrinconp 0:62608f504846 158 }
lmrinconp 0:62608f504846 159
lmrinconp 0:62608f504846 160 int ObtenerNumero(const char * datoParaMostrar, int rangoInicial, int rangoFinal)
lmrinconp 0:62608f504846 161 { //Para obtener los diferentes numeros del encoder
lmrinconp 0:62608f504846 162 int resultado = rangoInicial;
lmrinconp 0:62608f504846 163 imprimir(0,0,datoParaMostrar,true);
lmrinconp 0:62608f504846 164 lcd.locate(1,1);
lmrinconp 0:62608f504846 165 lcd.printf("%d",resultado);
lmrinconp 0:62608f504846 166
lmrinconp 0:62608f504846 167 while(true)
lmrinconp 0:62608f504846 168 {
lmrinconp 0:62608f504846 169 diferencia=encoder.getPulses()-cambio;
lmrinconp 0:62608f504846 170 cambio=encoder.getPulses();
lmrinconp 0:62608f504846 171 if(diferencia>0)
lmrinconp 0:62608f504846 172 {
lmrinconp 0:62608f504846 173 if(resultado+diferencia >= rangoFinal)
lmrinconp 0:62608f504846 174 {
lmrinconp 0:62608f504846 175 resultado = rangoFinal;
lmrinconp 0:62608f504846 176 imprimir(1,1," ",false);
lmrinconp 0:62608f504846 177 lcd.locate(1,1);
lmrinconp 0:62608f504846 178 lcd.printf("%d",resultado);
lmrinconp 0:62608f504846 179 }
lmrinconp 0:62608f504846 180 else
lmrinconp 0:62608f504846 181 {
lmrinconp 0:62608f504846 182 resultado+=diferencia;
lmrinconp 0:62608f504846 183 imprimir(1,1," ",false);
lmrinconp 0:62608f504846 184 lcd.locate(1,1);
lmrinconp 0:62608f504846 185 lcd.printf("%d",resultado);
lmrinconp 0:62608f504846 186 }
lmrinconp 0:62608f504846 187 }
lmrinconp 0:62608f504846 188 else if(diferencia<0)
lmrinconp 0:62608f504846 189 {
lmrinconp 0:62608f504846 190 if(resultado+diferencia < rangoInicial)
lmrinconp 0:62608f504846 191 {
lmrinconp 0:62608f504846 192 resultado = rangoInicial;
lmrinconp 0:62608f504846 193 imprimir(1,1," ",false);
lmrinconp 0:62608f504846 194 lcd.locate(1,1);
lmrinconp 0:62608f504846 195 lcd.printf("%d",resultado);
lmrinconp 0:62608f504846 196 }
lmrinconp 0:62608f504846 197 else
lmrinconp 0:62608f504846 198 {
lmrinconp 0:62608f504846 199 resultado+=diferencia;
lmrinconp 0:62608f504846 200 imprimir(1,1," ",false);
lmrinconp 0:62608f504846 201 lcd.locate(1,1);
lmrinconp 0:62608f504846 202 lcd.printf("%d",resultado);
lmrinconp 0:62608f504846 203 }
lmrinconp 0:62608f504846 204 }
lmrinconp 0:62608f504846 205 if (mybutton == 0) //Para identificar si esta en pico y placa
lmrinconp 0:62608f504846 206 {
lmrinconp 0:62608f504846 207 break; //sale del bucle si se pulsa el swich
lmrinconp 0:62608f504846 208 }
lmrinconp 0:62608f504846 209 wait(0.1);
lmrinconp 0:62608f504846 210
lmrinconp 0:62608f504846 211 }
lmrinconp 0:62608f504846 212 wait(0.5);
lmrinconp 0:62608f504846 213 return resultado;
lmrinconp 0:62608f504846 214 }
lmrinconp 0:62608f504846 215
lmrinconp 0:62608f504846 216 int main() {
lmrinconp 0:62608f504846 217 Saludo();
lmrinconp 0:62608f504846 218 MostrarFecha();
lmrinconp 0:62608f504846 219
lmrinconp 0:62608f504846 220 int dayWeek = ObtenerNumero("Day of the week",0,6);
lmrinconp 0:62608f504846 221 int date = ObtenerNumero("Date",1,31);
lmrinconp 0:62608f504846 222 int month = ObtenerNumero("Month",1,12);
lmrinconp 0:62608f504846 223 int year = ObtenerNumero("Year",15,22);
lmrinconp 0:62608f504846 224
lmrinconp 0:62608f504846 225 ds3231_calendar_t rtc_calendar={dayWeek,date,month,year};
lmrinconp 0:62608f504846 226 rtc.set_calendar(rtc_calendar);
lmrinconp 0:62608f504846 227 rtc.get_calendar(&rtc_calendar);
lmrinconp 0:62608f504846 228 lcd.cls();
lmrinconp 0:62608f504846 229 lcd.locate(0,0);
lmrinconp 0:62608f504846 230 lcd.printf("\nFecha:%02d/%02d/%02d",date,month,year);
lmrinconp 0:62608f504846 231 wait(4);
lmrinconp 0:62608f504846 232
lmrinconp 0:62608f504846 233 imprimir(0,0,"Time Set",true);
lmrinconp 0:62608f504846 234 wait(1);
lmrinconp 0:62608f504846 235
lmrinconp 0:62608f504846 236 MostrarHora();
lmrinconp 0:62608f504846 237
lmrinconp 0:62608f504846 238 int hours = ObtenerNumero("Hours",0,23);
lmrinconp 0:62608f504846 239 int minutes = ObtenerNumero("Minutes",0,59);
lmrinconp 0:62608f504846 240 int seconds = ObtenerNumero("Seconds",0,59);
lmrinconp 0:62608f504846 241
lmrinconp 0:62608f504846 242 lcd.cls();
lmrinconp 0:62608f504846 243 ds3231_time_t rtc_time={0,0,hours,minutes,seconds};
lmrinconp 0:62608f504846 244 rtc.set_time(rtc_time);
lmrinconp 0:62608f504846 245 rtc.get_time(&rtc_time);
lmrinconp 0:62608f504846 246 lcd.locate(0,0);
lmrinconp 0:62608f504846 247 lcd.printf("\nHora:%02d:%02d:%02d", hours,minutes,seconds );
lmrinconp 0:62608f504846 248 wait(4);
lmrinconp 0:62608f504846 249
lmrinconp 0:62608f504846 250 imprimir(0,0,"Hour Set",true);
lmrinconp 0:62608f504846 251 wait(1);
lmrinconp 0:62608f504846 252
lmrinconp 0:62608f504846 253 int digitoPlaca = ObtenerNumero("Ultimo # Placa",0,9);
lmrinconp 0:62608f504846 254
lmrinconp 0:62608f504846 255 calcularPicoYPlaca(digitoPlaca,dayWeek,hours,minutes);
lmrinconp 0:62608f504846 256
lmrinconp 0:62608f504846 257 imprimir(0,0," Feliz",true); //Mensaje de despedida
lmrinconp 0:62608f504846 258 imprimir(0,1," dia!",false);
lmrinconp 0:62608f504846 259 }