¿Sabes cuáles son los diferentes tipos de variables que puedes usar con Arduino? Esta guía te ayudará a conocer todos los tipos de variables de Arduino y te será de mucha utilidad tanto si eres un programador principiante en Arduino como si ya eres un experto.
En primer lugar, Arduino es un sublenguae de C/C++, con funcionalidades adicionales relacionadas con las características del hardware de la placa. Por lo tanto, es de esperar que los tipos de datos sean similares. Esto es así, pero Arduino también incorpora algunos tipos de variables modificados y nuevos.
Veamos cuales son todos los tipos de variables Arduino que utilizaremos en nuestros proyectos, con los límites y particularidades para cada uno de ellos.
Tipos de variables Arduino: números enteros
byte
El número byte es el tipo de datos Arduino más pequeño que puedes usar para números enteros cuando programes con Arduino. Un byte contiene 8 bits.
Un bit es simplemente una pieza binaria de información: 0 o 1.
Por lo tanto, un byte contendrá 8 valores binarios. Por ejemplo, el número 45 escrito en 8 bits se verá así: 00101101. Así es como se almacenará el byte en el Arduino. En tu programa puedes elegir entre usar la representación binaria del número, o la representación decimal (la hexadecimal también funciona).
byte b = 260; // decimal //... o ... byte b = 0b00101101; // binario // ... o ... byte b = 0x2D; // hexadecimal
Y puedes imprimir un número con la función Serial.println(), utilizando diferentes argumentos para diferentes representaciones del número.
byte b = 45; void setup() { Serial.begin(9600); Serial.println(b); // imprimir en decimal por defecto Serial.println(b, DEC); // imprime en decimal, igual que arriba Serial.println(b, BIN); // imprimir en binario Serial.println(b, HEX); // imprimir en hexadecimal } void loop() { }
Aquí el resultado en el Monitor Serial será:
45 45 101101 2D
El valor mínimo para un byte es 0, y el valor máximo es 255 (byte es un tipo de datos sin signo, más sobre esto más adelante en este tutorial).
Como puedes ver es bastante corto, así que presta atención cuando uses este tipo de datos. Úsalo sólo para almacenar números muy pequeños.
¿Y qué pasa si intentas almacenar un número menor que 0, o mayor que 255? Pues que el programa seguirá funcionando, pero tu variable se desbordará. Desbordamiento significa que una vez que el valor alcanza 256, volverá a 0.
Entonces, si intentas asignar 260 a un byte:
byte b = 260; void setup() { Serial.begin(9600); Serial.println(b); // imprime en decimal por defecto Serial.println(b, DEC); // imprime en decimal, igual que arriba Serial.println(b, BIN); // imprime en binario Serial.println(b, HEX); // imprimir en hexadecimal } void loop() { }
Obtendrás:
4 4 00000100 4
260 se ha convertido en 4, porque 256 vuelve a 0, entonces 257 se convierte en 1, etc… y 260 se convierte en 4.
Así que, de nuevo, presta atención cuando uses tipos de datos pequeños como byte en tus programas Arduino: si intentas usar un número demasiado grande, la variable se desbordará y su valor no será correcto. Tu programa seguirá compilando, pero al ejecutarlo obtendrás todo tipo de errores en la aplicación.
Int
Int, o entero, es uno de los tipos de variable más comunes que usarás y encontrarás.
Un int es un número entero que puede ser positivo o negativo.
En las placas Arduino como Uno, Nano y Mega, un int almacena 2 bytes de información. Así, por ejemplo, 9999 será representado por 00100111 00001111. Aunque no necesitas conocer la representación binaria, puedes trabajar simplemente con números decimales.
Puedes usar int en todas partes, para almacenar cualquier información representada por un número entero. Por ejemplo: un contador, la temperatura, el número de pasos de un motor paso a paso, el ángulo de un servomotor, etc.
El valor mínimo para un int de 2 bytes es -32 768 y el valor máximo es +32 767. Al igual que los bytes, los integer puede desbordarse.
Por ejemplo, si intentas asignar 32 768 (que está justo por encima del límite máximo), el valor que leerás dentro de la variable será -32 768.
Y si intentas asignar -32 769, obtendrás +32 767.
Por lo tanto, preste atención a no utilizar números demasiado grandes con int. En placas como Arduino Due y Zero, los enteros almacenan 4 bytes, por lo que el rango de valores es mucho mayor: -2.147.483.648 a 2.147.483.647.
Pero en placas Arduino clásicas (Uno, Nano, Mega, etc.), si quieres usar números enteros más grandes tendrás que usar long en lugar de int.
long
Un long es exactamente igual que un int, pero utilizando 4 bytes. El valor mínimo pasa a ser -2.147.483.648 y el valor máximo 2.147.483.647. Con esto no necesitas preocuparte demasiado por el desbordamiento.
Normalmente, usarás long cuando sepas (o supongas) que el tamaño de un int no será suficiente.
Tipos de variables Arduino: unsigned
Para las variables estándar de números enteros, puedes añadir «unsigned» antes del tipo de datos para modificarlo un poco.
Si añades «unsigned», la variable contendrá sólo números positivos, empezando por 0.
Esto es lo que teníamos para byte, que ya es un tipo de datos sin signo (de hecho, similar a unsigned char, que verás más adelante).
unsigned int
Para crear un unsigned int
unsigned int a = 45000;
Un unsigned int empezará en 0 y tendrá un valor máximo de 65 535 (4,294,967,295 en 4 bytes de tabla como Due/Zero). Como ya no tienes números negativos, todos esos números se suman al valor positivo máximo que puedes usar.
El concepto de desbordamiento aquí es el mismo. Si intentas usar 65 536 volverás a 0.
Por lo tanto, unsigned int se puede utilizar si está seguro de que sólo almacenará números positivos (lo hará cumplir) para la variable. Además, el límite máximo aumenta, así que por ejemplo si tienes que usar una variable que va de 0 a 50 000 para leer un sensor, esta será una buena opción.
unsigned long
Un unsigned long empezará en 0 y tendrá un valor máximo de 4.294.967.295, que es un número muy grande. El uso es bastante similar al tipo de datos int, sólo que para números más grandes. Por eemplo, cunado intentes obtener el tiempo con millis o micros, obtendrás un resultado en unsigned long.
Tipos de variables Arduino: bool/boolean
El bool/boolean es un tipo de datos particular de Arduino que sólo contiene información binaria: 1 ó 0 (verdadero o falso).
Los booleanos se utilizan para probar condiciones donde la respuesta es un simple sí/no.
bool isComponentAlive = false; void setup() { if (!componentAlive) { // inicia el proceso de inicialización isComponenetAlive = true; } } void loop() { }
En Arduino puedes usar el tipo bool estándar de C++, o el tipo boolean que es idéntico. Sin embargo, la documentación de Arduino sugiere que sólo utilice bool.
Tipos de variables Arduino: números flotantes
Por ahora sólo hemos visto cómo almacenar y utilizar números enteros con Arduino. ¿Pero qué pasa si quieres almacenar un número como 3.14 ?
float
Una variable float puede almacenar un número float negativo o positivo. Como todos los tipos de datos, tiene un mínimo y un máximo: 3,4028235E+38 a -3,4028235E+38. Esto es mucho mayor que long, aunque float también se almacena en 4 bytes. La razón es simplemente porque ambos tipos de datos se almacenan de forma diferente.
Para crear un float
float f = 3.14 float g = -1916.0;
Así, la resolución de un float es mayor que la de los números enteros, lo que los hace convenientes para algunos cálculos o para leer un valor continuo de un sensor. Sin embargo, es importante tener en cuenta que la precisión de los datos float no es del 100%, cosa que no ocurre con los tipos de datos de números enteros que si son precisos. Por ejemplo, si intentas asignar 3.00 dentro de un número float, el valor real podría ser algo como 3.0000001.
double
En placas como Uno, Mega y Nano, double y float son idénticos, se puede declarar uno u otro indistintamente. En Arduino Due por ejemplo, el double se almacena en 8 bytes en lugar de 4, lo que lo hace diferente, permitiendo almacenar números aún más grandes.
Dato a tener en cuenta en nuestros proyectos: El microcontrolador Arduino tardará mucho más tiempo en procesar un cálculo con números float (tipo de datos float o double) que con números enteros. a ue la potencia de cálculo con la que contamos en nuestros proyectos con Arduino es muy limitada, es una buena práctica usar números enteros cuando sea posible, y números float sólo cuando sea imprescindible.
Tipos de variables Arduino: datos de texto
Hasta ahora emos visto cómo almacenar datos booleanos, números enteros y números con decimales. La última categoría que nos queda por ver es cómo almacenar texto. Las variables de texto se utilizan a menudo cuando se desea compartir información con el usuario (el texto tiene más sentido para un humano que un código hexadecimal) o para comunicarse en ASCII, por ejemplo.
char
El tipo de datos char es bastante particular porque se utiliza principalmente para almacenar letras, pero al final el valor real es un número entre -128 y +127 (almacenado en 1 byte). Los valores correspondientes entre letra y número son los que puedes encontrar en la tabla ASCII.
Por ejemplo, la letra ‘F’ mayúscula tiene el valor 70, y ‘f’ minúscula tiene el valor 102. Puedes hacer cálculos utilizando char. Si añades +1 a la letra ‘F’, el número se convertirá en 71, y la letra ‘G’ correspondiente en mayúscula.
El tipo de datos char puede ser bastante útil para enviar datos a través de Serial/I2C/SPI entre dispositivos. No ocupa mucho espacio (1 byte que es el mínimo), por lo que es más rápido de transferir, y puedes asociar directamente una acción a una letra, por ejemplo: ‘m’ para mover el motor, ‘p’ para parar, ‘a’ para acelerar, etc.
unsigned char
El tipo de datos unsigned char es, de hecho, exactamente el mismo que el tipo de variable byte. Ambos tienen un valor mínimo de 0 y un máximo de 255. Se recomienda utilizar byte en lugar de unsigned char.
String
El tipo de datos String es específico de Arduino, no lo encontrarás en C/C++ estándar. Fíjate también que comienza con «S» mayúscula. El tipo de variable es String, no string.
Este tipo de datos se utiliza normalmente para almacenar texto. Puedes realizar operaciones como la concatenación de cadenas con el operador «+».
String a = "Hola"; String b = "mundo"; String resultado = a + " " + b;
String es una clase, no es un tipo de datos primitivo. Para crear una cadena, tendrías que utilizar una matriz de caracteres. Con la clase String, consigues simplificarte la vida y además tienes un montón de funcionalidades extra.
Array de Variables
Y por supuesto, cada uno de los tipos de datos de Arduino que has visto aquí se pueden almacenar dentro de un array. En el array todos los elementos deberán ser del mismo tipo de datos.
int intArray[3] = { 1, -2, 5, 9 }; long longArray[3] = {2225, -123, 0}; unsigned int unsignedIntArray[3] = { 25, 26, 32 }; unsigned long unsignedLongArray[3] = {15135, 32585, 999977}; bool boolArray[3] = { false, true, false }; double floatArray[3] = { 3.0, 7.9, 12123131.3 }; double doubleArray[3] = { 3.14, -3.14, 7.00 }; char charArray[3] = { 'a', 'b', 'c' }; // o directamente: = "abc"; String stringArray[3] = { "Hola", " ", "Mundo" };
Algunos consejos para finalizar con los tipos de datos Arduino
Como has visto, podrías obtener resultados erráticos si algunas de tus variables se desbordan. Así que asegúrate siempre de cuál es el rango y el valor mínimo/máximo que puede almacenar una variable.
Además, cuanto más complejo sea el tipo de datos, más tiempo de cálculo llevará. Y el Arduino es mucho menos potente que un ordenador «estándar», así que tendrás que tenerlo en cuenta. Si ves que tu programa es demasiado lento, quizá quieras medir cuánto tarda una determinada acción e intentar hacerla más rápida cambiando los tipos de datos de algunas variables y reorganizando/optimizando las operaciones.
Por último, si estás utilizando números enteros y sabes que sólo esperas números positivos, utiliza la versión unsigned del tipo de datos. Tu programa será más claro y menos propenso a errores.
También debes prestar atención en no intentar de sobreoptimizar los datos. Declara siempre tus variables con tipos de datos más grandes que lo que necesitas, y sólo optimiza cuando veas que las cosas van demasiado lentas.