Recientemente, haciendo un sketch para un proyecto, me dí cuenta de una pequeña dificultad a la hora de hacer conversión de números a cadenas en Arduino. Existen varias soluciones y en este artículo vamos a ver algunas de ellas.
Indice de contenidos
Conversión de números a cadenas con print()
Una de las primeras soluciones fue esta.
void setup() {
Serial.begin(9600);
}
void loop() {
double temp=27.32;
Serial.print("Temperatura ");
Serial.println(temp);
delay(10000);
}Es decir, llamar una vez a print para la cadena de texto y posteriormente llamar otra vez a la función println con el número (el uso de esta última es para que me pusiera un salto de linea). Esta solución no me gustó dado que se llama múltiples veces a a función print o println.
Además, si en la misma línea tuviéramos varios valores, la complejidad del código y el número de lineas aumenta de manera casi exponencial. No tenemos que perder nunca de vista que en los microcontroladores tenemos una memoria bastante limitada.
Utilizando sprintf para convertir números a cadenas
Buscando por Internet encontré la función sprintf,la cual describo a continuación.
sprintf(char* buffer, char* CadenaFormato, object Valor);
/* | | \_ Lista de valores que se van a convertir en cadena
| \_ cadena con la máscara de los valores a convertir
\_ Buffer donde devolveremos el resultado de los valores convertidos */Para ver un listado de máscaras que podemos usar seguir el siguiente enlace. (Hay que pensar, que la función sprintf es una adaptación para Arduino y algunas máscaras no funcionan correctamente, como veremos en las siguientes lineas)
Pues me puse a probar, primero con números enteros con el siguiente código
int i=0;
void setup() {
Serial.begin(9600); //Iniciamos la salida serie
Serial.println("Iniciando ejemplo");
}
void loop() {
char buffer[10]=" ";
char* formato="Bucle %i";
sprintf(buffer, formato, i);
i++;
Serial.println(buffer);
delay(1000);
}Funciona, la salida que obtuve en el monitor serie fue la siguiente:
Lo siguiente fue probar con números en coma flotante, así que modifique el código para que quedará de esta forma.
float i=0;
void setup() {
Serial.begin(9600); //Iniciamos la salida serie
Serial.println("Iniciando ejemplo");
}
void loop() {
char buffer[20]=" ";
char* formato="Bucle %5,2f";
sprintf(buffer, formato, i);
i+=1.01;
Serial.println(buffer);
delay(1000);
}El formato del número de coma flotante %5,2f indica que tendremos 5 dígitos en la parte entera con 2 decimales. La f indica que es un número de coma flotante.
Pero la salida no fue la esperada:
Es decir, arduino no es capaz de manejar a través de la función sprintf los números en coma flotante.
Solución final a la conversión de números a cadenas en Arduino
Pero encontré otra alternativa a la función sprintf, dtostrf. Así que me decidí a probarla para encontrar la solución a este problema. Para utilizar dicha función debemos conocer los parámetros.
char* dtostrf(float number, int tamanyo, int decimales, char* buffer);
/* | | | \_ buffer donde almacenaremos la cadena
| | \_ Precisión (nº decimales)
| \_Tamaño del número en carácteres
\_ Número a convertir
*/Vuelvo a modificar el código anterior para probarlo
#include <avr/dtostrf.h>
float i=0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //Iniciamos la salida serie
Serial.println("Iniciando ejemplo");
}
void loop() {
char* buffn=""; //Cadena donde almacenaremos el número convertido
dtostrf(i,10,2,buffn); //Llamada a la función
char buffer[80]=" "; //Buffer de la cadena donde se devuelve todo, número formateado y cadena concatenada
char* formato="Bucle %s"; //Cadena con la mascara a convertir
sprintf(buffer, formato, buffn);
i+=1.01;
Serial.println(buffer);
delay(1000);
}Comprobamos que el código funciona, siendo la salida por el monitor serie la siguiente.
Conclusión
Dependerá, como siempre, del proyecto en el que estemos trabajando y de nuestro objetivo, utilizar uno de estos métodos para convertir un número en cadena con Arduino. Hemos visto la utilización print, sprintf y dtostrf.
Gracias a Shutterstock por ceder los derechos de la imagen
