TP1 Ejer 1: Cooler cobas, montero
Dependencies: mbed tsi_sensor DHT11
main.cpp
- Committer:
- cobasjuan
- Date:
- 2019-06-06
- Revision:
- 0:af75ea285b6b
File content as of revision 0:af75ea285b6b:
#include "mbed.h" #include "tsi_sensor.h" #include "Dht11.h" /* This defines will be replaced by PinNames soon */ #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) #define ELEC0 9 #define ELEC1 10 #elif defined (TARGET_KL05Z) #define ELEC0 9 #define ELEC1 8 #else #error TARGET NOT DEFINED #endif #define ESPERO_ARRANQUE 0 #define MODO_A 1 #define MODO_C 2 #define LEO_TEMP 3 #define CALC_RPM 4 #define COMPARO 5 #define DESHABILITADO_A 6 #define RECTA 8 #define DESHABILITADO_C 9 //Timer Timeout velocidad; Timeout temperatura; // Funciones void modo(); void lazo_cerrado(); void lazo_abierto(); void sensado_temp(); void calculo_vel_la(); void calculo_vel_lc(); void lectura_tsi(); // Variables unsigned int variacion_tsi=0, hab_modo_a=0, hab_modo_c=0, rpm=0, alto=0, hab_sens_temp=0, rps=0; unsigned int temp, flag_t1=0, rpm_real=0, flag_t2=0, segunda=0; unsigned int flanco=0, flanco_t=0; float veloc=0; unsigned int paso_abierto=DESHABILITADO_A; unsigned int nivel_temp=DESHABILITADO_C; // Entradas TSIAnalogSlider tsi(ELEC0, ELEC1, 40); AnalogIn pote(A1); Dht11 sensor(PTD7); DigitalIn rev(A2); // Funcion para rpm //Salidas PwmOut cooler(A3); int main(void) { while (true) { lectura_tsi(); modo(); lazo_cerrado(); lazo_abierto(); } } void modo() // Encendido y selector de modo { static unsigned int paso_modo=ESPERO_ARRANQUE; switch(paso_modo) { case ESPERO_ARRANQUE: if(variacion_tsi == 1 && alto == 0) { // alto = flag para detectar el flanco alto=1; printf("Comienzo\n\r"); printf("LAZO ABIERTO\n\r"); paso_modo=MODO_A; } break; case MODO_A: hab_modo_a=1; hab_modo_c=0; if(variacion_tsi == 1 && alto == 0) { alto=1; printf("LAZO CERRADO\n\r"); paso_modo=MODO_C; } break; case MODO_C: hab_modo_a=0; hab_modo_c=1; if(variacion_tsi == 1 && alto == 0) { alto=1; printf("LAZO ABIERTO\n\r"); paso_modo=MODO_A; } break; } } void lazo_cerrado() { switch(nivel_temp) { case DESHABILITADO_C: // Este caso espera que se habilite la maquina de estados if(hab_modo_c == 1) { hab_sens_temp=1; nivel_temp=LEO_TEMP; } break; case LEO_TEMP: // despues de 2 segundos attachea una funcion que lee la temperatura if(flanco_t == 0) { // flag para que entre una sola vez flanco_t=1; temperatura.attach(&sensado_temp, 2); } if(hab_modo_c == 0) { // si se cambia el modo se deshabilita la maquina de estados nivel_temp=DESHABILITADO_C; hab_sens_temp=0; } break; 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 if(flag_t2 == 0) { // para obtener las revoluciones por minuto flag_t2=1; velocidad.attach(&calculo_vel_lc, 0.5); } if(rev == 0 && flanco==1) { // flanco = variable para detectar el flanco flanco=0; } if(rev == 1 && flanco==0) { flanco=1; rps++; } if(hab_modo_c == 0) { nivel_temp=DESHABILITADO_C; hab_sens_temp=0; } break; case COMPARO: // comparo las RPM que deberia haber teoricamente con las que fueron medidas anteriormente y corrijo segunda=1; rpm_real=(140*temp)-2600; // calculo teorico if(rpm_real <= 200) { printf("RPM TEORICO = 200\n\r"); } else if(rpm_real > 200) { printf("RPM TEORICO = %d\n\r",rpm_real); } if(temp > 20 && temp < 70) { if(rpm_real > rpm) { // si las rpm teoricas son superiores a las medidas aumentamos las rpm cooler.write(veloc + 0.05); } else if(rpm_real < rpm) { // si las rpm teoricas son inferiores a las medidas bajamos las rpm cooler.write(veloc - 0.05); } } nivel_temp=CALC_RPM; // una vez que comparo y corrigio vuelvo a calcular las rpm if(hab_modo_c == 0) { nivel_temp=DESHABILITADO_C; hab_sens_temp=0; } break; } } void lazo_abierto() { switch(paso_abierto) { case DESHABILITADO_A: if(hab_modo_a == 1) { paso_abierto=RECTA; } break; case RECTA: if(flag_t1 == 0) { if(pote >= 0.027) { // Asigno el valor del pote al cooler cooler.write(pote); } else if(pote < 0.027) { cooler.write(0.027); } flag_t1=1; velocidad.attach(&calculo_vel_la, 0.5); // Timeout que realiza el calculo de los rpm cada medio segundo } if(rev == 0 && flanco==1) { flanco=0; } if(rev == 1 && flanco==0) { flanco=1; rps++; } if(hab_modo_a == 0) { paso_abierto=DESHABILITADO_A; } break; } } void sensado_temp() // Funcion que lee el sensor y se guarda en una variable la temperatura { sensor.read(); temp=sensor.getCelsius(); printf("T = %d\n\r",temp); if(temp <= 20) { cooler.write(0.027); } else if(temp >= 70) { cooler.write(1); } else if(temp < 70 && temp > 20) { veloc=(0.0195 * temp) - 0.365; // ecuacion de la velocidad en funcion de la temperatura cooler.write(veloc); } flanco_t=0; nivel_temp=CALC_RPM; } void calculo_vel_la() // saco el calculo de las rpm a partir de las revoluciones que midio en un determinado tiempo { rpm=rps*120; printf("RPM = %d \n\r", rpm); rps=0; flag_t1=0; } void calculo_vel_lc() // saco el calculo de las rpm a partir de las revoluciones que midio en un determinado tiempo { rpm=rps*120; printf("RPM REAL = %d \n\r", rpm); rps=0; flag_t1=0; if(flag_t2 == 1 && segunda == 0) { flag_t2=0; nivel_temp=COMPARO; } else if(flag_t2 == 1 && segunda == 1) { // segunda = variable que se pone en 1 luego de haber comparado y corregido flag_t2=0; segunda=0; nivel_temp=LEO_TEMP; } } void lectura_tsi() // funcion que lee el tsi { if(tsi.readPercentage() != 0) { variacion_tsi=1; } else { variacion_tsi=0; alto=0; } }