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@0:62608f504846, 2019-08-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |