Variables globales en Arduino

Variables globales en Arduino

Una variable global en Arduino es una variable cuya visibilidad se extiende a todo el programa, es visible en todos los m贸dulos y funciones. En este art铆culo conoceremos algunos ejemplos de uso de variables globales y analizaremos cu谩ndo conviene usar una variable global y y cu谩ndo es mejor no usarla.

Visibilidad de variables en Arduino

Como bien sabemos, en cualquier lenguaje de programaci贸n se utilizan variables para almacenar cualquier dato. Cada variable tiene un nombre y un tipo, y para crear una variable s贸lo es necesario especificar ambas cosas a la vez. Por ejemplo, si escribimos “int sum;” en el c贸digo, le diremos al compilador que necesitamos crear una celda de memoria con el tipo de datos int y la suma del nombre.

Una vez creada una variable, podemos usarla para guardar y leer valores. Pero la pregunta sigue siendo: 驴d贸nde podemos hacerlo exactamente? De acuerdo con las reglas de Arduino (en realidad, estas reglas vienen de C++), cada variable tiene su propio h谩bitat, un 谩rea donde se puede trabajar con ella, guardar valores y leerlos. Para programar con Arduino debemos comprender que abarca esta 谩rea de trabajo.

Variables locales

Las variables locales son variables cuya visibilidad se limita al bloque “local” actual. Por ejemplo, podemos definir una variable en un bloque limitado por los operadores if (condiciones) y la variable s贸lo ser谩 visible en su interior. Ejemplos de bloques locales:

  • Dentro del ciclo (for, while)
  • Dentro de la funci贸n
  • Dentro de un bloque condicional (if, else).

La limitaci贸n significa lo siguiente: el compilador te permitir谩 usar el nombre de la variable dentro del bloque pero “no la reconocer谩” si la dirigimos desde el exterior. Veamos un ejemplo:

En este ejemplo, hemos creado la variable internalSum y guardamos el resultado de la operaci贸n aritm茅tica de sumar los dos valores que se nos pasaron en los argumentos de la funci贸n.

Imaginemos que queremos usar esta variable para enviar valores al monitor de puerto. Esto no causar谩 ning煤n problema:

Creamos la variable, calculamos su valor y la enviamos al monitor del puerto en la funci贸n Serial.println.

Ahora crearemos una nueva funci贸n e intentaremos tambi茅n dar salida al valor obtenido en la funci贸n anterior. 驴Podremos hacerlo?

Por supuesto que no. En la funci贸n calculadora, el compilador intentar谩 encontrar la definici贸n de la variable internalSum dentro de la funci贸n, pero no la encontrar谩 (hemos definido internalSum en la funci贸n sum()). Al no encontrar la variable, el compilador generar谩 un error (m谩s adelante veremos como podemos evitar este error utilizando variables globales). Entonces, podemos hacer cualquier cosa con una variable en el bloque en el que fue definida, pero no podemos utilizarla fuera del bloque.

Variables globales

驴Pero qu茅 pasa si necesitamos acceder a la variable desde otro bloque? Tenemos dos opciones para lograrlo.

Si el bloque est谩 dentro del bloque actual (por ejemplo, hay un bloque con un ciclo dentro de la funci贸n), los valores del bloque “externo” ser谩n visibles en 茅l. Por ejemplo, en este ejemplo, dentro del bloque para que podamos ver y usar el resultado de la variable:

La segunda opci贸n es utilizar una variable global.

Una variable global es una variable cuya visibilidad no se limita a funciones individuales o bloques internos. Podemos usar y cambiar la variable global en cualquier parte del programa y al compilador no le importar谩.

Veamos el siguiente ejemplo del sketch de arduino:

Usamos variables globales para almacenar valores entre llamadas de funci贸n de bucle y no para escribir el n煤mero de pin varias veces (la variable global pinLed se usa como una constante). La variable lastMills es necesaria para implementar parte de la funcionalidad sin demora().

Problemas de las variables globales

Al tener la oportunidad de cambiar el valor de una variable en cualquier lugar, podemos cometer un error, cambiando accidentalmente el valor de la variable en diferentes partes del programa. Si esto sucede, tendremos que revisar todo nuestro c贸digo buscando todos los casos en que usamos la variable global que nos d谩 el error.
Tambi茅n tendremos que tener en cuenta c贸mo afectar谩n los cambios que hagamos en una variable global en las diferentes partes del programa. Este problema se presenta por lo general en grandes proyectos donde tenemos muchas l铆neas de c贸digo, funciones y bloques.

Otro problema espec铆fico con el uso de variables globales en arduino es la memoria. Como sabes, los controladores Arduino est谩n limitados en cantidad de memoria. En proyectos reales se debe tener muy en cuenta que uso le damos a cada byte. Las variables locales se crean din谩micamente y desaparecen de la memoria tras la finalizaci贸n de la funci贸n, liberando espacio en la memoria. 驴C贸mo se comportan las variables globales? Totalmente lo opuesto, ya que sus sus valores deben estar disponibles en todo el programa y todo el tiempo, por lo que ocupan espacio en memoria constantemente. Y si tenemos muchas variables globales en el c贸digo, tambi茅n necesitaremos mucha memoria para ellas, lo que puede causar problemas.

Este segundo problema podemos solucionarlo utilizando constantes. Si declaramos la constante int const pinLed = 13 en el c贸digo, conseguimos que el compilador simplemente inserte un n煤mero en los lugares necesarios eliminando esta variable del 谩rea de memoria global.

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (3 votos, promedio: 4,67 de 5)

Cargando鈥

Si quieres aprender m谩s sobre arduino, mira los otros art铆culos de la secci贸n “Curso de Arduino“: