Pages: [1]   Go Down
Author Topic: Funcion para convertir un String en double o float  (Read 1265 times)
0 Members and 2 Guests are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos , estoy empezando con el arduino, intnetando hacer una calculadora,
En principio funciona bastante bien, pero hay una cosa que no consigo hacer.
Como puedo pasar una variable String (introcucida a traves de un tecaldo) a una variable double o float.
Solo he encontrado la funcion: variable.toInt() pero esta funcion me convierte el string en una  variable int
y si quiero hacer la operacion 2,3/3 el resultado es 0.67 como si fuese 2/3, ya que el decimal y todo lo que viene a continuacion no lo tiene en cuenta

A continuacion os pongo el progrmama ( esta aun en proceso de depurado, y con algun otro bug ), la idea será que al final  todo se visualice en u display, a parte de introducir mas funciones


#include <Keypad.h>
/// #include <LiquidCrystal.h>

//inicializacion del lcd
//LiquidCrystal lcd(12,11,5,4,3,2);

// Inicializacion teclado
const byte Columnas = 4;
const byte Filas = 4;
byte Pines_Filas[Filas] = {13,12,11,10};
byte Pines_Columnas[Columnas] = {9,8,7,6};
// Mapa teclado
char mapa [Filas][Columnas] = {
  {'7','8','9','/'},
  {'4','5','6','X'},
  {'1','2','3','-'},
  {'.','0','=','+'}
};
int i=0;
String operador="";
String operador1="";
String operador2="";
char operacion;
char tecla;
double resultado;
// Creamos el objeto tecla
Keypad teclado =Keypad (makeKeymap(mapa),Pines_Filas,Pines_Columnas,Filas,Columnas);



// inicializacion
void setup()

  Serial.begin(9600);
}


//inicio del programa

void loop()
{
  int i =0;
  do
  {
    tecla = teclado.getKey();
    switch(tecla)
    {
      case ('.'):
        operador +='.';
        break;
       
      case ('+'):
        Serial.print(" + ");
        intercambio();
        operacion='+';   
        i=0;
        break;
       
       case ('-'):
        Serial.print(" - ");
        intercambio();
        operacion='-';   
        i=0;
        break;
       
      case ('X'):
        Serial.print(" X ");
        intercambio();
        operacion='X';
        break;
       
      case ('/'):
        Serial.print(" / ");
        intercambio();
        operacion='/';
        break;
       
      case ('='):
          Serial.print (" = ");
          switch(operacion)
          {
            case ('+'):
            resultado = double(operador1.toInt()) + double(operador.toInt());
            break;
           
            case ('-'):
            resultado = double(operador1.toInt()) - double(operador.toInt());
            break;
           
            case('X'):
            resultado = double(operador1.toInt()) * double(operador.toInt());
            break;
           
            case('/'):
            resultado = double(operador1.toInt()) / double(operador.toInt());
            break;
           
          }
          operador="";
          operador1="";
          Serial.print(resultado);
        break;
     
      case ('c'):
           break;
         
      case (NO_KEY):
           break;
           
      default:
        operador += tecla;
        break;
       
       
    }
    Serial.print(tecla);
  }while(tecla |='f');
 
 
 
}

void intercambio()
{
    tecla=NO_KEY;
    operador1=operador;
    operador="";
}

Gracias de antemano
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aqui os dejo el programa mas depurado.. pero sigo sin encontrar una funcion que me haga la conversion
he intentado  con resultado = atol(operador1)  ( +-X / )  atol(operador) pero me da error:


// librerias que vamos a utilizar

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <stdlib.h>
//inicializacion del lcd
LiquidCrystal lcd(12,11,5,4,3,2);

// Inicializacion teclado
const byte Columnas = 4;
const byte Filas = 4;
byte Pines_Filas[Filas] = {13,12,11,10};
byte Pines_Columnas[Columnas] = {9,8,7,6};
// Mapa teclado
char mapa [Filas][Columnas] = {
  {'7','8','9','/'},
  {'4','5','6','X'},
  {'1','2','3','-'},
  {'.','0','=','+'}
};
int i=0;
String operador="";
String operador1="";
String operador2="";
char operacion;
char tecla;
long numero1;
long resultado;
// Creamos el objeto tecla
Keypad teclado =Keypad (makeKeymap(mapa),Pines_Filas,Pines_Columnas,Filas,Columnas);



// inicializacion
void setup()

  Serial.begin(9600);
}


//inicio del programa

void loop()
{
  int i =0;
  do
  {
    tecla = teclado.getKey();
    switch(tecla)
    {
      case ('.'):
        operador +='.';
        break;
       
      case ('+'):
        Serial.print(" + ");
        intercambio();
        operacion='+';   
        i=0;
        break;
       
       case ('-'):
        Serial.print(" - ");
        intercambio();
        operacion='-';   
        i=0;
        break;
       
      case ('X'):
        Serial.print(" X ");
        intercambio();
        operacion='X';
        break;
       
      case ('/'):
        Serial.print(" / ");
        intercambio();
        operacion='/';
        break;
       
      case ('='):
          Serial.print (" = ");
         tecla = NO_KEY;
         
          switch(operacion)
          { 
            case ('+'):
            resultado = operador1.toInt() + operador.toInt();
            break;
           
            case ('-'):
            resultado = operador1.toInt() - operador.toInt();
            break;
           
            case('X'):
            resultado = operador1.toInt() * operador.toInt();
            break;
           
            case('/'):
            resultado = operador1.toInt() / operador.toInt();
            break; 
          }
         
          operador="";
          operador1="";
          Serial.print(resultado);
          Serial.print("\n\r");
       
        break;
     
      case ('c'):
           break;
         
      case (NO_KEY):
           break;
           
      default:
        operador += tecla;
        break;
       
       
    }
    Serial.print(tecla);
  }while(tecla |='f');
 
 
 
}

