módulo bluetooth para comunicación de KL25Z midiendo corriente a través de una sonda amperimétrica con Android App neurGAI

Dependencies:   BluetoothSoftSerial SoftSerial mbed

http://www.ehu.eus/ehusfera/neurgai/

Committer:
gbm
Date:
Fri Dec 18 13:05:23 2015 +0000
Revision:
3:0cefa49d6c8d
Parent:
2:c5495669e122
Nueva kalibraci?n coeficiente proporcionalidad

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gbm 2:c5495669e122 1 // la App neurGAI y más información en: http://www.ehu.eus/ehusfera/neurgai/
gbm 2:c5495669e122 2
gbm 0:d01d10e9aca5 3 #include "mbed.h"
gbm 0:d01d10e9aca5 4 #include "BluetoothSerial.h" // en esta librería se ha modificado la clase Serial a SoftSerial para permitir
gbm 0:d01d10e9aca5 5 // la comunicación con Seeed Bluetooth Shield a través de SoftSerial sin utilizar una UART del micro
gbm 0:d01d10e9aca5 6
gbm 0:d01d10e9aca5 7 //para habilitar conexión serie con linux, ejecutar:
gbm 0:d01d10e9aca5 8 // sudo rfcomm bind /dev/rfcomm0 [MAC address] 1
gbm 0:d01d10e9aca5 9 // sudo putty
gbm 0:d01d10e9aca5 10
gbm 0:d01d10e9aca5 11 Ticker medidor;
gbm 0:d01d10e9aca5 12
gbm 0:d01d10e9aca5 13 AnalogIn sonda(A2); // la sonda amperimétrica debe conectarse entre los pines A2 y PTE30
gbm 0:d01d10e9aca5 14 AnalogOut salida_offset(PTE30);
gbm 0:d01d10e9aca5 15
gbm 0:d01d10e9aca5 16 DigitalOut led1(LED1);
gbm 0:d01d10e9aca5 17 DigitalOut led2(LED2);
gbm 0:d01d10e9aca5 18 DigitalOut led3(LED3);
gbm 0:d01d10e9aca5 19
gbm 0:d01d10e9aca5 20 BluetoothSerial serialBluetoothShield(D5, D4); // TX, RX Comunicación con Seeed-Bluetooth-Shield
gbm 0:d01d10e9aca5 21 //Serial pc(USBTX, USBRX); // tx, rx
gbm 0:d01d10e9aca5 22
gbm 0:d01d10e9aca5 23 int frecuencia_muestreo = 5000;
gbm 0:d01d10e9aca5 24 int numero_muestra = 0;
gbm 0:d01d10e9aca5 25 float valor_muestra;
gbm 0:d01d10e9aca5 26 float v_offset = 0;
gbm 0:d01d10e9aca5 27 float v_offset_medido = 0;
gbm 0:d01d10e9aca5 28 float potencia = 0;
gbm 0:d01d10e9aca5 29 float potencia_medida = 0;
gbm 0:d01d10e9aca5 30 float potencia_230V =0;
gbm 0:d01d10e9aca5 31 float corriente_medida = 0;
gbm 0:d01d10e9aca5 32 bool medido = false;
gbm 0:d01d10e9aca5 33
gbm 0:d01d10e9aca5 34 void medir()
gbm 0:d01d10e9aca5 35 {
gbm 0:d01d10e9aca5 36 numero_muestra++;
gbm 0:d01d10e9aca5 37 valor_muestra = sonda.read();
gbm 0:d01d10e9aca5 38 v_offset = v_offset + valor_muestra;
gbm 0:d01d10e9aca5 39 potencia = potencia + pow((valor_muestra - v_offset_medido), 2);
gbm 0:d01d10e9aca5 40 if (numero_muestra == frecuencia_muestreo) // hemos llegado a un segundo
gbm 0:d01d10e9aca5 41 {
gbm 0:d01d10e9aca5 42 potencia_medida = potencia / frecuencia_muestreo;
gbm 0:d01d10e9aca5 43 corriente_medida = sqrt(potencia_medida);
gbm 0:d01d10e9aca5 44 v_offset_medido = v_offset / frecuencia_muestreo;
gbm 0:d01d10e9aca5 45 v_offset = 0;
gbm 0:d01d10e9aca5 46 potencia = 0;
gbm 0:d01d10e9aca5 47 numero_muestra = 0;
gbm 0:d01d10e9aca5 48 led3 = !led3; // conmuta LED azul
gbm 0:d01d10e9aca5 49 medido = true;
gbm 0:d01d10e9aca5 50 }
gbm 0:d01d10e9aca5 51 }
gbm 0:d01d10e9aca5 52
gbm 0:d01d10e9aca5 53 void flushSerialBuffer()
gbm 0:d01d10e9aca5 54 {
gbm 0:d01d10e9aca5 55 char char1;
gbm 0:d01d10e9aca5 56 while (serialBluetoothShield.readable()) {
gbm 0:d01d10e9aca5 57 char1 = serialBluetoothShield.getc();
gbm 0:d01d10e9aca5 58 }
gbm 0:d01d10e9aca5 59 return;
gbm 0:d01d10e9aca5 60 }
gbm 0:d01d10e9aca5 61
gbm 0:d01d10e9aca5 62 int main() {
gbm 0:d01d10e9aca5 63 //pc.printf("Apaga los leds\r\n");
gbm 0:d01d10e9aca5 64 led1 = 1; // led rojo apagado
gbm 0:d01d10e9aca5 65 led2 = 1; // led verde apagado
gbm 0:d01d10e9aca5 66 led3 = 1; // led azul apagado
gbm 0:d01d10e9aca5 67
gbm 0:d01d10e9aca5 68 //configura el offset de voltaje a sumar a la sonda
gbm 0:d01d10e9aca5 69 //pc.printf("Configura el offset de voltaje a sumar a la sonda\r\n");
gbm 0:d01d10e9aca5 70 salida_offset = 0.5;
gbm 3:0cefa49d6c8d 71 float pendiente = 201.206437;
gbm 0:d01d10e9aca5 72 float offset = 0;
gbm 0:d01d10e9aca5 73
gbm 0:d01d10e9aca5 74 //apaga todos los LEDs
gbm 0:d01d10e9aca5 75 led1 = 0; // led rojo encendido
gbm 0:d01d10e9aca5 76 led2 = 1; // led verde apagado
gbm 0:d01d10e9aca5 77 led3 = 1; // led azul apagado
gbm 0:d01d10e9aca5 78
gbm 0:d01d10e9aca5 79 //configura el Bluetooth Shield
gbm 0:d01d10e9aca5 80 //pc.printf("Configura el Bluetooth Shield\r\n");
gbm 0:d01d10e9aca5 81 serialBluetoothShield.setup();
gbm 0:d01d10e9aca5 82 serialBluetoothShield.slave("neurGAI"); // default PIN code: 0000
gbm 0:d01d10e9aca5 83 wait(2);
gbm 0:d01d10e9aca5 84
gbm 0:d01d10e9aca5 85 led1 = 1; // rojo apagado
gbm 0:d01d10e9aca5 86 led3 = 0; // azul encendido
gbm 0:d01d10e9aca5 87
gbm 0:d01d10e9aca5 88 serialBluetoothShield.connect();
gbm 0:d01d10e9aca5 89 wait(2);
gbm 0:d01d10e9aca5 90
gbm 0:d01d10e9aca5 91 led3 = 1; // azul apagado
gbm 0:d01d10e9aca5 92 led2 = 0; // verde encendido
gbm 0:d01d10e9aca5 93
gbm 0:d01d10e9aca5 94 flushSerialBuffer();
gbm 0:d01d10e9aca5 95 wait(2); // This delay is required.
gbm 0:d01d10e9aca5 96
gbm 0:d01d10e9aca5 97 while (!serialBluetoothShield.writeable()); // espera a que se pueda escribir
gbm 0:d01d10e9aca5 98 led2 = 1; // apaga el led verde
gbm 0:d01d10e9aca5 99 wait(1);
gbm 0:d01d10e9aca5 100
gbm 3:0cefa49d6c8d 101 // asigna la función medir al temporizador con intervalo 200 us
gbm 3:0cefa49d6c8d 102 //pc.printf("Asigna la funcion medir al temporizador con intervalo 200 us\r\n");
gbm 0:d01d10e9aca5 103 medidor.attach(&medir, 1.0/frecuencia_muestreo);
gbm 0:d01d10e9aca5 104
gbm 0:d01d10e9aca5 105 // spin in a main loop. medidor will interrupt it to call medir
gbm 0:d01d10e9aca5 106 float t = 0;
gbm 0:d01d10e9aca5 107 int tiempo = 0;
gbm 0:d01d10e9aca5 108 while(1)
gbm 0:d01d10e9aca5 109 {
gbm 0:d01d10e9aca5 110 if (medido)
gbm 0:d01d10e9aca5 111 {
gbm 0:d01d10e9aca5 112 medidor.detach();
gbm 0:d01d10e9aca5 113 potencia_230V = (corriente_medida * pendiente + offset) * 230;
gbm 0:d01d10e9aca5 114 serialBluetoothShield.printf("#%i€%f*\r\n", tiempo, potencia_230V);
gbm 0:d01d10e9aca5 115 //pc.puts("Dato enviado\r\n");
gbm 0:d01d10e9aca5 116 medido = false;
gbm 0:d01d10e9aca5 117 t = t + 1;
gbm 0:d01d10e9aca5 118 tiempo++;
gbm 0:d01d10e9aca5 119 medidor.attach(&medir, 1.0/frecuencia_muestreo);
gbm 0:d01d10e9aca5 120 }
gbm 0:d01d10e9aca5 121 }
gbm 0:d01d10e9aca5 122 }