Go Down

Topic: Convertir un string a float ? (Read 89 times) previous topic - next topic

cesar182

Nov 21, 2017, 05:35 pm Last Edit: Nov 21, 2017, 09:25 pm by surbyte
Saludos.
Quisiera que me ayudaran con un pequeño problema acerca la conversion de un String a un float. Les cuento que hace un par de dias vengo realizando un proyecto el cual consiste en un dispositivo capaz de monitorear la bateria y otras variables mas de un coche y esta pueda enviar toda esa informacion a un celular por bluetooth.
He tenido un buen avance respecto a al envio de datos, mi problema comienza cuando desde el celular necesito enviar ciertos parametros de inicio al dispositivo, como ser la hora y fecha actual, asi tambien el intervalo de muestre que se quiere realizar y por ultimo algunos parametros necesariamente decimales.
He logrado guardar toda esa informacion en un arreglo de caracteres, y partir del arreglo ir separando toda la informacion recibida. A la hora de separar los parametros decimales, decidi usar un arreglo de String de tal forma poder convertir cada elemento en un float a traves de la funcion String.toFloat(), pero lamentablemente solo me convierte la parte entera dejando en cero la parte decimal.(83.54 --> 83.00).Asi tambien he usado otras funciones como ser atof() pero me sigue dando el mismo resultado.

Aqui les dejo una parte del codigo donde realizo esa operacion.

Code: [Select]
#include <SPI.h>
#include <SD.h>
#include <SoftwareSerial.h>//Libreria para puerto puerto serial
#include <Time.h>//libreria para fecha y hora
#include <TimeLib.h>
SoftwareSerial hc06(7,8);//usamos pines RX=7||TX=8
#define A   5//pin para controlar el pin A del multiplexor 4052
#define B   6//pin para controlar el pin B del multiplexor 4052
#define CS  10//pin para seleccionar memoria SD
File dataFile;
int conf_inicial[55];//array para recibir configuracion inicial
int time_ref[6]={0,0,0,0,0,0};//tiempo de referencia
double variables[9]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};//array para guardar las variables de lectura
double var_aux[9]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};//array auxiliar para guardar variables de lectura
unsigned long actual,previo=0,periodo,act_t,prev_t,ref_milis;//guardan valores de temporizacion y periodo de muestreo
int periodo1=100,periodo2=1,periodo3=10,periodo4=100;//intervalos de muestreo
double voltMax=20,intMax=100,tempMax=100;//valores para establecer umbral de lectura
int i,punt=0,ref,aux;//variables auxiliares
String paramRecta[8];//almacena cadena de parametros A y B de la recta
float param_Recta[8];//almacena valores de parametros A y B de la recta
String data_tx="";
void setup() {
  Serial.begin(115200);//Inicializamos puerto Serial PC
  hc06.begin(57600);//Inicializamos puerto Serial Bluetooth
  pinMode(A,OUTPUT);//Habilitamos pin A como salida
  pinMode(B,OUTPUT);//Habilitamos pin B como salida
  pinMode(CS,OUTPUT);//Habilitamos pin CS como salida
  digitalWrite(A,LOW);//Ponemos pin A en LOW
  digitalWrite(B,LOW);//Ponemos pin B en LOW
  if(!SD.begin(CS)){//Verificamos si existe Tarjeta SD
    hc06.println("Fallo o tarjeta no presente");
    return;  
  }
  hc06.println("Tarjeta SD OK");
  delay(500);
  while(!hc06.available());//Esperamos por interrupcion serial por bluetooth
  while(hc06.available()>0){//Mientras haiga datos en el puerto serial realizamos la lectura
    conf_inicial[punt]=hc06.read();//almacenamos datos en array de configuracion inicial
    punt++;//saltamos a la siguiente posicion del array
    delay(10);//tiempo maximo para entre lecturas
  }
  punt=0;
  for(ref=0;ref<5;ref++){//separamos la hora y fecha de referencia
    for(i=1;i>=0;i--){
      time_ref[ref]+=(conf_inicial[punt]-48)*pow(10,i);
      punt++;
    }    
  }
  for(i=3;i>=0;i--){//separamos el año
    if(i==0){
      conf_inicial[punt]++;
    }
    time_ref[ref]+=(conf_inicial[punt]-48)*pow(10,i);
    punt++;
  }
  switch(conf_inicial[punt]-48){//verificamos el intervalo de muestreo
    case 0:
      periodo=(long)periodo1;
      break;
    case 1:
      periodo=(long)periodo2*1000;
      break;
    case 2:
      periodo=(long)periodo3*1000;
      break;
    case 3:
      periodo=(long)periodo4*1000;
      break;      
  }
  punt++;
  for(ref=0;ref<8;ref++){//separamos la cadena de parametros de la recta
    for(i=0;i<5;i++){
      if(conf_inicial[i]=='.'){
        paramRecta[ref]+=conf_inicial[punt];
        punt++;  
      }else{
        paramRecta[ref]+=(conf_inicial[punt]-48);
        punt++;
      }
    }    
  }
  for(ref=0;ref<8;ref++){
    param_Recta[ref]=paramRecta[ref].toFloat();
  }
  setTime(time_ref[0],time_ref[1],time_ref[2],time_ref[3],time_ref[4],time_ref[5]);//inicializamos hora y fecha de referencia
  hc06.print("El muestreo se realizara cada ");
  hc06.print(periodo);
  hc06.println(" ms y los parametros son:");
  for(ref=0;ref<8;ref=ref+2){
    hc06.print(param_Recta[ref]);
    hc06.print(" y ");
    hc06.println(param_Recta[ref+1]);    
  }
  ref=0;
}


