Reader and sender of sensor data

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
henr22
Date:
Thu Mar 01 23:13:18 2018 +0000
Commit message:
sensorReader

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 869bf2db483c main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Mar 01 23:13:18 2018 +0000
@@ -0,0 +1,198 @@
+#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"
\ No newline at end of file
diff -r 000000000000 -r 869bf2db483c mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Mar 01 23:13:18 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9bcdf88f62b0
\ No newline at end of file