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