TP1 Ejer 1: Cooler cobas, montero
Dependencies: mbed tsi_sensor DHT11
main.cpp@0:af75ea285b6b, 2019-06-06 (annotated)
- Committer:
- cobasjuan
- Date:
- Thu Jun 06 13:46:17 2019 +0000
- Revision:
- 0:af75ea285b6b
tp1 ejer1 cooler
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cobasjuan | 0:af75ea285b6b | 1 | #include "mbed.h" |
cobasjuan | 0:af75ea285b6b | 2 | #include "tsi_sensor.h" |
cobasjuan | 0:af75ea285b6b | 3 | #include "Dht11.h" |
cobasjuan | 0:af75ea285b6b | 4 | |
cobasjuan | 0:af75ea285b6b | 5 | /* This defines will be replaced by PinNames soon */ |
cobasjuan | 0:af75ea285b6b | 6 | #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) |
cobasjuan | 0:af75ea285b6b | 7 | #define ELEC0 9 |
cobasjuan | 0:af75ea285b6b | 8 | #define ELEC1 10 |
cobasjuan | 0:af75ea285b6b | 9 | #elif defined (TARGET_KL05Z) |
cobasjuan | 0:af75ea285b6b | 10 | #define ELEC0 9 |
cobasjuan | 0:af75ea285b6b | 11 | #define ELEC1 8 |
cobasjuan | 0:af75ea285b6b | 12 | #else |
cobasjuan | 0:af75ea285b6b | 13 | #error TARGET NOT DEFINED |
cobasjuan | 0:af75ea285b6b | 14 | #endif |
cobasjuan | 0:af75ea285b6b | 15 | |
cobasjuan | 0:af75ea285b6b | 16 | #define ESPERO_ARRANQUE 0 |
cobasjuan | 0:af75ea285b6b | 17 | #define MODO_A 1 |
cobasjuan | 0:af75ea285b6b | 18 | #define MODO_C 2 |
cobasjuan | 0:af75ea285b6b | 19 | #define LEO_TEMP 3 |
cobasjuan | 0:af75ea285b6b | 20 | #define CALC_RPM 4 |
cobasjuan | 0:af75ea285b6b | 21 | #define COMPARO 5 |
cobasjuan | 0:af75ea285b6b | 22 | #define DESHABILITADO_A 6 |
cobasjuan | 0:af75ea285b6b | 23 | #define RECTA 8 |
cobasjuan | 0:af75ea285b6b | 24 | #define DESHABILITADO_C 9 |
cobasjuan | 0:af75ea285b6b | 25 | |
cobasjuan | 0:af75ea285b6b | 26 | //Timer |
cobasjuan | 0:af75ea285b6b | 27 | Timeout velocidad; |
cobasjuan | 0:af75ea285b6b | 28 | Timeout temperatura; |
cobasjuan | 0:af75ea285b6b | 29 | |
cobasjuan | 0:af75ea285b6b | 30 | // Funciones |
cobasjuan | 0:af75ea285b6b | 31 | void modo(); |
cobasjuan | 0:af75ea285b6b | 32 | void lazo_cerrado(); |
cobasjuan | 0:af75ea285b6b | 33 | void lazo_abierto(); |
cobasjuan | 0:af75ea285b6b | 34 | void sensado_temp(); |
cobasjuan | 0:af75ea285b6b | 35 | void calculo_vel_la(); |
cobasjuan | 0:af75ea285b6b | 36 | void calculo_vel_lc(); |
cobasjuan | 0:af75ea285b6b | 37 | void lectura_tsi(); |
cobasjuan | 0:af75ea285b6b | 38 | |
cobasjuan | 0:af75ea285b6b | 39 | // Variables |
cobasjuan | 0:af75ea285b6b | 40 | unsigned int variacion_tsi=0, hab_modo_a=0, hab_modo_c=0, rpm=0, alto=0, hab_sens_temp=0, rps=0; |
cobasjuan | 0:af75ea285b6b | 41 | unsigned int temp, flag_t1=0, rpm_real=0, flag_t2=0, segunda=0; |
cobasjuan | 0:af75ea285b6b | 42 | unsigned int flanco=0, flanco_t=0; |
cobasjuan | 0:af75ea285b6b | 43 | float veloc=0; |
cobasjuan | 0:af75ea285b6b | 44 | unsigned int paso_abierto=DESHABILITADO_A; |
cobasjuan | 0:af75ea285b6b | 45 | unsigned int nivel_temp=DESHABILITADO_C; |
cobasjuan | 0:af75ea285b6b | 46 | |
cobasjuan | 0:af75ea285b6b | 47 | // Entradas |
cobasjuan | 0:af75ea285b6b | 48 | TSIAnalogSlider tsi(ELEC0, ELEC1, 40); |
cobasjuan | 0:af75ea285b6b | 49 | AnalogIn pote(A1); |
cobasjuan | 0:af75ea285b6b | 50 | Dht11 sensor(PTD7); |
cobasjuan | 0:af75ea285b6b | 51 | DigitalIn rev(A2); // Funcion para rpm |
cobasjuan | 0:af75ea285b6b | 52 | |
cobasjuan | 0:af75ea285b6b | 53 | //Salidas |
cobasjuan | 0:af75ea285b6b | 54 | PwmOut cooler(A3); |
cobasjuan | 0:af75ea285b6b | 55 | |
cobasjuan | 0:af75ea285b6b | 56 | int main(void) |
cobasjuan | 0:af75ea285b6b | 57 | { |
cobasjuan | 0:af75ea285b6b | 58 | while (true) { |
cobasjuan | 0:af75ea285b6b | 59 | lectura_tsi(); |
cobasjuan | 0:af75ea285b6b | 60 | modo(); |
cobasjuan | 0:af75ea285b6b | 61 | lazo_cerrado(); |
cobasjuan | 0:af75ea285b6b | 62 | lazo_abierto(); |
cobasjuan | 0:af75ea285b6b | 63 | } |
cobasjuan | 0:af75ea285b6b | 64 | } |
cobasjuan | 0:af75ea285b6b | 65 | |
cobasjuan | 0:af75ea285b6b | 66 | void modo() // Encendido y selector de modo |
cobasjuan | 0:af75ea285b6b | 67 | { |
cobasjuan | 0:af75ea285b6b | 68 | static unsigned int paso_modo=ESPERO_ARRANQUE; |
cobasjuan | 0:af75ea285b6b | 69 | switch(paso_modo) { |
cobasjuan | 0:af75ea285b6b | 70 | case ESPERO_ARRANQUE: |
cobasjuan | 0:af75ea285b6b | 71 | if(variacion_tsi == 1 && alto == 0) { // alto = flag para detectar el flanco |
cobasjuan | 0:af75ea285b6b | 72 | alto=1; |
cobasjuan | 0:af75ea285b6b | 73 | printf("Comienzo\n\r"); |
cobasjuan | 0:af75ea285b6b | 74 | printf("LAZO ABIERTO\n\r"); |
cobasjuan | 0:af75ea285b6b | 75 | paso_modo=MODO_A; |
cobasjuan | 0:af75ea285b6b | 76 | } |
cobasjuan | 0:af75ea285b6b | 77 | break; |
cobasjuan | 0:af75ea285b6b | 78 | case MODO_A: |
cobasjuan | 0:af75ea285b6b | 79 | hab_modo_a=1; |
cobasjuan | 0:af75ea285b6b | 80 | hab_modo_c=0; |
cobasjuan | 0:af75ea285b6b | 81 | if(variacion_tsi == 1 && alto == 0) { |
cobasjuan | 0:af75ea285b6b | 82 | alto=1; |
cobasjuan | 0:af75ea285b6b | 83 | printf("LAZO CERRADO\n\r"); |
cobasjuan | 0:af75ea285b6b | 84 | paso_modo=MODO_C; |
cobasjuan | 0:af75ea285b6b | 85 | } |
cobasjuan | 0:af75ea285b6b | 86 | break; |
cobasjuan | 0:af75ea285b6b | 87 | case MODO_C: |
cobasjuan | 0:af75ea285b6b | 88 | hab_modo_a=0; |
cobasjuan | 0:af75ea285b6b | 89 | hab_modo_c=1; |
cobasjuan | 0:af75ea285b6b | 90 | if(variacion_tsi == 1 && alto == 0) { |
cobasjuan | 0:af75ea285b6b | 91 | alto=1; |
cobasjuan | 0:af75ea285b6b | 92 | printf("LAZO ABIERTO\n\r"); |
cobasjuan | 0:af75ea285b6b | 93 | paso_modo=MODO_A; |
cobasjuan | 0:af75ea285b6b | 94 | } |
cobasjuan | 0:af75ea285b6b | 95 | break; |
cobasjuan | 0:af75ea285b6b | 96 | } |
cobasjuan | 0:af75ea285b6b | 97 | } |
cobasjuan | 0:af75ea285b6b | 98 | |
cobasjuan | 0:af75ea285b6b | 99 | void lazo_cerrado() |
cobasjuan | 0:af75ea285b6b | 100 | { |
cobasjuan | 0:af75ea285b6b | 101 | switch(nivel_temp) { |
cobasjuan | 0:af75ea285b6b | 102 | case DESHABILITADO_C: // Este caso espera que se habilite la maquina de estados |
cobasjuan | 0:af75ea285b6b | 103 | if(hab_modo_c == 1) { |
cobasjuan | 0:af75ea285b6b | 104 | hab_sens_temp=1; |
cobasjuan | 0:af75ea285b6b | 105 | nivel_temp=LEO_TEMP; |
cobasjuan | 0:af75ea285b6b | 106 | } |
cobasjuan | 0:af75ea285b6b | 107 | break; |
cobasjuan | 0:af75ea285b6b | 108 | case LEO_TEMP: // despues de 2 segundos attachea una funcion que lee la temperatura |
cobasjuan | 0:af75ea285b6b | 109 | if(flanco_t == 0) { // flag para que entre una sola vez |
cobasjuan | 0:af75ea285b6b | 110 | flanco_t=1; |
cobasjuan | 0:af75ea285b6b | 111 | temperatura.attach(&sensado_temp, 2); |
cobasjuan | 0:af75ea285b6b | 112 | } |
cobasjuan | 0:af75ea285b6b | 113 | if(hab_modo_c == 0) { // si se cambia el modo se deshabilita la maquina de estados |
cobasjuan | 0:af75ea285b6b | 114 | nivel_temp=DESHABILITADO_C; |
cobasjuan | 0:af75ea285b6b | 115 | hab_sens_temp=0; |
cobasjuan | 0:af75ea285b6b | 116 | } |
cobasjuan | 0:af75ea285b6b | 117 | break; |
cobasjuan | 0:af75ea285b6b | 118 | case CALC_RPM: // Mido la cantidad de veces que se pone en 1 la pata del cooler de las revoluciones y saco el calculo dentro de un tiempo |
cobasjuan | 0:af75ea285b6b | 119 | if(flag_t2 == 0) { // para obtener las revoluciones por minuto |
cobasjuan | 0:af75ea285b6b | 120 | flag_t2=1; |
cobasjuan | 0:af75ea285b6b | 121 | velocidad.attach(&calculo_vel_lc, 0.5); |
cobasjuan | 0:af75ea285b6b | 122 | } |
cobasjuan | 0:af75ea285b6b | 123 | if(rev == 0 && flanco==1) { // flanco = variable para detectar el flanco |
cobasjuan | 0:af75ea285b6b | 124 | flanco=0; |
cobasjuan | 0:af75ea285b6b | 125 | } |
cobasjuan | 0:af75ea285b6b | 126 | if(rev == 1 && flanco==0) { |
cobasjuan | 0:af75ea285b6b | 127 | flanco=1; |
cobasjuan | 0:af75ea285b6b | 128 | rps++; |
cobasjuan | 0:af75ea285b6b | 129 | } |
cobasjuan | 0:af75ea285b6b | 130 | if(hab_modo_c == 0) { |
cobasjuan | 0:af75ea285b6b | 131 | nivel_temp=DESHABILITADO_C; |
cobasjuan | 0:af75ea285b6b | 132 | hab_sens_temp=0; |
cobasjuan | 0:af75ea285b6b | 133 | } |
cobasjuan | 0:af75ea285b6b | 134 | break; |
cobasjuan | 0:af75ea285b6b | 135 | case COMPARO: // comparo las RPM que deberia haber teoricamente con las que fueron medidas anteriormente y corrijo |
cobasjuan | 0:af75ea285b6b | 136 | segunda=1; |
cobasjuan | 0:af75ea285b6b | 137 | rpm_real=(140*temp)-2600; // calculo teorico |
cobasjuan | 0:af75ea285b6b | 138 | if(rpm_real <= 200) { |
cobasjuan | 0:af75ea285b6b | 139 | printf("RPM TEORICO = 200\n\r"); |
cobasjuan | 0:af75ea285b6b | 140 | } else if(rpm_real > 200) { |
cobasjuan | 0:af75ea285b6b | 141 | printf("RPM TEORICO = %d\n\r",rpm_real); |
cobasjuan | 0:af75ea285b6b | 142 | } |
cobasjuan | 0:af75ea285b6b | 143 | if(temp > 20 && temp < 70) { |
cobasjuan | 0:af75ea285b6b | 144 | if(rpm_real > rpm) { // si las rpm teoricas son superiores a las medidas aumentamos las rpm |
cobasjuan | 0:af75ea285b6b | 145 | cooler.write(veloc + 0.05); |
cobasjuan | 0:af75ea285b6b | 146 | } else if(rpm_real < rpm) { // si las rpm teoricas son inferiores a las medidas bajamos las rpm |
cobasjuan | 0:af75ea285b6b | 147 | cooler.write(veloc - 0.05); |
cobasjuan | 0:af75ea285b6b | 148 | } |
cobasjuan | 0:af75ea285b6b | 149 | } |
cobasjuan | 0:af75ea285b6b | 150 | nivel_temp=CALC_RPM; // una vez que comparo y corrigio vuelvo a calcular las rpm |
cobasjuan | 0:af75ea285b6b | 151 | if(hab_modo_c == 0) { |
cobasjuan | 0:af75ea285b6b | 152 | nivel_temp=DESHABILITADO_C; |
cobasjuan | 0:af75ea285b6b | 153 | hab_sens_temp=0; |
cobasjuan | 0:af75ea285b6b | 154 | } |
cobasjuan | 0:af75ea285b6b | 155 | break; |
cobasjuan | 0:af75ea285b6b | 156 | } |
cobasjuan | 0:af75ea285b6b | 157 | } |
cobasjuan | 0:af75ea285b6b | 158 | |
cobasjuan | 0:af75ea285b6b | 159 | void lazo_abierto() |
cobasjuan | 0:af75ea285b6b | 160 | { |
cobasjuan | 0:af75ea285b6b | 161 | switch(paso_abierto) { |
cobasjuan | 0:af75ea285b6b | 162 | case DESHABILITADO_A: |
cobasjuan | 0:af75ea285b6b | 163 | if(hab_modo_a == 1) { |
cobasjuan | 0:af75ea285b6b | 164 | paso_abierto=RECTA; |
cobasjuan | 0:af75ea285b6b | 165 | } |
cobasjuan | 0:af75ea285b6b | 166 | break; |
cobasjuan | 0:af75ea285b6b | 167 | case RECTA: |
cobasjuan | 0:af75ea285b6b | 168 | if(flag_t1 == 0) { |
cobasjuan | 0:af75ea285b6b | 169 | if(pote >= 0.027) { // Asigno el valor del pote al cooler |
cobasjuan | 0:af75ea285b6b | 170 | cooler.write(pote); |
cobasjuan | 0:af75ea285b6b | 171 | } else if(pote < 0.027) { |
cobasjuan | 0:af75ea285b6b | 172 | cooler.write(0.027); |
cobasjuan | 0:af75ea285b6b | 173 | } |
cobasjuan | 0:af75ea285b6b | 174 | flag_t1=1; |
cobasjuan | 0:af75ea285b6b | 175 | velocidad.attach(&calculo_vel_la, 0.5); // Timeout que realiza el calculo de los rpm cada medio segundo |
cobasjuan | 0:af75ea285b6b | 176 | } |
cobasjuan | 0:af75ea285b6b | 177 | if(rev == 0 && flanco==1) { |
cobasjuan | 0:af75ea285b6b | 178 | flanco=0; |
cobasjuan | 0:af75ea285b6b | 179 | } |
cobasjuan | 0:af75ea285b6b | 180 | if(rev == 1 && flanco==0) { |
cobasjuan | 0:af75ea285b6b | 181 | flanco=1; |
cobasjuan | 0:af75ea285b6b | 182 | rps++; |
cobasjuan | 0:af75ea285b6b | 183 | } |
cobasjuan | 0:af75ea285b6b | 184 | if(hab_modo_a == 0) { |
cobasjuan | 0:af75ea285b6b | 185 | paso_abierto=DESHABILITADO_A; |
cobasjuan | 0:af75ea285b6b | 186 | } |
cobasjuan | 0:af75ea285b6b | 187 | break; |
cobasjuan | 0:af75ea285b6b | 188 | } |
cobasjuan | 0:af75ea285b6b | 189 | } |
cobasjuan | 0:af75ea285b6b | 190 | |
cobasjuan | 0:af75ea285b6b | 191 | void sensado_temp() // Funcion que lee el sensor y se guarda en una variable la temperatura |
cobasjuan | 0:af75ea285b6b | 192 | { |
cobasjuan | 0:af75ea285b6b | 193 | sensor.read(); |
cobasjuan | 0:af75ea285b6b | 194 | temp=sensor.getCelsius(); |
cobasjuan | 0:af75ea285b6b | 195 | printf("T = %d\n\r",temp); |
cobasjuan | 0:af75ea285b6b | 196 | if(temp <= 20) { |
cobasjuan | 0:af75ea285b6b | 197 | cooler.write(0.027); |
cobasjuan | 0:af75ea285b6b | 198 | } else if(temp >= 70) { |
cobasjuan | 0:af75ea285b6b | 199 | cooler.write(1); |
cobasjuan | 0:af75ea285b6b | 200 | } else if(temp < 70 && temp > 20) { |
cobasjuan | 0:af75ea285b6b | 201 | veloc=(0.0195 * temp) - 0.365; // ecuacion de la velocidad en funcion de la temperatura |
cobasjuan | 0:af75ea285b6b | 202 | cooler.write(veloc); |
cobasjuan | 0:af75ea285b6b | 203 | } |
cobasjuan | 0:af75ea285b6b | 204 | flanco_t=0; |
cobasjuan | 0:af75ea285b6b | 205 | nivel_temp=CALC_RPM; |
cobasjuan | 0:af75ea285b6b | 206 | } |
cobasjuan | 0:af75ea285b6b | 207 | |
cobasjuan | 0:af75ea285b6b | 208 | void calculo_vel_la() // saco el calculo de las rpm a partir de las revoluciones que midio en un determinado tiempo |
cobasjuan | 0:af75ea285b6b | 209 | { |
cobasjuan | 0:af75ea285b6b | 210 | rpm=rps*120; |
cobasjuan | 0:af75ea285b6b | 211 | printf("RPM = %d \n\r", rpm); |
cobasjuan | 0:af75ea285b6b | 212 | rps=0; |
cobasjuan | 0:af75ea285b6b | 213 | flag_t1=0; |
cobasjuan | 0:af75ea285b6b | 214 | } |
cobasjuan | 0:af75ea285b6b | 215 | |
cobasjuan | 0:af75ea285b6b | 216 | void calculo_vel_lc() // saco el calculo de las rpm a partir de las revoluciones que midio en un determinado tiempo |
cobasjuan | 0:af75ea285b6b | 217 | { |
cobasjuan | 0:af75ea285b6b | 218 | rpm=rps*120; |
cobasjuan | 0:af75ea285b6b | 219 | printf("RPM REAL = %d \n\r", rpm); |
cobasjuan | 0:af75ea285b6b | 220 | rps=0; |
cobasjuan | 0:af75ea285b6b | 221 | flag_t1=0; |
cobasjuan | 0:af75ea285b6b | 222 | if(flag_t2 == 1 && segunda == 0) { |
cobasjuan | 0:af75ea285b6b | 223 | flag_t2=0; |
cobasjuan | 0:af75ea285b6b | 224 | nivel_temp=COMPARO; |
cobasjuan | 0:af75ea285b6b | 225 | } else if(flag_t2 == 1 && segunda == 1) { // segunda = variable que se pone en 1 luego de haber comparado y corregido |
cobasjuan | 0:af75ea285b6b | 226 | flag_t2=0; |
cobasjuan | 0:af75ea285b6b | 227 | segunda=0; |
cobasjuan | 0:af75ea285b6b | 228 | nivel_temp=LEO_TEMP; |
cobasjuan | 0:af75ea285b6b | 229 | } |
cobasjuan | 0:af75ea285b6b | 230 | } |
cobasjuan | 0:af75ea285b6b | 231 | |
cobasjuan | 0:af75ea285b6b | 232 | void lectura_tsi() // funcion que lee el tsi |
cobasjuan | 0:af75ea285b6b | 233 | { |
cobasjuan | 0:af75ea285b6b | 234 | if(tsi.readPercentage() != 0) { |
cobasjuan | 0:af75ea285b6b | 235 | variacion_tsi=1; |
cobasjuan | 0:af75ea285b6b | 236 | } else { |
cobasjuan | 0:af75ea285b6b | 237 | variacion_tsi=0; |
cobasjuan | 0:af75ea285b6b | 238 | alto=0; |
cobasjuan | 0:af75ea285b6b | 239 | } |
cobasjuan | 0:af75ea285b6b | 240 | } |