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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 // la App neurGAI y más información en: http://www.ehu.eus/ehusfera/neurgai/
00002 
00003 #include "mbed.h"
00004 #include "BluetoothSerial.h"        // en esta librería se ha modificado la clase Serial a SoftSerial para permitir 
00005                                     // la comunicación con Seeed Bluetooth Shield a través de SoftSerial sin utilizar una UART del micro
00006                                     
00007                                     //para habilitar conexión serie con linux, ejecutar:
00008                                     // sudo rfcomm bind /dev/rfcomm0 [MAC address] 1
00009                                     // sudo putty
00010 
00011 Ticker medidor;
00012 
00013 AnalogIn sonda(A2);                     // la sonda amperimétrica debe conectarse entre los pines A2 y PTE30
00014 AnalogOut salida_offset(PTE30);
00015 
00016 DigitalOut led1(LED1);
00017 DigitalOut led2(LED2);
00018 DigitalOut led3(LED3);
00019 
00020 BluetoothSerial serialBluetoothShield(D5, D4);       // TX, RX      Comunicación con Seeed-Bluetooth-Shield
00021 //Serial pc(USBTX, USBRX); // tx, rx
00022 
00023 int frecuencia_muestreo = 5000;
00024 int numero_muestra = 0;
00025 float valor_muestra;
00026 float v_offset = 0;
00027 float v_offset_medido = 0;
00028 float potencia = 0;
00029 float potencia_medida = 0;
00030 float potencia_230V =0;
00031 float corriente_medida = 0;
00032 bool medido = false;
00033 
00034 void medir()
00035 {
00036     numero_muestra++;
00037     valor_muestra = sonda.read();
00038     v_offset = v_offset + valor_muestra;
00039     potencia = potencia + pow((valor_muestra - v_offset_medido), 2);
00040     if (numero_muestra == frecuencia_muestreo)  // hemos llegado a un segundo
00041     {
00042         potencia_medida = potencia / frecuencia_muestreo;
00043         corriente_medida = sqrt(potencia_medida);
00044         v_offset_medido = v_offset / frecuencia_muestreo;
00045         v_offset = 0;
00046         potencia = 0;
00047         numero_muestra = 0;
00048         led3 = !led3;   // conmuta LED azul
00049         medido = true;
00050     }
00051 }
00052 
00053 void flushSerialBuffer()
00054 {
00055     char char1;
00056     while (serialBluetoothShield.readable()) {
00057         char1 = serialBluetoothShield.getc();
00058     }
00059     return;
00060 }
00061 
00062 int main() {
00063     //pc.printf("Apaga los leds\r\n");
00064     led1 = 1;   // led rojo apagado
00065     led2 = 1;   // led verde apagado
00066     led3 = 1;   // led azul apagado
00067     
00068     //configura el offset de voltaje a sumar a la sonda
00069     //pc.printf("Configura el offset de voltaje a sumar a la sonda\r\n");
00070     salida_offset = 0.5;
00071     float pendiente = 201.206437;
00072     float offset = 0;
00073     
00074     //apaga todos los LEDs
00075     led1 = 0;   // led rojo encendido
00076     led2 = 1;   // led verde apagado
00077     led3 = 1;   // led azul apagado
00078     
00079     //configura el Bluetooth Shield
00080     //pc.printf("Configura el Bluetooth Shield\r\n");
00081     serialBluetoothShield.setup();
00082     serialBluetoothShield.slave("neurGAI");  // default PIN code: 0000
00083     wait(2);
00084     
00085     led1 = 1;   // rojo apagado
00086     led3 = 0;   // azul encendido
00087     
00088     serialBluetoothShield.connect();
00089     wait(2);
00090     
00091     led3 = 1;   // azul apagado
00092     led2 = 0;   // verde encendido
00093     
00094     flushSerialBuffer();
00095     wait(2); // This delay is required.
00096     
00097     while (!serialBluetoothShield.writeable());  // espera a que se pueda escribir
00098     led2 = 1;   // apaga el led verde
00099     wait(1);
00100     
00101     // asigna la función medir al temporizador con intervalo 200 us
00102     //pc.printf("Asigna la funcion medir al temporizador con intervalo 200 us\r\n");
00103     medidor.attach(&medir, 1.0/frecuencia_muestreo);
00104  
00105     // spin in a main loop. medidor will interrupt it to call medir
00106     float t = 0;
00107     int tiempo = 0;
00108     while(1)
00109     {
00110         if (medido)
00111         {
00112             medidor.detach();
00113             potencia_230V = (corriente_medida * pendiente + offset) * 230;
00114             serialBluetoothShield.printf("#%i€%f*\r\n", tiempo, potencia_230V);
00115             //pc.puts("Dato enviado\r\n");
00116             medido = false;
00117             t = t + 1;
00118             tiempo++;
00119             medidor.attach(&medir, 1.0/frecuencia_muestreo);
00120         }
00121     }
00122 }