Hugo's Programs / Mbed 2 deprecated MARCELO_PROJETC_VIDRO_TIMER

Dependencies:   mbed

main.cpp

Committer:
hugocampos
Date:
2021-02-13
Revision:
5:3148a88c41a2
Parent:
4:2aa867a57a02

File content as of revision 5:3148a88c41a2:

/* 
  *Autor: Marcelo Costanzo
  *Obejtivo: Controla uma maquina de vidro 
  *Status: Funcionando
  *Data: 2019
*/

#include "mbed.h"

#define filtro 10  

// Usar a nucleo 302 ou 103
//-----------Pinos de saida (output)---------------
DigitalOut  controlLED(LED2); 
DigitalOut  IN1A(D10);
DigitalOut  IN2A(D8);
DigitalOut  EN_A(D9);

//----------Pinos de entrada analogica (ADC)------
AnalogIn    SHUNT(A5);

//----------Pinos de interrupção externa----------
InterruptIn UP(D7);
InterruptIn DOWN(D2);

//---------Declaração de timers-------------------
Timer timer;

//---------Declaração de comunicação serial-------
Serial pc(USBTX, USBRX);

//---------Declaração de variaveis----------------
bool flag = 0;
float CURRENT[filtro];
float media = 0;
int i = 0;

//---------Rotina para dar inicio ao processo de debounce-------------
void bounce()
{
    timer.start();
}

//---------Rotina para dar fim ao processo de debounce----------------
void stop_timer()
{
    timer.stop();
    timer.reset();
}

//-------Rotina para setar os pinos na direção de fechar o vidro-------
void close()
{
    IN1A = 0;
    IN2A = 1;
    EN_A = 1;
}

//-------Rotina para setar os pinos na direção de abrir o vidro--------
void open()
{
    IN1A = 1;
    IN2A = 0;
    EN_A = 1;
}

//-------Rotina para setar os pinos para parar o vidro--------
void stop()
{
    IN1A = 0;
    IN2A = 0;
    EN_A = 0;
}

int main() 
{
    //----Especificando as bordas das interrupções, e o endereço das rotinas que serão chamadas---
    UP.fall(&bounce); 
    DOWN.fall(&bounce); 
    UP.rise(&stop_timer); 
    DOWN.rise(&stop_timer); 
    
    //------------debug para saber se o uC iniciou/travou-------------
    pc.printf("\n\riniciando");
    controlLED = 1;
    wait(0.5);
    controlLED = 0;
    stop();
    
    while(1) 
    {
        //-----bloqueio da variavel i, para que não tenha mais de 10 iterações----
        if(i > filtro - 1)
        {
            i = 0;
        }
        
        //----Leitura da corrente e amarzenamento do valor no buffer--------------
        CURRENT[i] = SHUNT.read();
        i++;
        
        //----Integração dos valores de corrente, para fazer filtro do tipo "media movel"
        for(int j=0; j<filtro; j++)
        {
            media += CURRENT[j];
        }
        
        //------Calculando a media-----------------------------------------------
        media = media / filtro;
        
        //------Conversão do valor para a unidade de ampere--------------------
        media = media * 3.0f;
        
        //------Multiplicador do valor por conta do shunt de 0R1--------------------
        //media = media * 10;

        //-----Condição que tenha apertado o botão rapidamente----------------
        //clique rapido, para subir/descer o vidro por uma curta distancia
        if((timer.read() > 0.1f) && (timer.read() < 0.6f))
        {
                if(DOWN == 0)
                {
                    pc.printf("\n\rdown rapido");
                    open();
                    wait(0.6f);
                    if(DOWN == 1)//se soltou o botão, comanda a parada
                    {
                        stop();
                    }
                    
                }
                
                if(UP == 0)
                {
                    pc.printf("\n\rup rapido");
                    close();
                    wait(0.6f);
                    if(UP == 1)//se soltou o botão, comanda a parada
                    {
                        stop();
                    }
                    
                }
        }
        
        //-----Condição que tenha apertado o botão por mais de um segundo----------------
        //clique lento, para subir/descer o vidro por todo o trajeto
        if(timer.read() > 1.0f)
        {
                if(DOWN == 0)
                {
                    pc.printf("\n\rdown lento");
                    open();
                }
                
                if(UP == 0)
                {
                    pc.printf("\n\rup lento");
                    close();
                }
        }
        //wait(0.1);
        //pc.printf("\n\rCorrente de %f Amperes", media);
        //----Rotina para parar o vidro caso a corrente suba, é a rotina que será fim-de-curso e sistema anti-esmagamento------
        if(media > 1.0f)
        {  
            wait(0.3);
            if(media > 1.0f)
            {              
                stop();
                pc.printf("\n\rCORTE");
            }
        }        
    }
}