JustDoIT / Mbed 2 deprecated Ensaios_sensor

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 AnalogIn s1(p16);                //Entrada analógica do sensor
00004 
00005 Ticker flipper;                  // Endereço da função a executarperiodicamente
00006 
00007 DigitalOut led1(LED1);           // LED1 Indica que programa está a correr
00008 DigitalOut led2(LED2);           // LED2 Indica que estão a ser enviadas amostras
00009 DigitalOut led3(LED3);
00010 DigitalOut a(p19);               //Controlar entrada A do multiplexer
00011 DigitalOut b(p18);               //Controlar entrada B do multiplexer
00012 AnalogOut vref(p18);
00013 DigitalOut c(p17);               //Controlar entrada C do multiplexer
00014 DigitalOut pot1(p6);                //Chip select para potenciometro 1 R1 do divisor de tensão   
00015 DigitalOut pot2(p8);                //Chip select para potenciometro 2 R1 da ponte
00016 DigitalOut pot3(p29);               //Chip select para potenciometro 1 R2 da ponte
00017 DigitalOut pot4(p9);                //Chip select para potenciometro 4 Ganho do AmpOp
00018 
00019 Serial pc(USBTX,USBRX);          //Comunicação Serial
00020 
00021 SPI pot(p5,NC,p7);               //Comunicação SPI para potenciometros digitais
00022 
00023 int state = 0;                   //Utilizado na leitura das mensagens
00024 bool start = false;              //Dá ordem para iniciar ou não as medições   
00025 char incoming;
00026 int saida = 0;                   //Define que sensores irão ser lidos
00027 float resDiv = 0.0;
00028 
00029 //*************************************************
00030 //Coloca todos os sensores ativos uma vez por ciclo
00031 //*************************************************
00032 bool varrerSensores(){
00033         
00034     a = saida && 0b001;
00035     //b = saida && 0b010;
00036     c = saida && 0b100;
00037     
00038     if(saida < 0b111)
00039     {
00040         return true;
00041     }
00042     else
00043     {
00044         saida = 0;
00045         return false;
00046     }   
00047 }
00048 
00049 //*************************************
00050 //Calibração de ponte/divisor de tensão
00051 //*************************************
00052 void calib(int res){
00053     
00054     pot1 = 1;
00055     pot2 = 1;
00056     pot3 = 1;
00057     pot4 = 1;
00058     int msg = res/2;
00059     pot.lock();
00060     pot1 = 0;
00061     
00062     pot.write(msg);
00063     
00064     pot1 = 1;
00065     pot.unlock();
00066 }
00067 
00068 void mensagem(float amostra){
00069     int msg[] = {0xFF, saida++, 0, 0};
00070      msg[2] = (int) (amostra/256);                 //Define byte mais significativo
00071      msg[3] = amostra-msg[2]*256;                  //Define byte enos significativo
00072         
00073     for(int i = 0; i < 4; i++){                   //Envia mensagem completa
00074         pc.putc(msg[i]);
00075     }
00076 }
00077 
00078 //*************************************************************************************
00079 // Aquisição de dados
00080 //*************************************************************************************
00081 void flip()
00082 {  
00083   if(start){                        //Se o botao start foi pressionado     
00084     float amostra;
00085     while(varrerSensores()){
00086         led2 = 1;                       //Acende LED para dar sinal de inicio de amostragem      
00087         
00088         amostra = 0;                         //Onde são guardados os valores amostrados
00089         
00090         int msg[] = {0xFF, saida++, 0, 0};          //Mensagem a enviar saida++ aqui para o zero entrar também                   
00091         int n_amostras = 50;                        //N de amostras a fazer em cada medição para limpar o ruido
00092         int fatorMult = 1000;                       //Multiplicador para que se possa enviar apenas valores inteiros
00093         
00094         for(int i = 0; i < n_amostras; i++)         //Faz n_amostras medições para cada amostra enviada
00095         {          
00096             amostra += s1.read();
00097         }
00098         
00099         amostra = amostra*3.300*fatorMult/n_amostras; //Calcula o valor a enviar na mensagem 3.3 é a tensão máxima
00100         
00101         msg[2] = (int) (amostra/256);                 //Define byte mais significativo
00102         msg[3] = amostra-msg[2]*256;                  //Define byte enos significativo
00103         
00104     for(int i = 0; i < 4; i++){                   //Envia mensagem completa
00105         pc.putc(msg[i]);
00106     }
00107   
00108     led2 = 0;                                     //Acabou uma amostra desliga o led
00109   }
00110   }                                         
00111 }
00112 
00113 
00114 
00115 //*********************************************
00116 //Leitura de mensagens recebidas
00117 //*********************************************
00118 void pc2mbed() {
00119     
00120     if (pc.readable()) {
00121         incoming = pc.getc();    
00122         switch(state)
00123         {
00124             case(0):
00125                 if(incoming == 0xFF)    //Nova mensagem
00126                 {
00127                     state = 1;
00128                 }
00129             break;
00130             
00131             case(1):
00132                 if(incoming == 0x01)    //Mensagem de ordem de start/stop
00133                 {
00134                     state = 2;
00135                 }
00136                 else if(incoming == 0x02)//Mensagem de setup
00137                 {
00138                     state = 3;            
00139                 }
00140             break;
00141             
00142             case(2):
00143                 if(incoming == 0x00){
00144                     start = true;
00145                     }
00146                 else if(incoming == 0x01){
00147                     start = false;
00148                 }
00149                     state = 0; 
00150             break;
00151             
00152             case(3):
00153                 //resDiv = 0;
00154                 resDiv = incoming;
00155                 vref = resDiv/100;
00156                 //state = 4;
00157                 state = 0;
00158             break;
00159             
00160             case(4):
00161                 resDiv = resDiv || incoming;
00162                 calib(resDiv);
00163                 state = 0;
00164             break;
00165             
00166             default:
00167                 break;
00168         }          
00169     }
00170 }
00171 
00172 //*************************************************************************************
00173 // Rotina Principal
00174 //*************************************************************************************
00175 int main()
00176 {
00177 // Inicialização dos LED
00178     led1 = 0;                 // LED off
00179     led2 = 0;
00180     calib(20);
00181     vref = 0.5;
00182 // Rotina de aquisição de dados executada a cada 5x/segundo
00183     flipper.attach(&flip, 0.1);
00184     
00185 // Rotina de leitura de dados na porta serial    
00186     pc.attach(&pc2mbed, Serial::RxIrq);
00187 
00188 // Entra em espera com LED1 a piscar
00189     while(1)
00190     {    
00191       led1 = 1;
00192       wait(1);
00193       led1 = 0;
00194       wait(1);
00195     }
00196 }
00197 
00198   //FILE *fp = fopen("/local/out.txt", "a");             // Abreficheiro em modo "append"