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@3:0cefa49d6c8d, 2015-12-18 (annotated)
- 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?
User | Revision | Line number | New 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 | } |