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"