PIO IX 6° A TP1_ejercicio1 ALMADA, Santiago MAVER, Francisco
Dependencies: mbed tsi_sensor DS1820
Diff: main.cpp
- Revision:
- 6:3ebdc74fd68f
- Parent:
- 5:ea823404aea8
--- a/main.cpp Wed May 22 13:53:10 2019 +0000 +++ b/main.cpp Thu May 30 22:43:23 2019 +0000 @@ -1,10 +1,11 @@ - #include "mbed.h" #include "DS1820.h" #include "tsi_sensor.h" -DS1820 probe(PTB0); - +//defino entradas +DS1820 probe(PTD4); +AnalogIn preset(PTC1); +DigitalIn sensor_cooler(PTA12); /* This defines will be replaced by PinNames soon */ #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) @@ -17,18 +18,230 @@ #error TARGET NOT DEFINED #endif -PwmOut salida1(LED_RED); -TSIAnalogSlider tsi(ELEC0, ELEC1, 40); -DigitalOut verde(LED_GREEN); -DigitalOut azul(LED_BLUE); +//general +enum maquina_de_estados_general {inicio1, lazo_abierto, lazo_cerrado}; +maquina_de_estados_general maquina_general; +void funcion_general(); +int pulsador = 0; + +//lazo_cerrado +enum maquina_de_estados_lazo_cerrado {inicio2, detecto_valor_temp, cooler_200rpm, cooler_vel_max, cooler_vel_aumenta_lineal}; +maquina_de_estados_lazo_cerrado maquina_lazo_cerrado; +void funcion_lazo_cerrado(); +float detecto_temp(); +int cambio_a_lazo_cerrado = 0; +float temperatura = 0.0; +float rpm = 0; +float duty = 0; +float valor = 0.0; + +//lazo abierto +enum maquina_de_estados_lazo_abierto {inicio3, detecto_valor_pote, vario_vel_cooler}; +maquina_de_estados_lazo_abierto maquina_lazo_abierto; +void funcion_lazo_abierto(); +int cambio_a_lazo_abierto = 0; + +//ticker +Ticker tiempo; +int contador = 0; +int a = 0; + + +PwmOut salida1(PTB3);//defino el cooler como salida +TSIAnalogSlider tsi(ELEC0, ELEC1, 40);//defino TSI - -int main() { +//defino variables para poder medir las RPM +int cuento_rpm() ; +int rpm_tot = 0; +int rpmm = 0; +int contador2 = 0; + +//funcion para saber las RPM +void funcion_tiempo() +{ + contador2++; + rpmm = rpm_tot*60;//rpm_tot en 1 segundo, multiplico por 60 para que sea un minuto (RPM) + rpm_tot = 0; +} +int main() +{ + salida1 = 1.0;//comienza el programa con el cooler encendido + wait(2);//un wait fuera del while, que no afecta el programa + tiempo.attach(&funcion_tiempo, 1); + while(1) { - probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready - printf("It is %3.1foC\r\n", probe.temperature()); - wait(1); + //reconozco los flancos del sensor de RPM + if((sensor_cooler == 1) && (a == 0)) { + rpm_tot++; + a = 1; + } + else if((sensor_cooler == 0) && (a == 1)) + a = 0; + + funcion_general(); + funcion_lazo_cerrado(); + funcion_lazo_abierto(); } } +//funcion que devuelve la temperatura +float detecto_temp() +{ + if(contador2 == 1) + probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready + printf(" temperatura: %3.1f", probe.temperature()); + contador2 = 0; + return probe.temperature(); +} -//#endif \ No newline at end of file +//funcion de la máquina de estados general +void funcion_general() +{ + switch(maquina_general) { + + default: + maquina_general = inicio1; + break; + + case inicio1: + //apreto TSI para dar inicio al sistema + if(tsi.readPercentage() != 0) { + cambio_a_lazo_cerrado = 1; + maquina_general = lazo_cerrado; + } + break; + + case lazo_cerrado: + //entrta al if cuando estoy en el modo lazo cerrado + //y se presiona el TSI + if(cambio_a_lazo_cerrado == 0) { + cambio_a_lazo_abierto = 1; + maquina_general = lazo_abierto; + } + + ///////PARA CAMBIAR DE MODO////// + if(tsi.readPercentage() >= 0.5) { + cambio_a_lazo_cerrado = 0; + maquina_lazo_cerrado = inicio2; + } + ///////////////////////////////// + break; + + case lazo_abierto: + //entrta al if cuando estoy en el modo lazo abierto + //y se presiona el TSI + if(cambio_a_lazo_abierto == 0) { + cambio_a_lazo_cerrado = 1; + maquina_general = lazo_cerrado; + } + + ///////PARA CAMBIAR DE MODO////// + if((tsi.readPercentage() <= 0.4) && (tsi.readPercentage() != 0)) { + cambio_a_lazo_abierto = 0; + maquina_lazo_abierto = inicio3; + } + ///////////////////////////////// + break; + } +} +//funcion del modo lazo cerrado +void funcion_lazo_cerrado() +{ + switch (maquina_lazo_cerrado) { + + default: + maquina_lazo_cerrado = inicio2; + break; + + case inicio2: + if (cambio_a_lazo_cerrado == 1) { + printf("\n\rLAZO CERRADO\r\n"); + maquina_lazo_cerrado = detecto_valor_temp; + } + break; + + case detecto_valor_temp: + temperatura = detecto_temp(); + if(temperatura <= 20) { //cooler 200rpm + maquina_lazo_cerrado = cooler_200rpm; + } + if(temperatura >= 70) { //cooler maximo + maquina_lazo_cerrado = cooler_vel_max; + } + if((temperatura > 20) && (temperatura < 70))//cooler varia + maquina_lazo_cerrado = cooler_vel_aumenta_lineal; + break; + + case cooler_200rpm: + //el cooler a 200RPM + salida1.write(0.0222); + + printf(" RPM = %d",rpmm); + + maquina_lazo_cerrado = detecto_valor_temp; + break; + + case cooler_vel_max: + //cooler a maxima RPM + salida1 = 1.0; + + printf("RPM = %d",rpmm); + + maquina_lazo_cerrado = detecto_valor_temp; + + break; + + case cooler_vel_aumenta_lineal: + //cooler aumenta segun la temperatura + rpm = ((temperatura * 200) / 20); + + duty = ((rpm * 100) / 9000); + + valor = (duty / 10); + + salida1.write(valor); + + printf(" RPM: %f ",rpm); + + maquina_lazo_cerrado = detecto_valor_temp; + break; + } +} +//modo lazo abierto +void funcion_lazo_abierto() +{ + switch(maquina_lazo_abierto) { + + default: + maquina_lazo_abierto = inicio3; + break; + + case inicio3: + if(cambio_a_lazo_abierto == 1) { + printf("LAZO_ABIERTO\n"); + maquina_lazo_abierto = detecto_valor_pote; + + } + break; + + case detecto_valor_pote: + //si el pote esta por debajo de 0,2 (pasado con el ADC + //cooler con 200 RPM + if(preset <= 0.0222) { + salida1.write(0.222); + printf(" RPM: %d",rpmm); + } else { + maquina_lazo_abierto = vario_vel_cooler; + } + break; + + case vario_vel_cooler: + + salida1.write(preset);//vario cooler segun preset + + printf(" RPM: %d",rpmm); + + maquina_lazo_abierto = detecto_valor_pote; + + break; + } +} \ No newline at end of file