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

Dependencies:   WiflyInterface mbed

Fork of wiflyServer by Gorka Bueno

Committer:
gbm
Date:
Fri Jul 01 08:45:38 2016 +0000
Revision:
3:5f49c89780fb
Parent:
2:d5b61d09976a
c?digo m?s claro

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gbm 2:d5b61d09976a 1 // el código de la aplicación Android está accesibl en https://github.com/gorkabueno/NeurGai
gbm 2:d5b61d09976a 2
gbm 1:a340ab744f01 3 //#define DEBUG
gbm 1:a340ab744f01 4 #include "mbed.h"
gbm 1:a340ab744f01 5 #include "WiflyInterface.h"
gbm 0:6d78e05ac19d 6
gbm 1:a340ab744f01 7 #if (defined(DEBUG))
gbm 1:a340ab744f01 8 #define DBG(x, ...) std::printf("[neurGAI : DBG]"x"\r\n", ##__VA_ARGS__);
gbm 1:a340ab744f01 9 #define WARN(x, ...) std::printf("[neurGAI : WARN]"x"\r\n", ##__VA_ARGS__);
gbm 1:a340ab744f01 10 #define ERR(x, ...) std::printf("[neurGAI : ERR]"x"\r\n", ##__VA_ARGS__);
gbm 1:a340ab744f01 11 #else
gbm 1:a340ab744f01 12 #define DBG(x, ...)
gbm 1:a340ab744f01 13 #define WARN(x, ...)
gbm 1:a340ab744f01 14 #define ERR(x, ...)
gbm 1:a340ab744f01 15 #endif
gbm 1:a340ab744f01 16
gbm 1:a340ab744f01 17 #define ECHO_SERVER_PORT 7
gbm 0:6d78e05ac19d 18
gbm 1:a340ab744f01 19 WiflyInterface wifly(D14, D15, D5, LED1, "NeurGai", "neurGai2016", WPA);
gbm 1:a340ab744f01 20
gbm 1:a340ab744f01 21 Ticker medidor;
gbm 1:a340ab744f01 22
gbm 1:a340ab744f01 23 AnalogIn sonda(A2); // la sonda amperimétrica debe conectarse entre los pines A2 y PTE30
gbm 1:a340ab744f01 24 AnalogOut salida_offset(PTE30);
gbm 0:6d78e05ac19d 25
gbm 1:a340ab744f01 26 int frecuencia_muestreo = 5000; // con 8000 Hz hace bien el muestreo, pero el volcado del debug no es completo
gbm 1:a340ab744f01 27 int numero_muestra = 0;
gbm 1:a340ab744f01 28 float valor_muestra;
gbm 1:a340ab744f01 29 float v_offset = 0;
gbm 1:a340ab744f01 30 float v_offset_medido = 0;
gbm 1:a340ab744f01 31 float potencia = 0;
gbm 1:a340ab744f01 32 float potencia_medida = 0;
gbm 1:a340ab744f01 33 float potencia_230V =0;
gbm 1:a340ab744f01 34 float corriente_medida = 0;
gbm 1:a340ab744f01 35 bool medido = false;
gbm 1:a340ab744f01 36 bool medido_y_enviado = false;
gbm 0:6d78e05ac19d 37
gbm 1:a340ab744f01 38 float pendiente = 201.206437;
gbm 1:a340ab744f01 39 float offset = 0;
gbm 1:a340ab744f01 40
gbm 1:a340ab744f01 41 int num_medida = 0;
gbm 1:a340ab744f01 42
gbm 1:a340ab744f01 43 TCPSocketServer server;
gbm 1:a340ab744f01 44 TCPSocketConnection client;
gbm 1:a340ab744f01 45
gbm 1:a340ab744f01 46 char buffer[256]; // string con los datos
gbm 1:a340ab744f01 47
gbm 1:a340ab744f01 48
gbm 1:a340ab744f01 49 void medir()
gbm 1:a340ab744f01 50 {
gbm 1:a340ab744f01 51 numero_muestra++;
gbm 1:a340ab744f01 52 valor_muestra = sonda.read();
gbm 1:a340ab744f01 53 v_offset = v_offset + valor_muestra;
gbm 1:a340ab744f01 54 potencia = potencia + pow((valor_muestra - v_offset_medido), 2);
gbm 1:a340ab744f01 55 if (numero_muestra == frecuencia_muestreo) // hemos llegado a un segundo
gbm 1:a340ab744f01 56 {
gbm 1:a340ab744f01 57 medidor.detach();
gbm 1:a340ab744f01 58 potencia_medida = potencia / frecuencia_muestreo;
gbm 1:a340ab744f01 59 corriente_medida = sqrt(potencia_medida);
gbm 1:a340ab744f01 60 v_offset_medido = v_offset / frecuencia_muestreo;
gbm 1:a340ab744f01 61 v_offset = 0;
gbm 1:a340ab744f01 62 potencia = 0;
gbm 1:a340ab744f01 63 numero_muestra = 0;
gbm 1:a340ab744f01 64 medido = true;
gbm 1:a340ab744f01 65 potencia_230V = (corriente_medida * pendiente + offset) * 230;
gbm 1:a340ab744f01 66 sprintf(buffer, "#%i&%f*\n", num_medida, potencia_230V);
gbm 1:a340ab744f01 67 DBG("%s %i", buffer, strlen(buffer));
gbm 1:a340ab744f01 68 int numDatosEnviados = client.send_all(buffer, strlen(buffer));
gbm 1:a340ab744f01 69 medido = false;
gbm 1:a340ab744f01 70 num_medida++;
gbm 1:a340ab744f01 71 medido_y_enviado = true;
gbm 1:a340ab744f01 72 DBG("datos enviados : %i", numDatosEnviados);
gbm 0:6d78e05ac19d 73 }
gbm 0:6d78e05ac19d 74 }
gbm 0:6d78e05ac19d 75
gbm 0:6d78e05ac19d 76 int main (void)
gbm 0:6d78e05ac19d 77 {
gbm 1:a340ab744f01 78 DBG("Empezando...");
gbm 0:6d78e05ac19d 79 wifly.init(); // use DHCP
gbm 0:6d78e05ac19d 80 while (!wifly.connect()); // join the network
gbm 1:a340ab744f01 81 DBG("\nLa direccion IP es %s", wifly.getIPAddress());
gbm 0:6d78e05ac19d 82
gbm 0:6d78e05ac19d 83 server.bind(ECHO_SERVER_PORT);
gbm 0:6d78e05ac19d 84 server.listen();
gbm 0:6d78e05ac19d 85
gbm 1:a340ab744f01 86 DBG("\nEsperando conexion...");
gbm 0:6d78e05ac19d 87 server.accept(client);
gbm 1:a340ab744f01 88 DBG("\nServidor aceptado...");
gbm 1:a340ab744f01 89 wait(1); //si no se le mete un pequeño retardo, se queda colgado. También vale con el DBG anterior
gbm 0:6d78e05ac19d 90
gbm 1:a340ab744f01 91 //configura el offset de voltaje a sumar a la sonda
gbm 1:a340ab744f01 92 salida_offset = 0.5;
gbm 1:a340ab744f01 93
gbm 0:6d78e05ac19d 94 while (true) {
gbm 1:a340ab744f01 95 DBG("Esperando dato...");
gbm 0:6d78e05ac19d 96 int n = client.receive(buffer, sizeof(buffer));
gbm 0:6d78e05ac19d 97 if (n <= 0) continue;
gbm 1:a340ab744f01 98 DBG("Recibido dato: %s Longitud %i", buffer, n);
gbm 0:6d78e05ac19d 99 buffer[n] = 0;
gbm 3:5f49c89780fb 100 if (strcmp(buffer, "Pot?\n") == 0) {
gbm 3:5f49c89780fb 101 // activa el muestreo
gbm 3:5f49c89780fb 102 medido_y_enviado = false;
gbm 3:5f49c89780fb 103 medidor.attach(&medir, 1.0/frecuencia_muestreo);
gbm 3:5f49c89780fb 104 }
gbm 1:a340ab744f01 105
gbm 1:a340ab744f01 106 // spin in a main loop. medidor will interrupt it to call medir
gbm 1:a340ab744f01 107 while (!medido_y_enviado)
gbm 1:a340ab744f01 108 wait(.1);
gbm 0:6d78e05ac19d 109 }
gbm 1:a340ab744f01 110 }