void intercambio()
{
    tecla=NO_KEY;
    operador1=operador;
    operador="";
}

Alguna idea?
Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 710
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,
en otro post hay una función que tal vez te sirva:

http://arduino.cc/forum/index.php/topic,144657.0.html

Lo que hace es convertir el String a una cadena char, y utilizar la función atof()

Por lo visto, la clase String no tiene esa posibilidad de conversión. Además hay bastantes detractores de la clase String en el entorno Arduino, porque la memoria es muy limitada. Yo siempre uso cadenas char, porque se controla mejor la memoria que se usa.

Code:

float convertStringtoFloat(String Texto)
{
   char cadena[Texto.length()+1];
   Texto.toCharArray(cadena, Texto.length()+1);
   float myFloat = atof(cadena);
   return myFloat;
}

Lo he probado y parece que funciona.
« Last Edit: February 10, 2013, 02:51:31 pm by curro92 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchisimas gracias!!! , Googleando por Internet encontre informacion bastante confusa, algunas paginas comentaban que se podia utilizar atof directamente y otros que no estaba implemantada la funcion.
Sobre detractores y segidores, depende mucho del mundo del que vengas, y que es lo que busques, pero creo que sin estas en el inicio (aunque tengas bases en la programacion), mejor empezar programando el codigo estructurado y ordenado,  y mas tarde segun, cojas experiencia ir optimizandolo.

Cuando acabe el programilla lo cuelgo por aqui (quiero implementarle unas cuantas funciones mas), para que  los que empezamos en este mundillo lo puedan utilizar como ejemplo

Gracias otra vez
 smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno ya he acabado parte del proyecto de iniciacion
Basicamente es hacer una calculadora con arduino, de momento solo hace operaciones básicas, pues el teclado que tengo es Hexadecimal, pero para ir empezando no esta mal. Gracias Curro por tu ayuda...
Aqui os dejo el programa para quien quiera utilizarlo, y agradeceria cualquier onsejo para optimizarlo.


Quote
// librerias que vamos a utilizar

#include <Keypad.h>
#include <LiquidCrystal.h>

//inicializacion del lcd
LiquidCrystal lcd(5,4,3,2,1,0);

// Inicializacion teclado
const byte Columnas = 4;
const byte Filas = 4;
byte Pines_Filas[Filas] = {13,12,11,10};
byte Pines_Columnas[Columnas] = {9,8,7,6};
// Mapa teclado
char mapa [Filas][Columnas] = {
  {'+','-','X','/'},
  {'=','9','6','3'},
  {'0','8','5','2'},
  {'.','7','4','1'}
};
int i=0;
String operador="";
String operador1="";
String operador2="";

char operacion;
char tecla;
float numero1;
double memoria;
double resultado;
// Creamos el objeto tecla
Keypad teclado =Keypad (makeKeymap(mapa),Pines_Filas,Pines_Columnas,Filas,Columnas);



// inicializacion
void setup()

  //Serial.begin(9600);
  lcd.begin(20,4);
}


//inicio del programa

void loop()
{
  lcd.setCursor(1,1);      //Presentacion de la calculadora
  lcd.print("Caculadora by Paco");
  delay(3000);
  lcd.clear();       // Pasado 3 seg, se limpia la calculadora
   
  int i =0;
  lcd.setCursor(1,1);
  do
  {
    tecla = teclado.getKey(); //escaneamos tecla
    switch(tecla)        //construimos los operadores o la operacion segun el caso         
    {
      case ('.'):
        lcd.print(".");
        operador +='.';
        break;
       
      case ('+'):
        lcd.print(" + ");
        intercambio();
        operacion='+';   
        i=0;
        break;
       
       case ('-'):
        lcd.print(" - ");
        intercambio();
        operacion='-';   
        i=0;
        break;
       
      case ('X'):
        lcd.print(" X ");
        intercambio();
        operacion='X';
        break;
       
      case ('/'):
        lcd.print(" / ");
        intercambio();
        operacion='/';
        break;
       
      case ('='):
         lcd.print (" = ");
         tecla = NO_KEY;
         
          switch(operacion) //segundo bucle case esta vez es para realizar la operacion
          { 
            case ('+'):
           
            //numero1 = atof(operador1);
            resultado = StrToDouble(operador1) + StrToDouble(operador);
            break;
           
            case ('-'):
            resultado = StrToDouble(operador1) - StrToDouble(operador);
            break;
           
            case('X'):
            resultado = StrToDouble(operador1) * StrToDouble(operador);
            break;
           
            case('/'):
            resultado = StrToDouble(operador1) / StrToDouble(operador);
            break; 
          }
         
          operador="";
          operador1="";
          lcd.setCursor(1,3);
          lcd.print(resultado,6);
          do
          {
            tecla=teclado.getKey();
          }while (tecla==NO_KEY);
         
          lcd.clear();
          lcd.begin(1,1);
        break;
         
      case (NO_KEY): //Si la tecla no ha sido pulsada salimos
           break;
           
      default:
       
        lcd.print(tecla);
        operador += tecla;
        break;
       
       
    }
   
  }while(tecla |='f');
  //Bucle sin fin
 
 
}

void intercambio()
{
    tecla=NO_KEY;
    operador1=operador;
    operador="";
}


double StrToDouble(String Texto)
{
   char cadena[Texto.length()+1];
   Texto.toCharArray(cadena, Texto.length()+1);
   double myFloat = atof(cadena);
   return myFloat;
}
Logged

Pages: [1]   Go Up
Jump to: