Funcion para convertir un String en double o float

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

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?

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.

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.

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 :)

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.

// 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;
}

hola, estoy haciendo la calculadora con el keypad y necesito saber como es el diagrama. gracias por su ayuda

hola soy nuevo y novato es arduino pero miren amigos mi proyecto con arduino consta de una calculadora de dos digitos que sume y reste pero no he podido encontrarlo y ni realizarlo pero diganme podran ayudarme con el codigo porfavor solo puedo utilizar un teclado matricial de 4x3 la placa arduino el protoboard display lcd y es todo grasias de antemano

Pero si tienes un ejemplo justo arriba de tu post? Además esta hecho cientos de veces en Google. Busca y encontrarás. La idea del foro es ayudar cuando tienes problemas no hacer tu trabajo. Pero sin ánimo de defraudarte comienza con el ejemplo de alpis