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.
1 2 3 4 5 6 7 8 9 10 |
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.
1 2 3 4 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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.
1 2 3 4 5 6 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#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