TP1 Ejer 1: Cooler cobas, montero

Dependencies:   mbed tsi_sensor DHT11

Committer:
cobasjuan
Date:
Thu Jun 06 13:46:17 2019 +0000
Revision:
0:af75ea285b6b
tp1 ejer1 cooler

Who changed what in which revision?

UserRevisionLine numberNew 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 }