Programar una placa Arduino UNO es poder tener la libertad de escoger las funciones que necesita que realice tu circuito eléctrico sin necesidad de otras entidades que te impongan su diseño. Hoy en día con la inteligencia artificial no es necesario conocer ningún lenguaje de programación, pues ya solo hace falta hacer un buen "prompt" para que te devuelva el código que quieres usar.

En esta clase aprenderás las estructuras básicas del lenguaje de C++ y del IDE de Arduino UNO rev3 y rev4, basado en Processing.

Estructura básica de un bloque de Arduino.

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.

// the setup routine runs once when you press reset: void setup() { } // the loop routine runs over and over again forever: void loop() { } Arduino

En donde setup() es la parte encargada de recoger la configuración y loop() es la que contienen el programa que se ejecutará repetidamente. Ambas funciones son necesarias para que el programa trabaje.

La función de configuración setup(), debe contener la declaración de las variables. Es la primera función a ejecutar en el programa, se ejecuta sólo una vez, y se utiliza para configurar o inicializar pinMode (modo de trabajo de las E/S), configuración de la comunicación en serie y otras.

La función bucle (loop) siguiente contiene el código que se ejecutara continuamente (lectura de entradas, activación de salidas). Esta función es el núcleo de todos los programas de Arduino y la que realiza la mayor parte del trabajo.

La función setup() se invoca una sola vez cuando el programa empieza. Se utiliza para inicializar los modos de trabajo de los pines, o el puerto serie. Debe ser incluido en un programa aunque no haya declaración que ejecutar.

// the setup routine runs once when you press reset: void setup() { pinMode (PIN, ESTADO); //Establece el pin de origen y su configuración. } // the loop routine runs over and over again forever: void loop() { } Arduino

Dentro de la función pinMode(), establecemos el número de pin de nuestra Arduino sobre el que vamos a actuar. Por ejemplo el PIN2 lo podemos llamar directamente de acuerdo al valor que tiene dicho pin, porque Arduino asigna un valor entero a sus puertos, por lo que el PIN1 es el 1, el PIN2, el 2, etc., etc.

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.

// the setup routine runs once when you press reset: void setup() { pinMode (2, OUTPUT); //Establece el pin2 de origen y su configuración. } // the loop routine runs over and over again forever: void loop() { digitalWrite(2, HIGH); //El PIN2 tiene tensión positiva (5V). delay(1000); //Pausa de 1000 milisegundos (1s). digitalWrite(2, LOW); //El PIN2 no tiene tensión. delay(1000); ////Pausa de 1000 milisegundos. } Arduino

El anterior código va a hacer que el PIN2 de Arduino, primero en el setup, se asigne como salida, OUTPUT. La función pinMode() solo permite dos estados:

● pinMode(PIN, INPUT); // PIN como entrada.
pinMode(PIN, OUTPUT); // PIN como salida.

Al establecer como entrada (INPUT) al PIN de la Arduino UNO, estás permitiendo que dicho PIN pueda recibir tensión eléctrica externa para controlar un componente pasivo como potenciómetros o sensores analógicos. Por eso los puertos de entrada de la Arduino UNO y Arduino UNO Q, son los puertos que tienen la clasificación de puertos de A0 a A5.

Potenciómetro conectado a puerto analógico

Proyecto para controlar el potenciómetro con una Arduino UNO.

Pero cuando se establecen como salida (OUTPUT), el rango de acción que se le da a la placa es mucho mayor ya. Por lo general, los pines digitales y PWM (Pulse Width Modulate), se utilizarán con una configuración de salida.

La función delay(), establece una pausa de tiempo establecido entre paréntesis en mili segundos. Si como parámetros pones 1000 (ms), el tiempo de pausa será de un segundo. La función delay(), deriva del tipo unsigned long, por lo que tienes la posibilidad de poner un número entero desde el cero hasta el 232 -1, o lo que en días se traduciría como una pausa de casi 50 dias.

