machine learning mbed

Dependencies:   mbed

main.cpp

Committer:
asyrofi
Date:
2018-04-14
Revision:
0:b78c322e81d0

File content as of revision 0:b78c322e81d0:

#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");
        }
    }
}