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
main.cpp@3:5f49c89780fb, 2016-07-01 (annotated)
- 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?
User | Revision | Line number | New 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 | } |