Version paralela con display grande y funciones adicionales

Dependencies:   BufferedSerial mbed

Fork of ConduSe-Speedometer2 by Felícito Manzano

Committer:
fmanzano_dtk
Date:
Thu Sep 01 05:02:48 2016 +0000
Revision:
2:1219ed8d7039
Parent:
1:6f4d8d53996f
Versi?n paralela con display grande

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fmanzano_dtk 0:2f13a25aa470 1 /*
fmanzano_dtk 0:2f13a25aa470 2 * - Proyecto: SABMiller ILC
fmanzano_dtk 0:2f13a25aa470 3 Velocímetro digital
fmanzano_dtk 0:2f13a25aa470 4 CONDUSE
fmanzano_dtk 0:2f13a25aa470 5
fmanzano_dtk 0:2f13a25aa470 6 * - Lenguaje: ANSI C/C++ (mbed)
fmanzano_dtk 2:1219ed8d7039 7 * - Tarjeta: Nucleo F091RC
fmanzano_dtk 0:2f13a25aa470 8 * - Referencias:
fmanzano_dtk 0:2f13a25aa470 9 * - Fecha: 2016/Agosto
fmanzano_dtk 0:2f13a25aa470 10 * - Autor(es): Felícito Manzano /
fmanzano_dtk 0:2f13a25aa470 11 Mario Vargas
fmanzano_dtk 0:2f13a25aa470 12 * - Compañia: V.S.R. de Centroamérica
fmanzano_dtk 0:2f13a25aa470 13 * - País: SV / CR
fmanzano_dtk 0:2f13a25aa470 14 */
fmanzano_dtk 0:2f13a25aa470 15
fmanzano_dtk 0:2f13a25aa470 16 /* ***********************************************
fmanzano_dtk 0:2f13a25aa470 17 ******* ARCHIVO CON FUNCIONES PARA CONDUSE *******
fmanzano_dtk 0:2f13a25aa470 18 ************************************************** */
fmanzano_dtk 0:2f13a25aa470 19
fmanzano_dtk 0:2f13a25aa470 20 #include "constantes.hpp"
fmanzano_dtk 0:2f13a25aa470 21 #include "BufferedSerial.h"
fmanzano_dtk 0:2f13a25aa470 22
fmanzano_dtk 0:2f13a25aa470 23 /* ***********************************************
fmanzano_dtk 0:2f13a25aa470 24 ******* CONTROL PARA COLORES RGB EN LED *******
fmanzano_dtk 0:2f13a25aa470 25 ************************************************** */
fmanzano_dtk 0:2f13a25aa470 26
fmanzano_dtk 0:2f13a25aa470 27 // https://developer.mbed.org/users/4180_1/notebook/rgb-leds/
fmanzano_dtk 0:2f13a25aa470 28
fmanzano_dtk 0:2f13a25aa470 29 //Class to control an RGB LED using three PWM pins
fmanzano_dtk 0:2f13a25aa470 30 class RGBLed
fmanzano_dtk 0:2f13a25aa470 31 {
fmanzano_dtk 0:2f13a25aa470 32 public:
fmanzano_dtk 0:2f13a25aa470 33 RGBLed(PinName redpin, PinName greenpin, PinName bluepin);
fmanzano_dtk 0:2f13a25aa470 34 void write(float red,float green, float blue);
fmanzano_dtk 0:2f13a25aa470 35 private:
fmanzano_dtk 0:2f13a25aa470 36 PwmOut _redpin;
fmanzano_dtk 0:2f13a25aa470 37 PwmOut _greenpin;
fmanzano_dtk 0:2f13a25aa470 38 PwmOut _bluepin;
fmanzano_dtk 0:2f13a25aa470 39 };
fmanzano_dtk 1:6f4d8d53996f 40
fmanzano_dtk 0:2f13a25aa470 41 RGBLed::RGBLed (PinName redpin, PinName greenpin, PinName bluepin)
fmanzano_dtk 0:2f13a25aa470 42 : _redpin(redpin), _greenpin(greenpin), _bluepin(bluepin)
fmanzano_dtk 0:2f13a25aa470 43 {
fmanzano_dtk 0:2f13a25aa470 44 //50Hz PWM clock default a bit too low, go to 2000Hz (less flicker)
fmanzano_dtk 0:2f13a25aa470 45 _redpin.period(0.0005);
fmanzano_dtk 0:2f13a25aa470 46 }
fmanzano_dtk 1:6f4d8d53996f 47
fmanzano_dtk 0:2f13a25aa470 48 void RGBLed::write(float red,float green, float blue)
fmanzano_dtk 0:2f13a25aa470 49 {
fmanzano_dtk 0:2f13a25aa470 50 _redpin = red;
fmanzano_dtk 0:2f13a25aa470 51 _greenpin = green;
fmanzano_dtk 0:2f13a25aa470 52 _bluepin = blue;
fmanzano_dtk 0:2f13a25aa470 53 }
fmanzano_dtk 0:2f13a25aa470 54
fmanzano_dtk 0:2f13a25aa470 55 /* ***********************************************
fmanzano_dtk 0:2f13a25aa470 56 ******* LISTADO DE FUNCIONES CONDUSE *******
fmanzano_dtk 0:2f13a25aa470 57 ************************************************** */
fmanzano_dtk 0:2f13a25aa470 58
fmanzano_dtk 0:2f13a25aa470 59 int iniciar_data_cp(int data[35])
fmanzano_dtk 0:2f13a25aa470 60 {
fmanzano_dtk 0:2f13a25aa470 61 /*
fmanzano_dtk 0:2f13a25aa470 62 Esta función recibe un arreglo, donde se contendrá la trama entrante del CP
fmanzano_dtk 0:2f13a25aa470 63 la función se encarga de almacenar 0 en cada posición del arreglo. La función
fmanzano_dtk 0:2f13a25aa470 64 siempre retorna 0.
fmanzano_dtk 0:2f13a25aa470 65 */
fmanzano_dtk 0:2f13a25aa470 66 int x;
fmanzano_dtk 0:2f13a25aa470 67 for (x = 0; x < 35; x++) {
fmanzano_dtk 0:2f13a25aa470 68 data[x] = 0;
fmanzano_dtk 0:2f13a25aa470 69 }
fmanzano_dtk 0:2f13a25aa470 70 return(0);
fmanzano_dtk 0:2f13a25aa470 71 }
fmanzano_dtk 0:2f13a25aa470 72
fmanzano_dtk 0:2f13a25aa470 73 int iniciar_display7s(DigitalOut *d7_cen, DigitalOut *d7_dec, DigitalOut *d7_uni)
fmanzano_dtk 0:2f13a25aa470 74 {
fmanzano_dtk 0:2f13a25aa470 75 /*
fmanzano_dtk 0:2f13a25aa470 76 Esta función se encarga de presentar en el display de 7 segmentos el mensaje:
fmanzano_dtk 0:2f13a25aa470 77 " --" para indicar que se está iniciando el sensor. La función siempre retorna 0
fmanzano_dtk 0:2f13a25aa470 78 */
fmanzano_dtk 0:2f13a25aa470 79 int x;
fmanzano_dtk 0:2f13a25aa470 80
fmanzano_dtk 0:2f13a25aa470 81 // Apagar el digito más significativo
fmanzano_dtk 0:2f13a25aa470 82 d7_cen[0] = CIEN_MENOR[0];
fmanzano_dtk 0:2f13a25aa470 83 d7_cen[1] = CIEN_MENOR[1];
fmanzano_dtk 0:2f13a25aa470 84
fmanzano_dtk 0:2f13a25aa470 85 // DECENAS
fmanzano_dtk 0:2f13a25aa470 86 for (x=0; x<7; x++) {
fmanzano_dtk 0:2f13a25aa470 87 d7_dec [x] = GUION[x];
fmanzano_dtk 0:2f13a25aa470 88 }
fmanzano_dtk 0:2f13a25aa470 89
fmanzano_dtk 0:2f13a25aa470 90 // Digito menos significativo (UNIDADES)
fmanzano_dtk 0:2f13a25aa470 91 for (x=0; x<7; x++) {
fmanzano_dtk 0:2f13a25aa470 92 d7_uni [x] = GUION[x];
fmanzano_dtk 0:2f13a25aa470 93 }
fmanzano_dtk 0:2f13a25aa470 94
fmanzano_dtk 0:2f13a25aa470 95 return(0);
fmanzano_dtk 0:2f13a25aa470 96 }
fmanzano_dtk 0:2f13a25aa470 97
fmanzano_dtk 0:2f13a25aa470 98 int consultar_conduse(BufferedSerial *puerto_CP)
fmanzano_dtk 0:2f13a25aa470 99 {
fmanzano_dtk 0:2f13a25aa470 100 /*
fmanzano_dtk 0:2f13a25aa470 101 Esta función recibe el puerto serial del CP ConduSe y se encarga de transmitir
fmanzano_dtk 0:2f13a25aa470 102 la trama de consulta por la velocidad.
fmanzano_dtk 0:2f13a25aa470 103 Siempre retorna 0
fmanzano_dtk 0:2f13a25aa470 104 */
fmanzano_dtk 0:2f13a25aa470 105 int x;
fmanzano_dtk 0:2f13a25aa470 106 for (x = 0; x < 9; x++) {
fmanzano_dtk 0:2f13a25aa470 107 puerto_CP -> putc(QUERRY_CONDUSE[x]);
fmanzano_dtk 0:2f13a25aa470 108 }
fmanzano_dtk 0:2f13a25aa470 109
fmanzano_dtk 0:2f13a25aa470 110 return(0);
fmanzano_dtk 0:2f13a25aa470 111 }
fmanzano_dtk 0:2f13a25aa470 112
fmanzano_dtk 0:2f13a25aa470 113 int recibir_respuesta_conduse(BufferedSerial *puerto_CP, int data[35])
fmanzano_dtk 0:2f13a25aa470 114 {
fmanzano_dtk 0:2f13a25aa470 115 /*
fmanzano_dtk 0:2f13a25aa470 116 Esta función recibe el puerto serial del CP conduSe más un arreglo entero
fmanzano_dtk 0:2f13a25aa470 117 para almacenar los datos recibidos.
fmanzano_dtk 0:2f13a25aa470 118 Esta función retorna 1 cuando se reciben datos. Retorna 0 cuando no hay
fmanzano_dtk 0:2f13a25aa470 119 datos por recibir en el puerto serial.
fmanzano_dtk 0:2f13a25aa470 120 */
fmanzano_dtk 0:2f13a25aa470 121
fmanzano_dtk 0:2f13a25aa470 122 int x=0;
fmanzano_dtk 1:6f4d8d53996f 123 int y=0;
fmanzano_dtk 0:2f13a25aa470 124
fmanzano_dtk 1:6f4d8d53996f 125 if (puerto_CP -> readable()) {
fmanzano_dtk 1:6f4d8d53996f 126 y=1;
fmanzano_dtk 1:6f4d8d53996f 127 wait_ms(30);
fmanzano_dtk 1:6f4d8d53996f 128 while (puerto_CP -> readable()) {
fmanzano_dtk 1:6f4d8d53996f 129 data[x] = puerto_CP -> getc();
fmanzano_dtk 1:6f4d8d53996f 130 x++;
fmanzano_dtk 0:2f13a25aa470 131
fmanzano_dtk 1:6f4d8d53996f 132 if (x >= 34) {
fmanzano_dtk 1:6f4d8d53996f 133 x=0;
fmanzano_dtk 1:6f4d8d53996f 134 }
fmanzano_dtk 0:2f13a25aa470 135 }
fmanzano_dtk 0:2f13a25aa470 136 }
fmanzano_dtk 1:6f4d8d53996f 137 return(y);
fmanzano_dtk 0:2f13a25aa470 138
fmanzano_dtk 0:2f13a25aa470 139 }
fmanzano_dtk 0:2f13a25aa470 140
fmanzano_dtk 0:2f13a25aa470 141 int validar_trama_conduse(int data[35])
fmanzano_dtk 0:2f13a25aa470 142 {
fmanzano_dtk 0:2f13a25aa470 143 /*
fmanzano_dtk 0:2f13a25aa470 144 Esta función recibe los datos recibidos en la trama conduse y verifica si es
fmanzano_dtk 0:2f13a25aa470 145 una trama valida para continuar analizandola. Si la trama es valida devuelve
fmanzano_dtk 0:2f13a25aa470 146 1 pero si es invalida devuelve 0.
fmanzano_dtk 0:2f13a25aa470 147 */
fmanzano_dtk 0:2f13a25aa470 148
fmanzano_dtk 0:2f13a25aa470 149 if ((data[CONDUSE_VAL0] == BYTE0_CONDUSE) &&
fmanzano_dtk 1:6f4d8d53996f 150 (data[CONDUSE_VAL1] == BYTE1_CONDUSE)) {
fmanzano_dtk 0:2f13a25aa470 151 return(1);
fmanzano_dtk 0:2f13a25aa470 152 } else {
fmanzano_dtk 0:2f13a25aa470 153 return(0);
fmanzano_dtk 0:2f13a25aa470 154 }
fmanzano_dtk 0:2f13a25aa470 155 }
fmanzano_dtk 0:2f13a25aa470 156
fmanzano_dtk 0:2f13a25aa470 157
fmanzano_dtk 0:2f13a25aa470 158 int extraer_velocidad_conduse(int data[35], float *velocidad)
fmanzano_dtk 0:2f13a25aa470 159 {
fmanzano_dtk 0:2f13a25aa470 160 /*
fmanzano_dtk 0:2f13a25aa470 161 Esta función se encarga de extraer el byte de la trama recibida que corresponde
fmanzano_dtk 0:2f13a25aa470 162 a la velocidad GPS y multiplicarlo por el factor de conversión de KNOTS (Nudos)
fmanzano_dtk 0:2f13a25aa470 163 a Km/h. La función siempre retorna 0.
fmanzano_dtk 0:2f13a25aa470 164 */
fmanzano_dtk 0:2f13a25aa470 165 *velocidad = (float)data[CONDUSE_VELOCIDAD] * KNOTS;
fmanzano_dtk 0:2f13a25aa470 166 return(0);
fmanzano_dtk 0:2f13a25aa470 167 }
fmanzano_dtk 0:2f13a25aa470 168
fmanzano_dtk 0:2f13a25aa470 169 int analizar_velocidad_conduse(float *velocidad, int *cent, int *dec, int *uni)
fmanzano_dtk 0:2f13a25aa470 170 {
fmanzano_dtk 0:2f13a25aa470 171 /*
fmanzano_dtk 0:2f13a25aa470 172 Esta función recibe una variable flotante con la velocidad gps expresada en
fmanzano_dtk 0:2f13a25aa470 173 Km/h y la separa en 3 enteros que representan las centenas, decenas y unidades.
fmanzano_dtk 0:2f13a25aa470 174 La función siempre retorna 0.
fmanzano_dtk 0:2f13a25aa470 175 */
fmanzano_dtk 0:2f13a25aa470 176
fmanzano_dtk 0:2f13a25aa470 177 if (*velocidad >= 100) {
fmanzano_dtk 0:2f13a25aa470 178 *cent = (((int)*velocidad)/ 100 % 10);
fmanzano_dtk 0:2f13a25aa470 179 *dec = (((int)*velocidad)/ 10 % 10);
fmanzano_dtk 0:2f13a25aa470 180 *uni = (((int)*velocidad) % 10);
fmanzano_dtk 0:2f13a25aa470 181
fmanzano_dtk 0:2f13a25aa470 182 } else if (*velocidad >= 10) {
fmanzano_dtk 0:2f13a25aa470 183 *cent = 0;
fmanzano_dtk 0:2f13a25aa470 184 *dec = (((int)*velocidad) / 10 % 10);
fmanzano_dtk 0:2f13a25aa470 185 *uni = (((int)*velocidad) % 10);
fmanzano_dtk 0:2f13a25aa470 186 } else {
fmanzano_dtk 0:2f13a25aa470 187 *cent = 0;
fmanzano_dtk 0:2f13a25aa470 188 *dec = 0;
fmanzano_dtk 0:2f13a25aa470 189 *uni = (int) *velocidad;
fmanzano_dtk 0:2f13a25aa470 190 }
fmanzano_dtk 0:2f13a25aa470 191 return(0);
fmanzano_dtk 0:2f13a25aa470 192 }
fmanzano_dtk 0:2f13a25aa470 193
fmanzano_dtk 0:2f13a25aa470 194 int presentar_velocidad(int *cen, int *dec, int *uni, DigitalOut *d7_cen,
fmanzano_dtk 0:2f13a25aa470 195 DigitalOut *d7_dec, DigitalOut *d7_uni)
fmanzano_dtk 0:2f13a25aa470 196 {
fmanzano_dtk 0:2f13a25aa470 197 /*
fmanzano_dtk 0:2f13a25aa470 198 Esta función recibe los digitos correspondientes a las decenas, centenas y
fmanzano_dtk 0:2f13a25aa470 199 unidades que representan la velocidad y que deben presentarse en los tres
fmanzano_dtk 0:2f13a25aa470 200 display de siete segmentos. La función siempre retorna 0.
fmanzano_dtk 0:2f13a25aa470 201 */
fmanzano_dtk 0:2f13a25aa470 202
fmanzano_dtk 0:2f13a25aa470 203 int x;
fmanzano_dtk 0:2f13a25aa470 204
fmanzano_dtk 0:2f13a25aa470 205 // Digito más significativo (CENTERNARES)
fmanzano_dtk 0:2f13a25aa470 206 if (*cen) {
fmanzano_dtk 0:2f13a25aa470 207 d7_cen[0] = CIEN_MAYOR[0];
fmanzano_dtk 0:2f13a25aa470 208 d7_cen[1] = CIEN_MAYOR[1];
fmanzano_dtk 0:2f13a25aa470 209 } else {
fmanzano_dtk 0:2f13a25aa470 210 d7_cen[0] = CIEN_MENOR[0];
fmanzano_dtk 0:2f13a25aa470 211 d7_cen[1] = CIEN_MENOR[1];
fmanzano_dtk 0:2f13a25aa470 212 }
fmanzano_dtk 0:2f13a25aa470 213
fmanzano_dtk 0:2f13a25aa470 214 // DECENAS
fmanzano_dtk 0:2f13a25aa470 215 for (x=0; x<7; x++) {
fmanzano_dtk 0:2f13a25aa470 216 d7_dec [x] = DIGITOS[*dec] [x];
fmanzano_dtk 0:2f13a25aa470 217 }
fmanzano_dtk 0:2f13a25aa470 218
fmanzano_dtk 0:2f13a25aa470 219 // Digito menos significativo (UNIDADES)
fmanzano_dtk 0:2f13a25aa470 220 for (x=0; x<7; x++) {
fmanzano_dtk 0:2f13a25aa470 221 d7_uni [x] = DIGITOS[*uni] [x];
fmanzano_dtk 0:2f13a25aa470 222 }
fmanzano_dtk 0:2f13a25aa470 223
fmanzano_dtk 0:2f13a25aa470 224 return(0);
fmanzano_dtk 0:2f13a25aa470 225 }
fmanzano_dtk 0:2f13a25aa470 226
fmanzano_dtk 0:2f13a25aa470 227
fmanzano_dtk 0:2f13a25aa470 228 int mostrar_error7s(DigitalOut *d7_cen, DigitalOut *d7_dec, DigitalOut *d7_uni)
fmanzano_dtk 0:2f13a25aa470 229 {
fmanzano_dtk 0:2f13a25aa470 230 /*
fmanzano_dtk 0:2f13a25aa470 231 Esta función se encarga de presentar en el display de 7 segmentos el mensaje:
fmanzano_dtk 0:2f13a25aa470 232 " EE" para indicar que se ha generado un Error. La función siempre retorna 0
fmanzano_dtk 0:2f13a25aa470 233 */
fmanzano_dtk 0:2f13a25aa470 234 int x;
fmanzano_dtk 0:2f13a25aa470 235
fmanzano_dtk 0:2f13a25aa470 236 // Apagar el digito más significativo
fmanzano_dtk 0:2f13a25aa470 237 d7_cen[0] = CIEN_MENOR[0];
fmanzano_dtk 0:2f13a25aa470 238 d7_cen[1] = CIEN_MENOR[1];
fmanzano_dtk 0:2f13a25aa470 239
fmanzano_dtk 0:2f13a25aa470 240 // DECENAS
fmanzano_dtk 0:2f13a25aa470 241 for (x=0; x<7; x++) {
fmanzano_dtk 0:2f13a25aa470 242 d7_dec [x] = ERROR_D7S[x];
fmanzano_dtk 0:2f13a25aa470 243 }
fmanzano_dtk 0:2f13a25aa470 244
fmanzano_dtk 0:2f13a25aa470 245 // Digito menos significativo (UNIDADES)
fmanzano_dtk 0:2f13a25aa470 246 for (x=0; x<7; x++) {
fmanzano_dtk 0:2f13a25aa470 247 d7_uni [x] = ERROR_D7S[x];
fmanzano_dtk 0:2f13a25aa470 248 }
fmanzano_dtk 0:2f13a25aa470 249
fmanzano_dtk 0:2f13a25aa470 250 return(0);
fmanzano_dtk 0:2f13a25aa470 251 }
fmanzano_dtk 0:2f13a25aa470 252
fmanzano_dtk 1:6f4d8d53996f 253 int actualizar_led(float *velocidad, DigitalOut *buzz, RGBLed *myRGBled)
fmanzano_dtk 0:2f13a25aa470 254 {
fmanzano_dtk 0:2f13a25aa470 255 /*
fmanzano_dtk 0:2f13a25aa470 256 Esta función recibe el valor de la velocidad y en base al valor activa las
fmanzano_dtk 0:2f13a25aa470 257 salidas PWM y el Buzzer. La función siempre retorna 0.
fmanzano_dtk 0:2f13a25aa470 258 */
fmanzano_dtk 0:2f13a25aa470 259
fmanzano_dtk 0:2f13a25aa470 260 if (*velocidad < VEL_RALENTI) { // Color azul
fmanzano_dtk 1:6f4d8d53996f 261
fmanzano_dtk 0:2f13a25aa470 262 myRGBled -> write(COLORES [0] [0], COLORES [0] [1], COLORES [0] [2]);
fmanzano_dtk 1:6f4d8d53996f 263 //buzz = 0;
fmanzano_dtk 0:2f13a25aa470 264
fmanzano_dtk 0:2f13a25aa470 265 } else if ((*velocidad >= (VEL_ADVERTENCIA-10)) &&
fmanzano_dtk 0:2f13a25aa470 266 (*velocidad < VEL_ADVERTENCIA)) { // Color amarillo
fmanzano_dtk 1:6f4d8d53996f 267
fmanzano_dtk 0:2f13a25aa470 268 myRGBled -> write(COLORES [2] [0], COLORES [2] [1], COLORES [2] [2]);
fmanzano_dtk 1:6f4d8d53996f 269 //buzz = 0;
fmanzano_dtk 0:2f13a25aa470 270
fmanzano_dtk 0:2f13a25aa470 271 } else if ((*velocidad >= VEL_ADVERTENCIA) &&
fmanzano_dtk 0:2f13a25aa470 272 (*velocidad < VEL_LIMITE)) { // Color ambar + slow beep
fmanzano_dtk 1:6f4d8d53996f 273
fmanzano_dtk 0:2f13a25aa470 274 myRGBled -> write(COLORES [3] [0], COLORES [3] [1], COLORES [3] [2]);
fmanzano_dtk 1:6f4d8d53996f 275 //buzz = 1;
fmanzano_dtk 0:2f13a25aa470 276
fmanzano_dtk 0:2f13a25aa470 277 } else if (*velocidad >= VEL_LIMITE) { // Color rojo + fast beep
fmanzano_dtk 1:6f4d8d53996f 278
fmanzano_dtk 0:2f13a25aa470 279 myRGBled -> write(COLORES [4] [0], COLORES [4] [1], COLORES [4] [2]);
fmanzano_dtk 1:6f4d8d53996f 280 //buzz = 1;
fmanzano_dtk 0:2f13a25aa470 281
fmanzano_dtk 0:2f13a25aa470 282 } else { // color verde
fmanzano_dtk 1:6f4d8d53996f 283
fmanzano_dtk 0:2f13a25aa470 284 myRGBled -> write(COLORES [1] [0], COLORES [1] [1], COLORES [1] [2]);
fmanzano_dtk 1:6f4d8d53996f 285 buzz = 0;
fmanzano_dtk 0:2f13a25aa470 286 }
fmanzano_dtk 0:2f13a25aa470 287
fmanzano_dtk 0:2f13a25aa470 288 return(0);
fmanzano_dtk 0:2f13a25aa470 289 }