luki
Dependencies: mbed tsi_sensor DS1820 DHT11
main.cpp
- Committer:
- guidoglorioso
- Date:
- 2019-12-12
- Revision:
- 5:0cb38dfc1026
- Parent:
- 3:f483abe4bc57
File content as of revision 5:0cb38dfc1026:
#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 // 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); 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; } } 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; } } 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--; }