Arduino:
Manual de
Programación
Estructura de un Programa
La estructura básica del lenguaje de programación de Arduino es
bastante simple y se compone de al menos dos partes. Estas dos partes
necesarias, o funciones, encierran bloques que contienen declaraciones,
estamentos o instrucciones.
En Arduino, setup() y loop() son funciones esenciales. setup() se
ejecuta una vez al inicio y configura pines, variables y
comunicación en serie.
loop() contiene el código que se repite continuamente,
permitiendo leer entradas y activar salidas. Su ejecución cíclica
mantiene el sistema funcionando de forma autónoma.
setup()
La función setup() se invoca una sola vez cuando el
programa empieza. Se utiliza para inicializar los
modos de trabajo de los pins, o el puerto serie. Debe
ser incluido en un programa aunque no haya
declaración que ejecutar.
loop()
Después de llamar a setup(), la función loop() hace
precisamente lo que sugiere su nombre, se ejecuta de
forma cíclica, lo que posibilita que el programa este
respondiendo continuamente ante los eventos que se
produzcan en la tarjeta
Funciones
Una función es un bloque de código con un nombre que se ejecuta cuando es llamado.
Además de setup() y loop(), se pueden crear funciones personalizadas para tareas
repetitivas y optimización del código.
Las funciones deben declararse con un tipo de dato que indique el valor que devolverán,
como int para números enteros.
Si la función no devuelve ningún valor, se usa void, indicando que es una "función vacía".
Tras el tipo de dato, se escribe el nombre de la función y, entre paréntesis, los parámetros
necesarios.
{} entre llaves
Las llaves sirven para definir el principio y el final de un bloque de instrucciones. Se utilizan
para los bloques de programación setup(), loop(), if.., etc
En Arduino, cada llave de apertura { debe tener una llave de cierre }, de lo contrario, el
programa generará errores.
El entorno de programación de Arduino ofrece una herramienta para verificar las llaves,
resaltando la llave de cierre correspondiente al seleccionar una llave abierta.
; punto y coma
El punto y coma “;” se utiliza para separar instrucciones en el lenguaje de programación de
Arduino. También se utiliza para separar elementos en una instrucción de tipo “bucle for”.
Olvidarse de poner fin a una línea con un punto y coma se traducirá en un error de
compilación. El texto de error puede ser obvio, y se referirá a la falta de una coma, o
puede que no.
/*… */ bloque de comentarios
Los bloques de comentarios son textos ignorados por el programa, usados para describir el
código.
Empiezan con /* y terminan con */, permitiendo escribir en varias líneas.
Los comentarios no ocupan memoria en Arduino, por lo que pueden usarse libremente.
También sirven para desactivar temporalmente bloques de código y facilitar la
depuración.
// línea de comentarios
Una línea de comentario empieza con / / y terminan con la siguiente línea de código. Al igual
que los comentarios de bloque, los de línea son ignoradas por el programa y no ocupan
espacio en la memoria.
Una línea de comentario se utiliza a menudo después de una instrucción, para proporcionar
más información acerca de lo que hace esta o para recordarla más adelante.
Variables
Una variable almacena un valor
numérico que puede cambiar, a
diferencia de las constantes.
'variableEntrada' es la variable en sí. La primera línea declara que será
Debe declararse y puede recibir un
de tipo entero “int”. La segunda línea fija a la variable el valor
valor inicial, como en el ejemplo
correspondiente a la entrada analógica PIN2. Esto hace que el valor de
donde variableEntrada guarda el
PIN2 sea accesible en otras partes del código.
dato del PIN2.
Una vez que una variable ha sido
asignada, o re-asignada, usted
puede probar su valor para ver si
cumple ciertas condiciones
(instrucciones if..), o puede utilizar
directamente su valor.
Declaración de variables
Las variables deben declararse antes de usarse, especificando su tipo (como int, long, float) y
un nombre, con un valor inicial opcional.
Aunque la declaración se hace solo una vez, el valor de la variable puede cambiarse en
cualquier momento.
Por ejemplo, entradaVariable se declara como un int y se le asigna el valor inicial de cero.
Una variable puede ser declarada en
una serie de lugares del programa y en
función del lugar en donde se lleve a
cabo la definición esto determinará en
que partes del programa se podrá
hacer uso de ella
Utilización de una variable
Una variable puede declararse al inicio del programa, dentro de funciones o en bloques
como bucles if o for, lo que determina su ámbito de uso.
Una variable global se declara antes de setup() y puede ser utilizada en cualquier parte del
programa.
Una variable local se define dentro de una función o bucle y solo es accesible dentro de ese
ámbito específico.
Byte
Byte almacena un valor numérico de 8 bits sin decimales. Tienen un rango entre 0 y 255
Int
Enteros son un tipo de datos primarios que almacenan valores numéricos de 16 bits sin
decimales comprendidos en el rango 32,767 to -32,768.
Las variables de tipo entero “int” pueden sobrepasar su valor máximo o mínimo como
consecuencia de una operación. Por ejemplo, si x = 32767 y una posterior declaración agrega
1 a x, x = x + 1 entonces el valor se x pasará a ser -32.768. (algo así como que el valor da la
vuelta)
long
El formato de variable numérica de tipo extendido “long” se refiere a números enteros (tipo 32
bits) sin decimales que se encuentran dentro del rango -2147483648 a 2147483647.
float
El formato de dato del tipo “punto flotante” “float” se aplica a los números con decimales. Los
números de punto flotante tienen una mayor resolución que los de 32 bits con un rango
comprendido 3.4028235E +38 a +38-3.4028235E.
arrays
Un array es un conjunto de valores accesibles mediante un índice numérico.
El primer valor del array tiene el índice 0.
El array debe declararse y, opcionalmente, asignarse valores a sus posiciones antes de ser
usado.
Del mismo modo es posible declarar
una matriz indicando el tipo de datos
y el tamaño y posteriormente,
asignar valores a una posición
especifica:
Para leer de un array basta con
escribir el nombre y la posición a leer:
arrays
Las matrices se usan
frecuentemente en bucles,
donde el contador del bucle
actúa como índice del array.
En el ejemplo de parpadeo de
un LED, un bucle for utiliza el
índice para acceder a los
valores del array parpadeo[].
El contador comienza en 0, envía
el valor en la posición 0 (180) al
PIN10, espera 200 ms y luego
pasa al siguiente valor del array
según el índice.
aritmética
Los operadores aritméticos que se incluyen en el entorno de
programación son suma, resta, multiplicación y división. Estos
devuelven la suma, diferencia, producto, o cociente
(respectivamente) de dos operandos
Las operaciones en Arduino dependen del tipo de datos de los operandos (como int, dbl, float, etc.). Por
ejemplo, si definimos 9 y 4 como enteros (int), la división 9 / 4 devolverá 2, no 2.25, ya que los enteros no
reconocen los decimales.
Esto también implica que puede ocurrir un desbordamiento si el resultado es mayor que el valor máximo
que el tipo de dato puede almacenar. Es importante conocer el alcance de los tipos numéricos.
Si los operandos son de diferentes tipos, se utilizará el tipo más grande para el cálculo. Por ejemplo, si uno
es float y el otro int, el cálculo se realizará como un float.
Es importante elegir el tamaño adecuado para las variables, asegurándose de que sea suficiente para la
precisión deseada.
Para operaciones que requieren decimales, es recomendable usar variables float, aunque las
operaciones con ellas son más lentas.
Si necesitas convertir tipos de datos sobre la marcha, puedes usar el operador (int). Por ejemplo, i = (int)
3.6 asignará a i el valor 3.
asignaciones compuestas
Las asignaciones compuestas combinan una operación aritmética
con una variable asignada. Estas son comúnmente utilizadas en los
bucles tal como se describe más adelante. Estas asignaciones
compuestas pueden ser:
operadores de comparación
Las comparaciones de una variable o constante con otra se utilizan con frecuencia en las
estructuras condicionales del tipo if.. para testear si una condición es verdadera. En los ejemplos
que siguen en las próximas páginas se verá su utilización práctica usando los siguientes tipo de
condicionales:
operadores lógicos
Los operadores lógicos son usualmente una forma de comparar dos expresiones y devolver un
VERDADERO o FALSO dependiendo del operador. Existen tres operadores lógicos, AND (&&), OR (||)
y NOT (!), que a menudo se utilizan en estamentos de tipo if..:
constantes
El lenguaje de programación de Arduino tiene unos valores predeterminados, que son llamados
constantes. Se utilizan para hacer los programas más fáciles de leer. Las constantes se clasifican
en grupos.
cierto/falso (true/false)
Las constantes booleanas HIGH y LOW definen los niveles de las salidas digitales, donde FALSE se
asocia con 0 y TRUE con 1.
Sin embargo, cualquier valor distinto de cero se considera TRUE en términos booleanos, por lo
que -1, 2 y -200 también se definen como TRUE.
high/low
Estas constantes definen los niveles de salida altos o bajos y se utilizan para la lectura o la
escritura digital para las patillas. ALTO se define como en la lógica de nivel 1, ON, ó 5 voltios,
mientras que BAJO es lógica nivel 0, OFF, o 0 voltios.
input/output
Estas constantes son utilizadas para definir, al comienzo del programa, el modo de
funcionamiento de los pines mediante la instrucción pinMode de tal manera que el pin puede
ser una entrada INPUT o una salida OUTPUT.
if (si)
if es un estamento que se utiliza para probar si una determinada condición se ha alcanzado,
como por ejemplo averiguar si un valor analógico está por encima de un cierto número, y
ejecutar una serie de declaraciones (operaciones) que se escriben dentro de llaves, si es verdad.
Si es falso (la condición no se cumple) el programa salta y no ejecuta las operaciones que están
dentro de las llaves, El formato para if es el siguiente:
if… else (si….. sino ..)
if… else viene a ser un estructura que se ejecuta en respuesta a la idea “si esto no se cumple haz
esto otro”. Por ejemplo, si se desea probar una entrada digital, y hacer una cosa si la entrada fue
alto o hacer otra cosa si la entrada es baja, usted escribiría que de esta manera:
Else puede ir precedido de otra condición de
manera que se pueden establecer varias
estructuras condicionales de tipo unas dentro
de las otras (anidamiento) de forma que sean
mutuamente excluyentes pudiéndose
ejecutar a la vez.