Reader and sender of sensor data
Dependencies: mbed
main.cpp@0:869bf2db483c, 2018-03-01 (annotated)
- Committer:
- henr22
- Date:
- Thu Mar 01 23:13:18 2018 +0000
- Revision:
- 0:869bf2db483c
sensorReader
Who changed what in which revision?
User | Revision | Line number | New 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" |