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:
1 2 3 4 5 |
char miCaracter='a'; //declaramos una variable tipo char, llamada miCarcater y la inicializamos con valor a byte unNumero = 189; // variable tipo byte inicializada a 189 int unEntero; //variable tipo int sin inicializar unsigned int numeroPositivo = 2343; //entero positivo inicializada float numDecimal = 12.212; //numero decimal inicializado a 12,212 |
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):
1 2 3 4 5 |
String stringOne = "Hello String"; // using a constant String String stringOne = String('a'); // converting a constant char into a String String stringTwo = String("This is a string"); // converting a constant string into a String object String stringOne = String(stringTwo + " with more");// concatenating two strings String stringOne = String(13); // using a constant integer |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int a = 5; //variable a es un entero, inicializado a 5 int b = 6; //variable b es un entero, iniciazliado a 6 int c = a + b; //variable c es un entero, inicializado a 11. void setup() { // initialize Serial Serial.begin(9600); // baudrate 9600 Serial.print("a + b equals "); Serial.println(String(c)); } void loop() { } |
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?
- a + b equals c
- 5 + 6 equals 11
- 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int a= 5; void setup() { // initialize Serial Serial.begin(9600); // baudrate 9600 Serial.println(String(a)); Serial.println("fin setup"); } void loop() { a = a + 1; Serial.println(String(a)); delay(1000); } |
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:
Á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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void setup() { int a= 5; //la variable a solo existe dentro de la función setup // initialize Serial Serial.begin(9600); // baudrate 9600 Serial.println(String(a)); Serial.println("fin setup"); } void loop() { //al compilar daría un error de compilación, porque a no existe en loop a = a + 1; Serial.println(String(a)); delay(1000); } |
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?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void setup() { int a = 5; //la variable a solo existe dentro de la función setup // initialize Serial Serial.begin(9600); // baudrate 9600 Serial.println(String(a)); Serial.println("fin setup"); } void loop() { int a = 0; a = a + 1; Serial.println(String(a)); delay(1000); } |
¿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?
1 2 3 4 5 |
5 fin setup 1 1 1 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int a = 0; void setup() { int a = 5; //la variable a solo existe dentro de la función setup // initialize Serial Serial.begin(9600); // baudrate 9600 Serial.println(String(a)); Serial.println("fin setup"); } void loop() { a = a + 1; Serial.println(String(a)); delay(1000); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
int a = 0; void setup() { int a = 5; a = a + 1; // initialize Serial Serial.begin(9600); // baudrate 9600 Serial.println(String(a)); Serial.println("fin setup"); } void loop() { a = a + 1; Serial.println(String(a)); delay(1000); } |
Si te atreves, escribe en los comentarios lo que debería salir (antes de comprobarlo). A ver quién acierta