Variables-en-Arduino

En esta tercera leccion vamos a ver cómo se utilizan las variables en Arduino. Las variables sirven para guardar información.

Tipos de variables

Los datos que guardamos en las variables pueden ser de diferentes tipos, vamos a listar algunos de ellos. Para una referencia completa de los tipos de variables en Arduino se puede consultar esta página web.

  • char, se utilizan para almacenar caracteres, ocupan un byte.
  • byte, pueden almacenar un número entre 0 y 255.
  • int, ocupan 2 bytes (16 bits), y por lo tanto almacenan número entre 2-15 y 215-1, es decir, entre -32,768 y 32,767.
  • unsigned int, ocupa trambién 2 bytes, pero al no tener signo puede tomar valores entre 0 y 216-1, es decir entre 0 y 65,535.
  • long, ocupa 32 bits (4 bytes), desde -2,147,483,648 a 2,147,483,647.
  • unsigned long.
  • float, son números decimales que ocupan 32 bits (4 bytes). Pueden tomar valores entre -3.4028235E+38 y +3.4028235E+38.
  • double, también almacena números decimales, pero disponen de 8-bytes (64 bit).

Siempre que elegimos un tipo de dato debemos escoger el que menos tamaño necesite y que cubra nuestras necesidades, ya que ocuparán espacio en la memoria de nuestra placa y podría darse el caso de que nuestro programa requiera más memoria de la disponible.

Pero, ¿cómo “hacemos” variables en nuestro código? Es muy sencillo: indicando el tipo y el nombre de la variable. Además podemos darle o no un valor inicial. Veamos un ejemplo:

Hay otro tipo muy importante, String, sirve para almacenar cadenas de texto, y es fundamental a la hora de enviar texto por el puerto serie. Permite crear cadenas a partir de número, otras variables, o concatenando cadenas. Veamos algunos ejemplos (de esta página):

Existe aún otro tipo importante, llamado array, que es una agrupación ordenada de datos de un tipo determinado. De momento no lo vamos a ver… vamos a ir poco a poco.

Vamos a hacer un programa de ejemplo que suma dos enteros y muestra el resultado por puerto serie:

En este programa hemos escrito todo en la función setup ya que queremos que se ejecute solo una vez. ¿Cuál de estas tres opciones crees que se imprimirá por el puerto serie?

  1. a + b equals c
  2. 5 + 6 equals 11
  3. a + b equals 11

Vas a tener que hacer tú mismo el problema para comprobar si has acertado.

Ámbito de las variables

Vamos a explicar esto mediante ejemplos.

Ámbito global

Decimos que la variable a es global porque se puede acceder a ella desde cualquier parte, es decir, estamos accediendo a su valor desde las funciones setup y loop.

Lo que obtendríamos por el puerto serie sería lo siguiente:

variable_global

Ámbito local

Son variables que solo existen dentro del ámbito en el que han sido declaradas. Por entendernos rápidamente, un ámbito es lo que está entre llaves. Si las utilizamos fuera de su ámbito tendremos un error de compilación. Al existir solo dentro de su ámbito mi programa podría repetir el mismo nombre de variable en distintos ámbitos. Vamos a ver algunos ejemplos para explicarlo bien:

Al compilar este programa obtendremos un error de código, por la variable int a es de ámbito local, y solo existe dentro de la función setup por lo que no la podemos usar en la función loop.

¿Qué pasaría con este código?

¿Compila? Sí, porque a ha sido declarada tando dentro del loop como dentro del setup. ¿Qué se imprimiría en el monitor del puerto serie?

Seguro que te he pillado… ¿esperabas que se imprimiera 1 2 3 4 … ? Sí, cualquiera lo hubiera esperado. ¿Por qué no? Porque la variable a del loop se crea y se destruye en cada iteración, por lo que siempre se inicializa a 0 y se le añade 1… Por lo tanto, siempre vale 1 dentro del loop.

¿Y los siguientes programas? A ver si lo adivinas, hazlos tú mismo para comprobar el resultado.

Si te atreves, escribe en los comentarios lo que debería salir (antes de comprobarlo). A ver quién acierta :)