luki
Dependencies: mbed tsi_sensor DS1820 DHT11
Diff: main.cpp
- Revision:
- 5:0cb38dfc1026
- Parent:
- 3:f483abe4bc57
--- a/main.cpp Fri Jan 13 18:30:37 2017 +0000 +++ b/main.cpp Thu Dec 12 20:01:18 2019 +0000 @@ -1,49 +1,195 @@ -#define MULTIPLE_PROBES -#define DATA_PIN A0 - - -#ifdef MULTIPLE_PROBES #include "mbed.h" -#include "DS1820.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 +// ENTRADAS Y SALIDAS +DigitalOut led_rojo(LED_RED); +DigitalOut led_verde(LED_GREEN); +DigitalOut led_azul(LED_BLUE); +AnalogIn preset_abierto(PTB1);//PRESET LAZO ABIERTO +PwmOut velocidad_cooler(PTB0);//COOLER +DigitalIn medidor_rpm(PTB8); //SENSOR EFECTO HALL +Dht11 sensor(PTB2); +//VALORES NECESARIOS +#define VELOCIDAD_MAX 7500 //MAXIMA VELOCIDAD QUE ALCANZA EL COOLER +#define VOLTAJE_MIN 0.06 //VOLTAJE QUE SE NECESITA PARA LOS 200 RPM +#define RPM_MIN 360 +#define TEMP_MAX 40 +#define TEMP_MIN 10 +//TIMERS +Ticker timer1; +Timer t; + +//FUNCIONES +void revoluciones(); +void boton_puls(); +void valor_preset(); +void tiempo(); +void func_temp(); + +//ESTADOS +enum {INICIO,CUENTA,ESPERO_PULS,LAZO_ABIERTO,LAZO_CERRADO,CV1,CV2,CV3,DECRECE_CERRADO,CRECE_CERRADO,APRETAR,SOLTAR,ESPERO,ESPERO2,FIN_PERIODO,CONTEO}; + +//VARIABLES +float preset,vel=0.5; +int rpm=0,pulsos=0,velocidad; +char tiempo1=0,tiempo4=0,tiempo3=10,modo=INICIO,temp,conversion=0; + +//CONFIG TSI +TSIAnalogSlider tsi(ELEC0, ELEC1, 40); -#define MAX_PROBES 16 - -DS1820* probe[MAX_PROBES]; - -int main() { - // Initialize the probe array to DS1820 objects - int num_devices = 0; - while(DS1820::unassignedProbe(DATA_PIN)) { - probe[num_devices] = new DS1820(DATA_PIN); - num_devices++; - if (num_devices == MAX_PROBES) +int main() +{ + timer1.attach(&tiempo,0.1); + medidor_rpm.mode(PullUp);//PULLUP + while(1) { + valor_preset(); //FUNCIONES DEL PROGRAMA + revoluciones(); + boton_puls(); + func_temp(); + /* printf("%i\n",rpm);*/ + switch(modo) { + default: + case INICIO://SE PRENDEN LOS LEDS DE INICIO + led_azul=1; + led_verde=0; + led_rojo=1; + break; + case LAZO_ABIERTO: + if(tiempo4==0) {//TIEMPO PARA SETEAR PWM + velocidad_cooler.write(preset); + tiempo4=1; + } + //APRETANDO EL TSI SE CAMBIA DE MODO A LAZO CERRADO + break; + case LAZO_CERRADO: + if(temp<TEMP_MIN)modo=CV1;//CASO PARA TEMPERATURA MENOR AL MINIMO + if((temp<TEMP_MAX)&&(temp>TEMP_MIN))modo=CV2;//CASO PARA TEMPERATURA ENTRE EL MINIMO Y MAXIMO + if(temp>TEMP_MAX)modo=CV3;//CASO PARA TEMPERATURA AL MAXIMO + //APRETANDO EL TSI SE CAMBIA DE MODO A LAZO ABIERTO + break; + case CV1: + velocidad=RPM_MIN;//SETEO DE RPM MIN + if(rpm<(velocidad+100))modo=CRECE_CERRADO;//EN CASO DE QUE LOS RPM BAJEN AL VALOR SETEADO + if(rpm>(velocidad-100))modo=DECRECE_CERRADO;//EN CASO DE QUE LOS RPM SUBAN AL VALOR SETEADO (SE COLOCA UN RANGO PERMITIDO DE +-100RPM) + break; + case CV2: + velocidad=RPM_MIN+((temp-TEMP_MIN)*((VELOCIDAD_MAX-RPM_MIN)/(TEMP_MAX-TEMP_MIN)));//SETEO DE RPM SEGUN TEMPERATURA + if(rpm<(velocidad+100))modo=CRECE_CERRADO; + if(rpm>(velocidad-100))modo=DECRECE_CERRADO; + break; + case CV3: + velocidad=VELOCIDAD_MAX; + if(rpm<(velocidad+100))modo=CRECE_CERRADO; + if(rpm>(velocidad-100))modo=DECRECE_CERRADO; + break; + case DECRECE_CERRADO: + if(rpm<=(velocidad+100)) {//SE SALE DEL MODO UNA VEZ SE ALCANCE EL VALOR REQUERIDO + modo=LAZO_CERRADO; + break; + } + if(conversion==1) {// PERMITE DISMINUIR LA VELOCIDAD SOLO DESPUES DE HABER MEDIDO LOS RPM + conversion=0; + if(vel>0.01)vel=vel-0.01;//CHEQUEA QUE NO SE ENCUENTRE EN EL MINIMO + else vel=0; + velocidad_cooler.write(vel);//SE SETEA LA VELOCIDAD CORREGIDA + } + break; + case CRECE_CERRADO: + if(rpm>=(velocidad-100)) {//SE SALE DEL MODO UNA VEZ SE ALCANCE EL VALOR REQUERIDO + modo=LAZO_CERRADO; + break; + } + if(conversion==1) {// PERMITE AUMENTAR LA VELOCIDAD SOLO DESPUES DE HABER MEDIDO LOS RPM + conversion=0; + if(vel<0.99)vel=vel+0.01;//CHEQUEA QUE NO SE ENCUENTRE EN EL MAXIMO + else vel=1; + velocidad_cooler.write(vel);//SE SETEA LA VELOCIDAD CORREGIDA + } + + break; + } + } +} +void valor_preset() +{ + if(preset_abierto<= VOLTAJE_MIN)preset=VOLTAJE_MIN;//SE FIJA LA VELOCIDAD MINIMA DEL COOLER EN LAZO ABIERTO + else preset=preset_abierto; +} +void boton_puls() +{ + static char modo_local1=APRETAR; + switch(modo_local1) { + default: + case APRETAR: + if(tsi.readPercentage()!=0)modo_local1=SOLTAR;//SE APRIETA EL TSI Y SE ESPERA A SOLTARLO + break; + case SOLTAR: + if(tsi.readPercentage()==0) { + modo_local1=APRETAR; + if(modo==LAZO_ABIERTO) {//SE CAMBIA AL MODO CONTRARIO QUE SE ENCUENTRA ACTIVO + led_azul=0; + led_rojo=1; + modo=LAZO_CERRADO; + } else { + modo=LAZO_ABIERTO; + led_azul=1; + led_rojo=0; + } + } break; } - - printf("Found %d device(s)\r\n\n", num_devices); - while(1) { - probe[0]->convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready - for (int i = 0; i<num_devices; i++) - printf("Device %d returns %3.1foC\r\n", i, probe[i]->temperature()); - printf("\r\n"); - wait(1); - } - } - -#else -#include "mbed.h" -#include "DS1820.h" - -DS1820 probe(DATA_PIN); - -int main() { - 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); +void revoluciones() +{ + static char modo_local=CUENTA; + static int pulsos=0; + switch(modo_local) { + case CUENTA: + rpm=pulsos*60;//SE HACE LA CUENTA PARA SABER LA CANTIDAD RPM + conversion=1;//INDICADOR DE FINALIZACION DE CONVERSION + printf("RPM COOLER= %i,PORCENTAJE DE PRESET= %.2f,VEL ACTUAL= %.2f,VEL SETEADA=%i,TEMP=%i,\n",rpm,preset*100,vel,velocidad,temp); + tiempo3=10;//TIEMPO ENTRE CADA SENSADO + pulsos=0; + modo_local=ESPERO; + break; + case ESPERO: + if(tiempo3==0)modo_local=CUENTA;//CUANDO FINALIZA EL TIEMPO DE SENSADO + else { + if(medidor_rpm==1) { + modo_local=ESPERO_PULS; + pulsos++; + } + } + case ESPERO_PULS: + if(medidor_rpm==0)modo_local=ESPERO; + if(tiempo3==0)modo_local=CUENTA; + break; } } - -#endif \ No newline at end of file +void func_temp() +{ + if(tiempo1==0) { + sensor.read(); //SE LEE LA TEMPERATURA + temp=sensor.getCelsius();//SE ASIGNA EL VALOR DE TEMPERATURA A UNA VARIABLE + tiempo1=50;//TIEMPO ENTRE CADA LECTURA DE TEMPERATURA 5 SEGUNDOS + tiempo3=10;//REINICIA TIEMPO MEDICION RPM EN CASO DE HABER INTERRUMPIDO + pulsos=0;//REINICIA PULSOS + } +} +void tiempo() +{ + if(tiempo1!=0)tiempo1--; + if(tiempo3!=0)tiempo3--; + if(tiempo4!=0)tiempo4--; +}