La función digitalWrite(), utiliza dos parámetros obligatorios. El primer parámetro es el PIN que hemos configurado en el Setup(); y el segundo parámetro es la salida que va a tener. Las salidas pueden ser:

● HIGH; //Activamos el PIN y aparecen 5V en su PIN (Estado alto).
● LOW; //En el PIN hay 0V (Estado bajo).

En el anterior sketch, en el setup(), configuramos al PIN2 como entrada y en loop() hacemos que su PIN2 esté alto (1), le damos una pausa en ese estado de 1 segundo. Y luego lo pasamos a bajo (0), y le damos otra pausa de un segundo, por lo, como el loop() se repite infinitamente, estamos haciendo que el PIN2, se active y se desactive cada segundo.

Si pones un LED con una resistencia limitadora sobre el PIN2 y GND (masa), verás como el LED se enciende y se apaga cada segundo:

Circuito LEd intermitente cada segundo

El circuito hace que el LED se ponga de forma intermitente cada segundo.

Conceptos básicos.

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(), bloque if…, bucles, funciones, etc.

type funcion() {
   sentencias;
}

Una llave de apertura {, siempre debe ir seguida de una llave de cierre }, si no es así el programa dará errores.

El entorno de programación de Arduino incluye una herramienta de gran utilidad para comprobar el total de llaves. Sólo tienes que hacer click en el punto de inserción de una llave abierta e inmediatamente se marca el correspondiente cierre de ese bloque (llave cerrada).

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.

int x = 13; // declara la variable 'x' como tipo entero de valor 13

Nota: 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. Si se produce un error raro y de difícil detección lo primero que debemos hacer es comprobar que los puntos y comas están colocados al final de las instrucciones.

Los bloques de comentarios, o multi línea de comentarios, son áreas de texto ignorados por el programa que se utilizan para las descripciones del código o comentarios que ayudan a comprender el programa. Comienzan con /* y terminan con */ y pueden abarcar varias líneas.

/* esto es un bloque de comentario
no se debe olvidar cerrar los comentarios estos
deben estar equilibrados
*/

Debido a que los comentarios son ignorados por el programa y no ocupan espacio en la memoria de Arduino pueden ser utilizados con generosidad y también pueden utilizarse para comentar bloques de código con el propósito de anotar informaciones para depuración.

Una línea de comentario empieza con // y terminan al final de la misma línea. Al igual que los comentarios de bloque, los de línea son ignoradas por el programa y no ocupan espacio en la memoria.

// Esto es un comentario

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.

Arduino como otro lenguaje de programación, puede manejar un tipo de dato concreto. Las variables, constantes, funciones y bloques específicos tienen ligado un identificador y un tipo de dato para que Arduino pueda configurar la acción requerida en la placa según la acción y el dato expresado.

Un tipo de dato define:

● Un espacio en memoria de Arduino asignado para dicho objeto.
● El valor o rango de valores que puede almacenar.
● Las operaciones que se pueden hacer con el valor.

Tipos de datos en Arduino ├── Tipos primitivos (básicos) │ ├── Enteros (con y sin signo) -> int | char | long | word │ ├── Punto flotante (decimales) -> float | double │ ├── Carácter (texto) -> string | char │ └── Booleano (verdadero/falso) -> true | false ├── Tipos compuestos │ ├── Arrays (arreglos) │ ├── Strings (cadenas de texto) │ └── Structs (estructuras) └── Tipos especiales ├── void (sin valor) └── punteros (direcciones de memoria) Arduino

Los tipos de datos y su resumen se presentan en esta tabla:

Tipo Tamaño (bytes) Rango de valores ¿Cuándo usarlo?
byte 1 0 a 255 Guardar un número pequeño (ej. valor de sensor) Muy común
char 1 -128 a 127 Caracteres ASCII o números pequeños con signo
unsigned char 1 0 a 255 Igual que byte Sinónimo
int 2 -32,768 a 32,767 Números enteros comunes — ¡El más usado! ⭐ Favorito
unsigned int 2 0 a 65,535 Números positivos que no caben en int
word 2 0 a 65,535 Igual que unsigned int Sinónimo
long 4 -2,147,483,648 a 2,147,483,647 Números muy grandes (millones, miles de millones)
unsigned long 4 0 a 4,294,967,295 Para tiempo (millis()), grandes positivos ¡Obligatorio!
float 4 ±3.4E-38 a ±3.4E+38 Números decimales (temperatura, voltaje) Lento ⚠️
double 4 Igual que float ¡En UNO es idéntico a float! Cuidado
bool / boolean 1 true o false Estados (LED encendido/apagado, botón presionado) Muy útil