Espero puedan ayudarme con este problema, y gracias de antemano

cesar182

#1
Nov 21, 2017, 09:08 pm Last Edit: Nov 21, 2017, 09:13 pm by cesar182
acabo de darme cuanta que el problema siempre fue que el arreglo de caracteres para guardar los datos recibidos del modulo bluetooth era de enteros. :o

surbyte

Entonces no tienes dudas? SI es asi dime y cierro el hilo.

cesar182

#3
Nov 21, 2017, 09:31 pm Last Edit: Nov 21, 2017, 10:10 pm by cesar182
Tengo dudas acerca la lectura de lineas de datos en una memoria SD. El dispositivo ademas de enviar la informacion por bluetooth, este guarda esa informacion en una memoria SD, de la siguiente manera:

11/20/2017;9:19:10;23;8.44;94.73;-15.22;-15.22;29.41;0.00;0.00;0.00;24.91
11/20/2017;9:19:20;135;8.41;94.73;-15.22;-15.22;31.62;0.00;0.00;0.00;24.91
11/20/2017;9:19:30;244;8.41;94.73;-15.22;-15.22;32.19;0.00;0.00;0.00;24.91
11/20/2017;9:19:40;353;8.40;94.73;-15.22;-15.22;29.95;0.00;0.00;0.00;24.91

Y hasta el momento no logro entender como es que funciona la lectura de una memoria SD. Alguien me poueda orientar como logro leer toda esta informacion linea a linea y enviarlo por el puerto USB.

Lucario448

Alguien me poueda orientar como logro leer toda esta informacion linea a linea y enviarlo por el puerto USB.
Code: [Select]
// Asumiendo que el archivo ha sido recién abierto para solo lectura
while (archivo.available()) Serial.write(archivo.read());
archivo.close();


Si el tamaño supera los 32 KB (32767 bytes), habrá que hacerlo diferente:
Code: [Select]
// Asumiendo que el archivo ha sido recién abierto para solo lectura
for (unsigned long i = archivo.size(); i; i--)
  Serial.write(archivo.read());
archivo.close();

cesar182

Muchas gracias Lucario448 lo pondre en practica

Go Up