Federico D'Andrea / Mbed 2 deprecated COOLER

Dependencies:   mbed tsi_sensor DHT11

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 //TRABAJO PRACTICO 1 - COOLER
00002 
00003 #include "mbed.h"
00004 #include <stdlib.h>     /* srand, rand */
00005 #include <time.h>       /* time */
00006 #include "tsi_sensor.h"
00007 #include "Dht11.h" /* LIBRERIA SENSOR */
00008 
00009 /* This defines will be replaced by PinNames soon */
00010 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
00011 #define ELEC0 9
00012 #define ELEC1 10
00013 #elif defined (TARGET_KL05Z)
00014 #define ELEC0 9
00015 #define ELEC1 8
00016 #else
00017 #error TARGET NOT DEFINED
00018 #endif
00019 
00020 
00021 
00022 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
00023 
00024 
00025 DigitalOut rojo(LED_RED);
00026 DigitalOut verde(LED_GREEN);
00027 DigitalOut azul(LED_BLUE);
00028 
00029 DigitalIn vueltas(PTD2);
00030     
00031 InterruptIn vuel(PTD4);
00032     
00033 Dht11 sensor(PTD7); 
00034 
00035 
00036 AnalogIn potenciometro(PTB0);
00037 
00038 PwmOut cooler(PTB3);  //Menos significativo unidad
00039 
00040 Ticker tiempo;
00041 
00042 Ticker escritura;
00043 enum {INICIO,GENERADOR,DETECCION,CHEQUEO};
00044 enum {COMIENZO,ABIERTO,CERRADO};
00045 enum {ROJO,VERDE,AZUL,ON,OFF};
00046 
00047 int estado=0, modo=0,comienza_juego,color=0,segundos=0,giros=0,RPM=0,entrada=0,escritura_hab=OFF;
00048 
00049 float p=0,incr=0.0005;
00050 
00051 DigitalOut myled(LED1);
00052 
00053 void sumav(){
00054     giros++; //por cada vuelta del cooler incrementa un giro
00055     }
00056 
00057 
00058 void segundo_reset() //cada un segundo toma el valor de los giros, predice su valor en RPM, los guarda en otra variable y resetea los giros
00059 {
00060     segundos++;
00061     if(segundos==1) {
00062         RPM=giros*60;
00063         giros=0;
00064         segundos=0;
00065     }
00066 }
00067 void escritura_cooler() //cada cierto tiempo escribe al a salida del PWM
00068 {
00069     cooler.period(0.5f);
00070     cooler.write(p);
00071 }
00072 void cooler_automatizado()//funcion principal que controla los modos
00073 {
00074     switch(estado) {
00075         case COMIENZO:
00076             if(modo==CERRADO) {//se activa el modo cerrado
00077                 printf("MODO CERRADO ACTIVADO\n\r");
00078                 escritura_hab=OFF;
00079                 estado=CERRADO;
00080             }
00081             if(modo==ABIERTO) {//se activa el modo abierto
00082                 printf("MODO ABIERTO ACTIVADO\n\r");
00083                 escritura_hab=OFF;
00084                 estado=ABIERTO;
00085             }
00086             break;
00087         case CERRADO:
00088             sensor.read(); //indica que se va a leer el DHT11
00089             if(sensor.getCelsius()==20){ //si la temperatura es 20 se mantiene en 3000 RPM
00090                 if(RPM>3000){
00091                 p=p-incr;
00092                 }
00093                 else{
00094                 p=p+incr;
00095                 }
00096             }
00097             if((sensor.getCelsius()>20)&&(sensor.getCelsius()<70)){//en el rango de 20 y 70 grados hace una regla de tres y saca el RPM equivalente y trata de llevar su velocidad al RPM indicado
00098                 int cel = sensor.getCelsius();//lee el sensor en celsius
00099                 int resultado = (cel * 10000) / 70;
00100                 printf("TEMP: %d resultado: %d RPM: %d\r\n",cel,resultado,RPM);//
00101                 if(RPM>resultado){
00102                 p=p-(float)0.0005;//disminuye la velocidad
00103                 }
00104                 else{
00105                 p=p+(float)0.0005;//aumenta la velocidad
00106                 }
00107                 if(p>(float)1){
00108                 p=(float)1;//el cooler al maximo
00109                 }
00110             }
00111             if(sensor.getCelsius()>=70){
00112                 p=(float)1;//mas de 70c al maximo
00113             }
00114             if(escritura_hab==OFF) {
00115                 escritura.attach(&escritura_cooler,0.2);//se acrtualiza la info del duty cada 200ms
00116                 escritura_hab=ON;
00117             }
00118             break;
00119 
00120         case ABIERTO:
00121     printf("RPM: %d\n\r",RPM);
00122             if(RPM>=3000){
00123              p=potenciometro;//si la velocidad es mas grande que la minima le presta atencion al potenciometro
00124             }
00125             else{
00126             p=p+incr;//de lo contrario se incrementa la velocidad
00127             }
00128             if(escritura_hab==OFF) {
00129                 escritura.attach(&escritura_cooler,0.2);
00130                 escritura_hab=ON;
00131             }
00132                 if(p>(float)1){
00133                 p=(float)1;
00134                 }
00135             break;
00136     }
00137 }
00138 
00139 
00140 
00141 
00142 
00143 int main()
00144 {
00145     rojo=1;
00146     verde=1;
00147     azul=1;
00148     
00149     tiempo.attach(&segundo_reset,1);
00150     vuel.rise(&sumav);
00151     
00152     while(1) {
00153         cooler_automatizado();
00154 
00155         float v = tsi.readPercentage();
00156 
00157         if((v>(float)0.15)&&(v<(float)0.4)) {
00158             rojo=0;
00159             verde=1;
00160             azul=1;
00161             estado=COMIENZO;
00162             modo=ABIERTO;
00163             v=0;
00164 
00165         } else if((v>(float)0.3)&&(v<(float)0.6)) {
00166             rojo=1;
00167             verde=0;
00168             azul=1;
00169         } else if((v>(float)0.5)&&(v<(float)0.9)) {
00170             rojo=1;
00171             verde=1;
00172             azul=0;
00173             estado=COMIENZO;
00174             modo=CERRADO;
00175             v=0;
00176         } else if((v>=(float)0.9)) {
00177             rojo=1;
00178             verde=1;
00179             azul=1;
00180         } else if((v<=(float)0.15)) {
00181             rojo=1;
00182             verde=1;
00183             azul=1;
00184         }
00185     }
00186 
00187 }