Las cadenas de texto se pueden representar de dos maneras. Se puede utilizar el tipo de datos String, que forma parte del núcleo de programación de Arduino, o podemos hacer una cadena en una matriz de tipo char y usar el terminador null (el numero cero). A continuación describiremos este último método, que es el que hemos utilizado en el post Comunicando dos placas Arduino usando WiFi UDP.
En un post anterior (Como usar las matrices (arrays) en Arduino) hemos explorado las opciones básicas de creación y uso de matrices de cadenas de texto. Por lo que ahora veremos otras funciones.
Como usar la función sprintf en Arduino
Esta función crea una cadena de texto basandose en los parametros de entradas que le aportemos, y esto incluye números enteros. Esta funciones es nativa del lenguaje C, como referencia sugiero ver la pagina cplusplus.com, donde se exploran todas las opciones de formato. Acá usaremos las básicas.
Sintaxis
sprintf (matriz de caracteres, texto con formato, valores);
Ejemplo 1 – Convertir enteros a cadenas de texto usando sprintf
char msg[20]; //Matriz de caracteres void setup() { Serial.begin(9600); //Inicio el puerto serie } void loop() { int valorx = analogRead(A1); //leo el valor del eje x int valory = analogRead(A2); //leo el valor del eje y sprintf(msg, "%4i%4i", valorx,valory); // Crea una cadena de texto con los valores de los ejes Serial.print("La cadena de texto creada con sprintf es: "); Serial.println(msg); //Imprimo la cadena de texto al monitor serie delay(2000); }
La salida en el monitor serie sera la siguiente:
Dentro de las comillas dobles podríamos si quisiéramos colocar también algún texto. por ejemplo «El valor de x es: %4i y el valor de y es %4i».
Podemos agregar tantos números como queramos a la cadena de texto siempre que la matriz pueda almacenarlos. Cada numero se inserta con el símbolo «%» seguido del numero de caracteres que ocupara el numero, en este caso 4, pues las variables que quiero convertir solo llegan a un máximo de 1023. y la «i» indica que el numero es un entero.
El terminador null es insertado al final de la cadena por la función.
La función sprintf() solo nos permite convertir enteros a cadena de texto, no funciona bien con números tipo float, para ello usaremos otra función.
Usando la función dtostrf para convertir floats a cadena de texto
La función dtostrf() convierte un numero de tipo float en una cadena de texto.
Sintaxis
dtostrf(variable,mumero de digitos,numero de decimales,matriz);
Y nada mejor para ilustrarlo que un ejemplo, usaremos el ejemplo anterior donde le añadimos un float al final de las cadena de texto.
Ejemplo 2 – Convertir floats a cadenas de texto con dtostrf
#include <avr/dtostrf.h> // libreria necesaria para la funcion "dtostrf()" char msg[20]; //Matriz de caracteres char buferfloat[7]; void setup() { Serial.begin(9600); //Inicio el puerto serie } void loop() { int valorx = analogRead(A1); //leo el valor del eje x int valory = analogRead(A2); //leo el valor del eje y sprintf(msg, "%4i%4i", valorx,valory); // Crea una cadena de texto con los valores de los ejes Serial.print("La cadena de texto creada con sprintf es: "); Serial.println(msg); //Imprimo la cadena de texto al monitor serie dtostrf(valorx/100.0,6,3,buferfloat); // Convierto un numero float a una cadena de texto strcat(msg,buferfloat); // concatena dos cadenas de texto Serial.print("La cadena de texto creada es: "); Serial.println(msg); //Imprimo la cadena de texto al monitor serie delay(2000); }
El resultado en el monitor serie sera el siguiente
Notemos en primer lugar que necesitamos un include para que el compilador nos reconozca la función.
Hemos tomado la variable valorx y la dividimos entre 100, y este valor lo guardamos en la matriz buferfloat, y su formato es de 6 caracteres (incluyendo el punto) con 3 decimales. dependiendo del rango de nuestro valor a convertir podríamos cambiar el formato del numero. Luego usamos la funcion strcat() para unir dos cadenas de texto, esta función añade una cadena de texto al final de otra.
Ahora para extraer un entero y un float de una cadena de texto necesitaremos otras herramientas.
Convertir cadenas de texto con las funciones atoi() y atof()
Estas funciones nos permiten convertir una cadena de texto a numero, un numero entero en el caso de atoi() y un numero float en el caso de atof(). Lo único que debemos hacer previamente es extraer carácter por carácter el numero a una matriz temporal para poder pasársela a la respectiva función.
Veamos el mismo ejemplo que venimos trabajando, pero ahora incluimos el codigo para extraer de la cadena de texto cada numero.
Ejemplo 3 – Conversión de una matriz con números enteros y números decimales
#include <avr/dtostrf.h> // libreria necesaria para la funcion "dtostrf()" char convBuffer[7]; //Bufer para la conversion char buferfloat[11]; //Bufer para almacenar los numeros float char msg[20]; //Matriz de caracteres void setup() { Serial.begin(9600); //Inicio el puerto serie } void loop() { int valorx = analogRead(A1); //leo el valor del eje x int valory = analogRead(A2); //leo el valor del eje y sprintf(msg, "%4i%4i", valorx,valory); // Crea una cadena de texto con los valores de los ejes Serial.print("La cadena de texto creada con sprintf es: "); Serial.println(msg); //Imprimo la cadena de texto al monitor serie dtostrf(valorx/100.0,6,3,buferfloat); // Convierto un numero float a una cadena de texto strcat(msg,buferfloat); // concatena dos cadenas de texto Serial.print("La cadena de texto creada es: "); Serial.println(msg); //Imprimo la cadena de texto al monitor serie Serial.print("y tiene: "); Serial.print(strlen(msg)); //Imprimo el numero de caracteres en la matriz Serial.println(" caracteres."); // En esta parte del sketch extraigo los valores enteros y punto flotante de la cadena de texto // Ahora se extraen los valores de la cadena de caracteres a enteros convBuffer[0]=msg[0]; convBuffer[1]=msg[1]; convBuffer[2]=msg[2]; convBuffer[3]=msg[3]; convBuffer[4]=0; int valServox=atoi(convBuffer); //convierte la cadena de caracteres a entero convBuffer[0]=msg[4]; convBuffer[1]=msg[5]; convBuffer[2]=msg[6]; convBuffer[3]=msg[7]; convBuffer[4]=0; int valServoy=atoi(convBuffer); //convierte la cadena de caracteres a entero convBuffer[0]=msg[8]; convBuffer[1]=msg[9]; convBuffer[2]=msg[10]; convBuffer[3]=msg[11]; convBuffer[4]=msg[12]; convBuffer[5]=msg[13]; convBuffer[6]=0; float valorF=atof(convBuffer); //convierte la cadena de caracteres a float Serial.print("El valor extraido de X es:"); Serial.println(valServox); Serial.print("El valor extraido de Y es:"); Serial.println(valServoy); Serial.print("El valor extraido de float es:"); Serial.println(valorF,3); //Imprimo el numero con tres decimales Serial.println(); delay(1000); }
Como podemos ver en el ejemplo una vez que extraemos carácter por carácter los caracteres que forman el numero y lo guardamos en otra matriz, solo resta pasárselo a la función correspondiente. Notemos también que agregamos el caracter null manualmente (un cero al final de la cadena).
Usamos también la función strlen() para saber la longitud de la cadena de texto dentro de la matriz, esta longitud no incluye el caracter null.
Podríamos usar también la función sizeof() para determinar la longitud de una matriz.
Y eso a sido todo por ahora, espero les sea de provecho la información. En el próximo post usaremos estas funciones para enviar una cadena de texto usando WiFi y UDP.