Programar fácil con Arduino

Programar fácil con Arduino, entiende cómo funciona el mundo.

  • Blog
  • ¿Quién soy?
  • Podcast
  • Curso Arduino [GRATIS]
  • Curso Domótica [GRATIS]
  • Acceder
Usted está aquí: Inicio / Blog / Arduino / Conversión de números a cadenas en Arduino

Conversión de números a cadenas en Arduino

Comentarios(22)
Luis del Valle Hernández

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.

conversion numeros a cadenas con Arduino

Indice de contenidos

  • 1 Conversión de números a cadenas con print()
  • 2 Utilizando sprintf para convertir números a cadenas
  • 3 Solución final a la conversión de números a cadenas en Arduino
  • 4 Conclusión

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.

conversion numeros 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:

conversion numeros sprintf

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:

conversion numeros sprintf float

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.

conversion numeros dtostrf

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

Motor-DC

Motor DC con Arduino y driver L298N o L293D

Muchos de los proyectos que deseamos realizar con nuestro Arduino pueden incluir algún tipo de movimiento y, probablemente la primera idea que se nos … [+ info...]

Zigbee-y-Home-Assistant

Zigbee y Home Assistant

En este artículo vamos a hacer hincapié en la integración de Zigbee y Home Assistant. Se podría decir que este artículo es una segunda parte de otro … [+ info...]

Panel-de-energia-en-home-assistant-1

Panel de energía en Home Assistant

Hola a todos, bienvenidos al podcast La "Tecnología para Todos". En este capítulo nos encontramos con Germán y José Manuel en una charla sobre paneles … [+ info...]

Copyright © 2022 · Programar Fácil · Aviso legal

Utilizamos cookies propios y de terceros para mejorar nuestros servicios y experiencia de usuario. Si continua navegando, consideramos que acepta su uso.Aceptar Política de privacidad y cookies
Política de cookies

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary
Siempre activado
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Non-necessary
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
GUARDAR Y ACEPTAR