rakha asyrofi
/
KNN_coba
machine learning mbed
Diff: main.cpp
- Revision:
- 0:b78c322e81d0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Apr 14 04:02:05 2018 +0000 @@ -0,0 +1,108 @@ +#include "mbed.h" +#include "dataset.h" +#include "funcionesKNN.h" +#include <string> +Serial pc(USBTX, USBRX); +#define FI 100 // filas de la base de datos +#define CO 4 // numero de caracteristicas + +// variables +/*char* clasesSt[3]; // strings con las clases +char* nomAtr[CO]; // strings con los nombres de atributos +double atributos[FI][CO]; // atributos +int clasesNo[FI]; // clases +*/ +double dato[CO]; // dato a clasificar +long actual = 0, previo = 0; + +//----------------------------------------------------------------------- +// Extrae caracteres dados los identificadores y los convierte a double +//----------------------------------------------------------------------- +void extraeDatos(string str, double dato[], char dlm[]){ + + string auxstr = ""; + int posdlm[5], tamstr = 0; + int i= 0, j = 0; + + // buscar caracteres de identificacion + posdlm[0] = str.indexOf(dlm[0]); // ( + posdlm[1] = str.indexOf(dlm[1]); // , + posdlm[2] = str.indexOf(dlm[1], posdlm[1] + 1); // , + posdlm[3] = str.indexOf(dlm[1], posdlm[2] + 1); // , + posdlm[4] = str.indexOf(dlm[2]); // ) + + for(j=0; j<CO; j++){ + // extraer datos numericos + for(i=posdlm[j]+1; i<posdlm[j+1]; i++){ + auxstr = auxstr + str[i]; + } + + //convertir a double + int y = auxstr.length(); + char buf[y+1]; + auxstr.toCharArray(buf, y+1); + dato[j] = atof(buf); + + //Serial.println(dato[j],3); + auxstr=""; // reset del auxiliar + } +} + +//----------------------------------------------------------------------- +// Impresion de confirmacion +//----------------------------------------------------------------------- +void imprime(double dato[], int clase){ + + pc.printf("-----------------------------------------------\n"); + pc.printf("%i",(int16_t)nomAtr[0]); pc.printf(": "); pc.printf("%i",(int16_t)dato[0],3); pc.printf(" cms\n"); + pc.printf("%i",(int16_t)nomAtr[1]); pc.printf(": "); pc.printf("%i",(int16_t)dato[1],3); pc.printf(" cms\n"); + pc.printf("%i",(int16_t)nomAtr[2]); pc.printf(": "); pc.printf("%i",(int16_t)dato[2],3); pc.printf(" cms\n"); + pc.printf("%i",(int16_t)nomAtr[3]); pc.printf(": "); pc.printf("%i",(int16_t)dato[3],3); pc.printf(" cms\b"); + pc.printf(" >> Clase: "); pc.printf("%i\n",(int16_t)clasesSt[clase]); +} + +//----------------------------------------------------------------------- +// Configuracion del microcontrolador +//----------------------------------------------------------------------- +int main() +{ + pc.baud(9600); + //Serial.begin(9600); + wait(0.1); + pc.printf("===============================================\n"); + pc.printf("=== KKN Classification ===\n"); + pc.printf("===============================================\n"); + wait(0.05); + + //----------------------------------------------------------------------- +// Programa principal +//----------------------------------------------------------------------- + while(1) + { + + // recibir los datos a clasificar + if(Serial.available()) + { + + // recibir una cadena hasta que se tenga el '\n' + string str = Serial.readStringUntil('\n'); + extraeDatos(str, dato, "{,}"); + + // tic + previo = millis(); + + // encontrar la clase, con 5 vecinos cercanos + int cl = clasificaKNN((double**)atributos, clasesNo, dato, 11, FI, CO); + pc.printf("%i\n",(int16_t)cl); + + // tac + actual = millis(); + + // imprimir + imprime(dato, cl); + pc.printf("Tiempo: "); pc.printf("%i\n",(int16_t)actual-previo); pc.printf(" mS\n"); + } + } +} + +