Pio IX Jalle Ventiades 6b 2019

Dependencies:   mbed tsi_sensor MMA8451Q DHT11

main.cpp

Committer:
Jalle
Date:
2019-06-23
Revision:
0:804018389320

File content as of revision 0:804018389320:

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




DigitalIn enta(PTD5,PullUp);
Dht11 sensor(PTD7);
AnalogIn   ain(A0);
AnalogIn cooler(PTB3);

unsigned int e=0,cuenta=2,hay=0,estado=0,paso=0,caso=0,tiempo=9,d=0,c=0,acta=0,tempp=0,entad=0,cuentar=0,rpm=0,f=0,maestro=0,mostramos=0,mostrar=0;

double t;
double m;

Ticker rapido;
Ticker lento;
void funcion();
void tiemporpm();
PwmOut fan(A1);




int main(void)
{

    rapido.attach(&funcion, 0.01); //Ticker para el antirebote
    lento.attach(&tiemporpm, 2); //Ticker para el calculo de las rpm y otras cosas




    while (true) {

        if(mostrar) { //Cada 2 segundos se activa esto
            printf("RPM = %d \r\n",rpm); //Mostramos las rpm
            printf("temperatura: %d \r\n",f); //Mostramos la temperatura actual
            mostrar = 0; //Volvemos 0 la variable para no entrar hasta los siguientes 2 segundos
            t=ain; //Guardamos el valor del potenciometro
            printf("%f",t); //Mostramos el potenciometro
        }





        switch (caso) { //Maquina de estados de control general
            default:
            case 0:
                if(entad==1) { //Si el modo seleccionado es el lazo cerrado, entramos aca
                    fan=(0.00155*((f - 20)/50.0)) + 0.00053; //Definimos el pwm segun la temperatura
                    if(rpm==0) //Si el cooler esta frenado, vamos al estado 1
                        caso=1;






                } else {

                    fan=(0.00155*t)+0.00053; //Si estamos en el modo de lazo abierto, definimos el pwm segun el potenciometro
                    if(rpm==0) //Si el cooler se frena, vamos al estado 1
                        caso=1;



                }
                break;



            case 1:
                fan=0.002; //Definimos una velocidad alta para asegurarnos de que el cooler gire

                if(e==1) {

                    caso=0; //Luego de 2 segundos volvemos al estado 0
                    e=0;

                }
                break;
        }

        m=cooler;
        switch (estado) { //Maquina para detectar los pulsos del sensor hall

            case 0:
                if(m>0.9) { //Si se vuelve 1, aumentamos la variable cuentar y vamos al estado 1
                    cuentar++;
                    estado=1;

                }
                break;
            case 1:
                if(m<0.1) //En el momento que se vuelve 0 volvemos al estado 0
                    estado=0;
                break;


        }
        switch (tempp) { //Maquina de estados para el antirebote y la seleccion de modo
            case 0:
                if(enta==0) { //Cuando se detecta que se presiona el pulsador avanzamos al siguiente estado y empezamos a contar desde 0

                    tempp=1;
                    cuenta=0;
                }
                break;
            case 1:
                if(cuenta>=2) { //Unva vez que pasaron los 20ms de seguridad podemos considerar que el pulsador se presiono
                    tempp=2;
                    if(entad==0) //Ahora que verificamos que el boton se presiona solo 1 vez, cambiamos el modo actual
                        entad=1;
                    else
                        entad=0;


                }
                break;
            case 2:
                if(enta==1) { //Ahora repetimos el proceso al soltar el pulsador
                    tempp=3;
                    cuenta=0;
                }
                break;
            case 3:
                if(cuenta>=2) {
                    tempp=0;


                }
                break;
        }


    }




}




void funcion()
{

    cuenta++; //Cada 10ms se aumenta esta variable para el antirebote


}
void tiemporpm()
{

    e=1;
    sensor.read();
    f=sensor.getCelsius(); //Leemos el sensor
    rpm=cuentar*30; //Multiplicamos la cantidad de vueltas que medimos en 2segundos por 20, asi obtenemos la cantidad para 1 minuto
    cuentar=0; //Luego volvemos esta variable a 0 para poder contar las revoluciones otra vez
    mostrar=1;
}