Ten en cuenta que muchos de estos tipos pueden o no tener signo. Si es unsigned, los valores que permitirán solo son positivos (incluyendo el cero).

Funciones

Una función es un bloque de código que tiene un nombre y un conjunto de sentencias que son ejecutados cuando se llama a la función.

Son funciones, setup() y loop() que son las funciones básicas de un sketch de Arduino.

Las funciones de usuario pueden ser escritas para realizar tareas repetitivas y para reducir el tamaño de un programa. Las funciones se declaran asociadas a un tipo de valor dependiendo del tipo que lleve asociado. Este valor será el que devolverá la función; por ejemplo int se utilizará cuando la función devuelva un dato numérico de tipo entero. Si la función no devuelve ningún valor entonces se colocará delante la palabra void, que significa función vacía.

Después de declarar el tipo de dato que devuelve la función se debe escribir el nombre de la función y entre paréntesis se escribirán, si es necesario, los parámetros que se deben pasar a la función para que se ejecute.

Lectura de un potenciómetro

Este código establecer las variable para leer la entrada de un potenciómetro.

La función siguiente devuelve un número entero, delayVal() se utiliza para poner un valor de retraso en un programa que lee una variable analógica de un potenciómetro conectado a una entrada de Arduino. Al principio se declara como una variable local, v recoge el valor leído del potenciómetro que estará comprendido entre 0 y 1023, luego se divide el valor por 4 para ajustarlo a un margen comprendido entre 0 y 255, finalmente se devuelve el valor v y se retornaría al programa principal. Esta función cuando se ejecuta devuelve el valor de tipo entero v.

Una función tiene cuatro parte principales:

● El tipo de retorno.
● El nombre de la función (identificador).
● Parámetros (opcionales).
● El cuerpo de la función.

La sintaxis general de una función es la siguiente:

tipo_de_retorno nombreFuncion(tipo parametro1, tipo parametro2) { // Código return valor; // solo si no es void } Arduino

Tipos de funciones según su retorno.
Dependiendo si una función devuelve o no datos, se escribirán dos tipos de funciones:

La que devuelven datos se establecerán con su tipo de dato y siempre contendrá la palabra reservada return para dicho dato:

int suma(int a, int b) { return a + b; } boolean esPar(int numero) { if (numero % 2 == 0) return true; else return false; } Arduino

Así que si en Arduino UNO, yo llamo a la función suma() y entre paréntesis le paso dos números enteros, me devolverá la salida de la forma:

Serial.print("El resultado de la suma es: ");
Serial.println(suma(5,5)); // Imprime: El resultado de la suma es: 10

La función con retorno siempre retornará el mismo tipo de dato con que se ha establecido en sus parámetros, por lo que si queremos usar el dato como otro tipo, tendremos que hacer el casting de la variable o la conversión del tipo de dato.

Otro tipo de función es la que no devuelve valor, sino que ejecuta las instrucciones cuando se llama a dicha función. Se caracterízan en que utiliza la palabra reservada void cuando se escribe.

void encenderLED (int pin) { digitalWrite(pin, HIGH); } Arduino

Esta función encenderá el LED cuando se invoque unicamente. Realiza una acción y no devuelve ningún valor.

Esta ha sido una introducción a la programación en C++ de Arduino UNO. En la siguiente práctica podrás utilizar la programación en la Arduino UNO Q, y haremos un proyecto con Python para mostrar la temperatura ambiente con un sensor de temperatura TMP36.

Comparte este conocimiento en redes sociales