Icono del sitio Home Assistant Fácil

Conversión de números a cadenas en Arduino

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.

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

Salir de la versión móvil