cooler

Dependencies:   mbed tsi_sensor DHT11

main.cpp

Committer:
juanijc
Date:
2019-06-04
Revision:
0:488e4bd141d5

File content as of revision 0:488e4bd141d5:

#include "mbed.h"
#include "Dht11.h"
#include "tsi_sensor.h"

#define m 0.04
#define b -0.6

//tsi
#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
TSIAnalogSlider tsi(ELEC0, ELEC1, 40);

//funciones y maquinas de estado
void me_modo();
void timer();

enum me_modo_estados {abierto,cerrado};
enum me_modo_estados me_modo_estado=abierto;

//entradas y salidas
Dht11 sensor(PTB3);
AnalogIn preset(PTB2);
DigitalIn rpm(PTD4);

PwmOut cooler(PTC2);


Ticker t;

//variables utilizadas
int pres, pres_ant=0;
int tmo=0, tmo1=0, tmo2, rebote=0;
int primera=0;
int flanco=0;
int rpm_ant=0;
int revoluciones=0;

int main()
{
    //llamo a la funcion timer() cada 0.01 seg
    t.attach(&timer,0.01);
    while(1) {
        me_modo();
    }
}
//timer 
void timer()
{
    if(tmo!=0) {
        tmo--;
    }
    if(tmo1!=0) {
        tmo1--;
    }
    if(tmo2!=0) {
        tmo2--;
    }
    if(rebote!=0)
        rebote--;
}
//maquina de estado del modo
void me_modo()
{
    switch(me_modo_estado) {

        case abierto:
            if(primera==0) {
                printf("Lazo abierto\n");
                primera=1;
            }
            pres=preset*50;
            //detenccion de flancos descendentes
            if(rpm==0 && rpm_ant==1) {
                flanco++;
                rpm_ant=0;
            }
            if(rpm==1 && rpm_ant==0) {
                rpm_ant=1;
            }
            //calculo las RPM a partir de los flancos medidos en 1 seg 
            if(tmo==0) {
                tmo=100;
                revoluciones=flanco*60;
                printf("RPM= %i \n",revoluciones);
                flanco=0;
                //mido el preset cada 1 seg para no variar el duty de salida constantemente
                if(preset.read()<0.1)
                    cooler=0.1;
                else
                    cooler=preset.read();

            }
            //tsi sin rebote. Para cambiar al lazo cerrado
            if(tsi.readPercentage() && rebote==0) {
                me_modo_estado=cerrado;
                rebote=100;
                primera=0;
            }

            break;

        case cerrado:

            if(primera==0) {
                printf("Lazo cerrado\n");
                primera=1;
            }
            //actualizo la informacion del sensor y mido las RPM cada 1 seg. 
            if(tmo1==0) {
                tmo1=100;
                sensor.read();
                revoluciones=flanco*60;
                printf("RPM= %i  TEMP= %i\n",revoluciones, sensor.getCelsius());
                flanco=0;
            }
            //Deteccion de flancos descendentes
            if(rpm==0 && rpm_ant==1) {
                flanco++;
                rpm_ant=0;
            }
            if(rpm==1 && rpm_ant==0) {
                rpm_ant=1;
            }
            //transformo la informacion de temperatura y la entrego al cooler
            if(tmo2==0) {
                tmo2=100;
                //se hace hasta 50 porque es el maximo que soporta el sensor
                if(sensor.getCelsius()>20 && 50>sensor.getCelsius()) {
                    //recta que vincula la temperatura sensada entre 20 y 50 con el puerto de salida PWM
                    cooler = sensor.getCelsius() * m + b;
                }
                //casos extremos de temperatura
                if(20>=sensor.getCelsius())
                    cooler=0.1;
                if(sensor.getCelsius()>=50)
                    cooler=1;
            }
            //tsi sin rebote. Para cambiar al lazo abierto
            if(tsi.readPercentage() && rebote==0) {
                me_modo_estado=abierto;
                rebote=100;
                primera=0;
            }
            break;

    }
}