Reader and sender of sensor data

Dependencies:   mbed

Committer:
henr22
Date:
Thu Mar 01 23:13:18 2018 +0000
Revision:
0:869bf2db483c
sensorReader

Who changed what in which revision?

UserRevisionLine numberNew contents of line
henr22 0:869bf2db483c 1 #include "mbed.h"
henr22 0:869bf2db483c 2
henr22 0:869bf2db483c 3 AnalogIn s1(p16); //Entrada analógica do sensor
henr22 0:869bf2db483c 4
henr22 0:869bf2db483c 5 Ticker flipper; // Endereço da função a executarperiodicamente
henr22 0:869bf2db483c 6
henr22 0:869bf2db483c 7 DigitalOut led1(LED1); // LED1 Indica que programa está a correr
henr22 0:869bf2db483c 8 DigitalOut led2(LED2); // LED2 Indica que estão a ser enviadas amostras
henr22 0:869bf2db483c 9 DigitalOut led3(LED3);
henr22 0:869bf2db483c 10 DigitalOut a(p19); //Controlar entrada A do multiplexer
henr22 0:869bf2db483c 11 DigitalOut b(p18); //Controlar entrada B do multiplexer
henr22 0:869bf2db483c 12 AnalogOut vref(p18);
henr22 0:869bf2db483c 13 DigitalOut c(p17); //Controlar entrada C do multiplexer
henr22 0:869bf2db483c 14 DigitalOut pot1(p6); //Chip select para potenciometro 1 R1 do divisor de tensão
henr22 0:869bf2db483c 15 DigitalOut pot2(p8); //Chip select para potenciometro 2 R1 da ponte
henr22 0:869bf2db483c 16 DigitalOut pot3(p29); //Chip select para potenciometro 1 R2 da ponte
henr22 0:869bf2db483c 17 DigitalOut pot4(p9); //Chip select para potenciometro 4 Ganho do AmpOp
henr22 0:869bf2db483c 18
henr22 0:869bf2db483c 19 Serial pc(USBTX,USBRX); //Comunicação Serial
henr22 0:869bf2db483c 20
henr22 0:869bf2db483c 21 SPI pot(p5,NC,p7); //Comunicação SPI para potenciometros digitais
henr22 0:869bf2db483c 22
henr22 0:869bf2db483c 23 int state = 0; //Utilizado na leitura das mensagens
henr22 0:869bf2db483c 24 bool start = false; //Dá ordem para iniciar ou não as medições
henr22 0:869bf2db483c 25 char incoming;
henr22 0:869bf2db483c 26 int saida = 0; //Define que sensores irão ser lidos
henr22 0:869bf2db483c 27 float resDiv = 0.0;
henr22 0:869bf2db483c 28
henr22 0:869bf2db483c 29 //*************************************************
henr22 0:869bf2db483c 30 //Coloca todos os sensores ativos uma vez por ciclo
henr22 0:869bf2db483c 31 //*************************************************
henr22 0:869bf2db483c 32 bool varrerSensores(){
henr22 0:869bf2db483c 33
henr22 0:869bf2db483c 34 a = saida && 0b001;
henr22 0:869bf2db483c 35 //b = saida && 0b010;
henr22 0:869bf2db483c 36 c = saida && 0b100;
henr22 0:869bf2db483c 37
henr22 0:869bf2db483c 38 if(saida < 0b111)
henr22 0:869bf2db483c 39 {
henr22 0:869bf2db483c 40 return true;
henr22 0:869bf2db483c 41 }
henr22 0:869bf2db483c 42 else
henr22 0:869bf2db483c 43 {
henr22 0:869bf2db483c 44 saida = 0;
henr22 0:869bf2db483c 45 return false;
henr22 0:869bf2db483c 46 }
henr22 0:869bf2db483c 47 }
henr22 0:869bf2db483c 48
henr22 0:869bf2db483c 49 //*************************************
henr22 0:869bf2db483c 50 //Calibração de ponte/divisor de tensão
henr22 0:869bf2db483c 51 //*************************************
henr22 0:869bf2db483c 52 void calib(int res){
henr22 0:869bf2db483c 53
henr22 0:869bf2db483c 54 pot1 = 1;
henr22 0:869bf2db483c 55 pot2 = 1;
henr22 0:869bf2db483c 56 pot3 = 1;
henr22 0:869bf2db483c 57 pot4 = 1;
henr22 0:869bf2db483c 58 int msg = res/2;
henr22 0:869bf2db483c 59 pot.lock();
henr22 0:869bf2db483c 60 pot1 = 0;
henr22 0:869bf2db483c 61
henr22 0:869bf2db483c 62 pot.write(msg);
henr22 0:869bf2db483c 63
henr22 0:869bf2db483c 64 pot1 = 1;
henr22 0:869bf2db483c 65 pot.unlock();
henr22 0:869bf2db483c 66 }
henr22 0:869bf2db483c 67
henr22 0:869bf2db483c 68 void mensagem(float amostra){
henr22 0:869bf2db483c 69 int msg[] = {0xFF, saida++, 0, 0};
henr22 0:869bf2db483c 70 msg[2] = (int) (amostra/256); //Define byte mais significativo
henr22 0:869bf2db483c 71 msg[3] = amostra-msg[2]*256; //Define byte enos significativo
henr22 0:869bf2db483c 72
henr22 0:869bf2db483c 73 for(int i = 0; i < 4; i++){ //Envia mensagem completa
henr22 0:869bf2db483c 74 pc.putc(msg[i]);
henr22 0:869bf2db483c 75 }
henr22 0:869bf2db483c 76 }
henr22 0:869bf2db483c 77
henr22 0:869bf2db483c 78 //*************************************************************************************
henr22 0:869bf2db483c 79 // Aquisição de dados
henr22 0:869bf2db483c 80 //*************************************************************************************
henr22 0:869bf2db483c 81 void flip()
henr22 0:869bf2db483c 82 {
henr22 0:869bf2db483c 83 if(start){ //Se o botao start foi pressionado
henr22 0:869bf2db483c 84 float amostra;
henr22 0:869bf2db483c 85 while(varrerSensores()){
henr22 0:869bf2db483c 86 led2 = 1; //Acende LED para dar sinal de inicio de amostragem
henr22 0:869bf2db483c 87
henr22 0:869bf2db483c 88 amostra = 0; //Onde são guardados os valores amostrados
henr22 0:869bf2db483c 89
henr22 0:869bf2db483c 90 int msg[] = {0xFF, saida++, 0, 0}; //Mensagem a enviar saida++ aqui para o zero entrar também
henr22 0:869bf2db483c 91 int n_amostras = 50; //N de amostras a fazer em cada medição para limpar o ruido
henr22 0:869bf2db483c 92 int fatorMult = 1000; //Multiplicador para que se possa enviar apenas valores inteiros
henr22 0:869bf2db483c 93
henr22 0:869bf2db483c 94 for(int i = 0; i < n_amostras; i++) //Faz n_amostras medições para cada amostra enviada
henr22 0:869bf2db483c 95 {
henr22 0:869bf2db483c 96 amostra += s1.read();
henr22 0:869bf2db483c 97 }
henr22 0:869bf2db483c 98
henr22 0:869bf2db483c 99 amostra = amostra*3.300*fatorMult/n_amostras; //Calcula o valor a enviar na mensagem 3.3 é a tensão máxima
henr22 0:869bf2db483c 100
henr22 0:869bf2db483c 101 msg[2] = (int) (amostra/256); //Define byte mais significativo
henr22 0:869bf2db483c 102 msg[3] = amostra-msg[2]*256; //Define byte enos significativo
henr22 0:869bf2db483c 103
henr22 0:869bf2db483c 104 for(int i = 0; i < 4; i++){ //Envia mensagem completa
henr22 0:869bf2db483c 105 pc.putc(msg[i]);
henr22 0:869bf2db483c 106 }
henr22 0:869bf2db483c 107
henr22 0:869bf2db483c 108 led2 = 0; //Acabou uma amostra desliga o led
henr22 0:869bf2db483c 109 }
henr22 0:869bf2db483c 110 }
henr22 0:869bf2db483c 111 }
henr22 0:869bf2db483c 112
henr22 0:869bf2db483c 113
henr22 0:869bf2db483c 114
henr22 0:869bf2db483c 115 //*********************************************
henr22 0:869bf2db483c 116 //Leitura de mensagens recebidas
henr22 0:869bf2db483c 117 //*********************************************
henr22 0:869bf2db483c 118 void pc2mbed() {
henr22 0:869bf2db483c 119
henr22 0:869bf2db483c 120 if (pc.readable()) {
henr22 0:869bf2db483c 121 incoming = pc.getc();
henr22 0:869bf2db483c 122 switch(state)
henr22 0:869bf2db483c 123 {
henr22 0:869bf2db483c 124 case(0):
henr22 0:869bf2db483c 125 if(incoming == 0xFF) //Nova mensagem
henr22 0:869bf2db483c 126 {
henr22 0:869bf2db483c 127 state = 1;
henr22 0:869bf2db483c 128 }
henr22 0:869bf2db483c 129 break;
henr22 0:869bf2db483c 130
henr22 0:869bf2db483c 131 case(1):
henr22 0:869bf2db483c 132 if(incoming == 0x01) //Mensagem de ordem de start/stop
henr22 0:869bf2db483c 133 {
henr22 0:869bf2db483c 134 state = 2;
henr22 0:869bf2db483c 135 }
henr22 0:869bf2db483c 136 else if(incoming == 0x02)//Mensagem de setup
henr22 0:869bf2db483c 137 {
henr22 0:869bf2db483c 138 state = 3;
henr22 0:869bf2db483c 139 }
henr22 0:869bf2db483c 140 break;
henr22 0:869bf2db483c 141
henr22 0:869bf2db483c 142 case(2):
henr22 0:869bf2db483c 143 if(incoming == 0x00){
henr22 0:869bf2db483c 144 start = true;
henr22 0:869bf2db483c 145 }
henr22 0:869bf2db483c 146 else if(incoming == 0x01){
henr22 0:869bf2db483c 147 start = false;
henr22 0:869bf2db483c 148 }
henr22 0:869bf2db483c 149 state = 0;
henr22 0:869bf2db483c 150 break;
henr22 0:869bf2db483c 151
henr22 0:869bf2db483c 152 case(3):
henr22 0:869bf2db483c 153 //resDiv = 0;
henr22 0:869bf2db483c 154 resDiv = incoming;
henr22 0:869bf2db483c 155 vref = resDiv/100;
henr22 0:869bf2db483c 156 //state = 4;
henr22 0:869bf2db483c 157 state = 0;
henr22 0:869bf2db483c 158 break;
henr22 0:869bf2db483c 159
henr22 0:869bf2db483c 160 case(4):
henr22 0:869bf2db483c 161 resDiv = resDiv || incoming;
henr22 0:869bf2db483c 162 calib(resDiv);
henr22 0:869bf2db483c 163 state = 0;
henr22 0:869bf2db483c 164 break;
henr22 0:869bf2db483c 165
henr22 0:869bf2db483c 166 default:
henr22 0:869bf2db483c 167 break;
henr22 0:869bf2db483c 168 }
henr22 0:869bf2db483c 169 }
henr22 0:869bf2db483c 170 }
henr22 0:869bf2db483c 171
henr22 0:869bf2db483c 172 //*************************************************************************************
henr22 0:869bf2db483c 173 // Rotina Principal
henr22 0:869bf2db483c 174 //*************************************************************************************
henr22 0:869bf2db483c 175 int main()
henr22 0:869bf2db483c 176 {
henr22 0:869bf2db483c 177 // Inicialização dos LED
henr22 0:869bf2db483c 178 led1 = 0; // LED off
henr22 0:869bf2db483c 179 led2 = 0;
henr22 0:869bf2db483c 180 calib(20);
henr22 0:869bf2db483c 181 vref = 0.5;
henr22 0:869bf2db483c 182 // Rotina de aquisição de dados executada a cada 5x/segundo
henr22 0:869bf2db483c 183 flipper.attach(&flip, 0.1);
henr22 0:869bf2db483c 184
henr22 0:869bf2db483c 185 // Rotina de leitura de dados na porta serial
henr22 0:869bf2db483c 186 pc.attach(&pc2mbed, Serial::RxIrq);
henr22 0:869bf2db483c 187
henr22 0:869bf2db483c 188 // Entra em espera com LED1 a piscar
henr22 0:869bf2db483c 189 while(1)
henr22 0:869bf2db483c 190 {
henr22 0:869bf2db483c 191 led1 = 1;
henr22 0:869bf2db483c 192 wait(1);
henr22 0:869bf2db483c 193 led1 = 0;
henr22 0:869bf2db483c 194 wait(1);
henr22 0:869bf2db483c 195 }
henr22 0:869bf2db483c 196 }
henr22 0:869bf2db483c 197
henr22 0:869bf2db483c 198 //FILE *fp = fopen("/local/out.txt", "a"); // Abreficheiro em modo "append"