Reader and sender of sensor data

Dependencies:   mbed

main.cpp

Committer:
henr22
Date:
2018-03-01
Revision:
0:869bf2db483c

File content as of revision 0:869bf2db483c:

#include "mbed.h"

AnalogIn s1(p16);                //Entrada analógica do sensor

Ticker flipper;                  // Endereço da função a executarperiodicamente

DigitalOut led1(LED1);           // LED1 Indica que programa está a correr
DigitalOut led2(LED2);           // LED2 Indica que estão a ser enviadas amostras
DigitalOut led3(LED3);
DigitalOut a(p19);               //Controlar entrada A do multiplexer
DigitalOut b(p18);               //Controlar entrada B do multiplexer
AnalogOut vref(p18);
DigitalOut c(p17);               //Controlar entrada C do multiplexer
DigitalOut pot1(p6);                //Chip select para potenciometro 1 R1 do divisor de tensão   
DigitalOut pot2(p8);                //Chip select para potenciometro 2 R1 da ponte
DigitalOut pot3(p29);               //Chip select para potenciometro 1 R2 da ponte
DigitalOut pot4(p9);                //Chip select para potenciometro 4 Ganho do AmpOp

Serial pc(USBTX,USBRX);          //Comunicação Serial

SPI pot(p5,NC,p7);               //Comunicação SPI para potenciometros digitais

int state = 0;                   //Utilizado na leitura das mensagens
bool start = false;              //Dá ordem para iniciar ou não as medições   
char incoming;
int saida = 0;                   //Define que sensores irão ser lidos
float resDiv = 0.0;

//*************************************************
//Coloca todos os sensores ativos uma vez por ciclo
//*************************************************
bool varrerSensores(){
        
    a = saida && 0b001;
    //b = saida && 0b010;
    c = saida && 0b100;
    
    if(saida < 0b111)
    {
        return true;
    }
    else
    {
        saida = 0;
        return false;
    }   
}

//*************************************
//Calibração de ponte/divisor de tensão
//*************************************
void calib(int res){
    
    pot1 = 1;
    pot2 = 1;
    pot3 = 1;
    pot4 = 1;
    int msg = res/2;
    pot.lock();
    pot1 = 0;
    
    pot.write(msg);
    
    pot1 = 1;
    pot.unlock();
}

void mensagem(float amostra){
    int msg[] = {0xFF, saida++, 0, 0};
     msg[2] = (int) (amostra/256);                 //Define byte mais significativo
     msg[3] = amostra-msg[2]*256;                  //Define byte enos significativo
        
    for(int i = 0; i < 4; i++){                   //Envia mensagem completa
        pc.putc(msg[i]);
    }
}

//*************************************************************************************
// Aquisição de dados
//*************************************************************************************
void flip()
{  
  if(start){                        //Se o botao start foi pressionado     
    float amostra;
    while(varrerSensores()){
        led2 = 1;                       //Acende LED para dar sinal de inicio de amostragem      
        
        amostra = 0;                         //Onde são guardados os valores amostrados
        
        int msg[] = {0xFF, saida++, 0, 0};          //Mensagem a enviar saida++ aqui para o zero entrar também                   
        int n_amostras = 50;                        //N de amostras a fazer em cada medição para limpar o ruido
        int fatorMult = 1000;                       //Multiplicador para que se possa enviar apenas valores inteiros
        
        for(int i = 0; i < n_amostras; i++)         //Faz n_amostras medições para cada amostra enviada
        {          
            amostra += s1.read();
        }
        
        amostra = amostra*3.300*fatorMult/n_amostras; //Calcula o valor a enviar na mensagem 3.3 é a tensão máxima
        
        msg[2] = (int) (amostra/256);                 //Define byte mais significativo
        msg[3] = amostra-msg[2]*256;                  //Define byte enos significativo
        
    for(int i = 0; i < 4; i++){                   //Envia mensagem completa
        pc.putc(msg[i]);
    }
  
    led2 = 0;                                     //Acabou uma amostra desliga o led
  }
  }                                         
}



//*********************************************
//Leitura de mensagens recebidas
//*********************************************
void pc2mbed() {
    
    if (pc.readable()) {
        incoming = pc.getc();    
        switch(state)
        {
            case(0):
                if(incoming == 0xFF)    //Nova mensagem
                {
                    state = 1;
                }
            break;
            
            case(1):
                if(incoming == 0x01)    //Mensagem de ordem de start/stop
                {
                    state = 2;
                }
                else if(incoming == 0x02)//Mensagem de setup
                {
                    state = 3;            
                }
            break;
            
            case(2):
                if(incoming == 0x00){
                    start = true;
                    }
                else if(incoming == 0x01){
                    start = false;
                }
                    state = 0; 
            break;
            
            case(3):
                //resDiv = 0;
                resDiv = incoming;
                vref = resDiv/100;
                //state = 4;
                state = 0;
            break;
            
            case(4):
                resDiv = resDiv || incoming;
                calib(resDiv);
                state = 0;
            break;
            
            default:
                break;
        }          
    }
}

//*************************************************************************************
// Rotina Principal
//*************************************************************************************
int main()
{
// Inicialização dos LED
    led1 = 0;                 // LED off
    led2 = 0;
    calib(20);
    vref = 0.5;
// Rotina de aquisição de dados executada a cada 5x/segundo
    flipper.attach(&flip, 0.1);
    
// Rotina de leitura de dados na porta serial    
    pc.attach(&pc2mbed, Serial::RxIrq);

// Entra em espera com LED1 a piscar
    while(1)
    {    
      led1 = 1;
      wait(1);
      led1 = 0;
      wait(1);
    }
}

  //FILE *fp = fopen("/local/out.txt", "a");             // Abreficheiro em modo "append"