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/

main.cpp

Committer:
gbm
Date:
2015-12-09
Revision:
1:9f267ca79300
Parent:
0:d01d10e9aca5
Child:
2:c5495669e122

File content as of revision 1:9f267ca79300:

#include "mbed.h"
#include "BluetoothSerial.h"        // en esta librería se ha modificado la clase Serial a SoftSerial para permitir 
                                    // la comunicación con Seeed Bluetooth Shield a través de SoftSerial sin utilizar una UART del micro
                                    
                                    //para habilitar conexión serie con linux, ejecutar:
                                    // sudo rfcomm bind /dev/rfcomm0 [MAC address] 1
                                    // sudo putty

Ticker medidor;

AnalogIn sonda(A2);                     // la sonda amperimétrica debe conectarse entre los pines A2 y PTE30
AnalogOut salida_offset(PTE30);

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);

BluetoothSerial serialBluetoothShield(D5, D4);       // TX, RX      Comunicación con Seeed-Bluetooth-Shield
//Serial pc(USBTX, USBRX); // tx, rx

int frecuencia_muestreo = 5000;
int numero_muestra = 0;
float valor_muestra;
float v_offset = 0;
float v_offset_medido = 0;
float potencia = 0;
float potencia_medida = 0;
float potencia_230V =0;
float corriente_medida = 0;
bool medido = false;

void medir()
{
    numero_muestra++;
    valor_muestra = sonda.read();
    v_offset = v_offset + valor_muestra;
    potencia = potencia + pow((valor_muestra - v_offset_medido), 2);
    if (numero_muestra == frecuencia_muestreo)  // hemos llegado a un segundo
    {
        potencia_medida = potencia / frecuencia_muestreo;
        corriente_medida = sqrt(potencia_medida);
        v_offset_medido = v_offset / frecuencia_muestreo;
        v_offset = 0;
        potencia = 0;
        numero_muestra = 0;
        led3 = !led3;   // conmuta LED azul
        medido = true;
    }
}

void flushSerialBuffer()
{
    char char1;
    while (serialBluetoothShield.readable()) {
        char1 = serialBluetoothShield.getc();
    }
    return;
}

int main() {
    //pc.printf("Apaga los leds\r\n");
    led1 = 1;   // led rojo apagado
    led2 = 1;   // led verde apagado
    led3 = 1;   // led azul apagado
    
    //configura el offset de voltaje a sumar a la sonda
    //pc.printf("Configura el offset de voltaje a sumar a la sonda\r\n");
    salida_offset = 0.5;
    float pendiente = 201.7635;
    float offset = 0;
    
    //apaga todos los LEDs
    led1 = 0;   // led rojo encendido
    led2 = 1;   // led verde apagado
    led3 = 1;   // led azul apagado
    
    //configura el Bluetooth Shield
    //pc.printf("Configura el Bluetooth Shield\r\n");
    serialBluetoothShield.setup();
    serialBluetoothShield.slave("neurGAI");  // default PIN code: 0000
    wait(2);
    
    led1 = 1;   // rojo apagado
    led3 = 0;   // azul encendido
    
    serialBluetoothShield.connect();
    wait(2);
    
    led3 = 1;   // azul apagado
    led2 = 0;   // verde encendido
    
    flushSerialBuffer();
    wait(2); // This delay is required.
    
    while (!serialBluetoothShield.writeable());  // espera a que se pueda escribir
    led2 = 1;   // apaga el led verde
    wait(1);
    
    // asigna la función medir al temporizador con intervalo 50 us
    //pc.printf("Asigna la funcion medir al temporizador con intervalo 50 us\r\n");
    medidor.attach(&medir, 1.0/frecuencia_muestreo);
 
    // spin in a main loop. medidor will interrupt it to call medir
    float t = 0;
    int tiempo = 0;
    while(1)
    {
        if (medido)
        {
            medidor.detach();
            potencia_230V = (corriente_medida * pendiente + offset) * 230;
            serialBluetoothShield.printf("#%i€%f*\r\n", tiempo, potencia_230V);
            //pc.puts("Dato enviado\r\n");
            medido = false;
            t = t + 1;
            tiempo++;
            medidor.attach(&medir, 1.0/frecuencia_muestreo);
        }
    }
}