PIO IX 6° A TP1_ejercicio1 ALMADA, Santiago MAVER, Francisco

Dependencies:   mbed tsi_sensor DS1820

main.cpp

Committer:
Franmaver
Date:
2019-05-30
Revision:
6:3ebdc74fd68f
Parent:
5:ea823404aea8

File content as of revision 6:3ebdc74fd68f:

#include "mbed.h"
#include "DS1820.h"
#include "tsi_sensor.h"

//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)
#define ELEC0 9
#define ELEC1 10
#elif defined (TARGET_KL05Z)
#define ELEC0 9
#define ELEC1 8
#else
#error TARGET NOT DEFINED
#endif

//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

//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) {
        //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();
}

//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;
    }
}