A medida que vuestros programas crecen, os habréis dado cuenta de un problema: el loop() empieza a hacerse eterno.
Tenéis cientos de líneas de código, if dentro de if, bucles for… y cuando queréis cambiar algo, tenéis que buscar entre un mar de llaves y punto y comas 😱.
Además, también os habrá pasado esto: queréis hacer parpadear un LED en tres momentos distintos del programa, y habéis tenido que copiar y pegar el mismo bloque de código tres veces.
Para solucionar esto existen las funciones. Hoy vamos a aprender a empaquetar nuestro código en bloques reutilizables.
¿Qué es una función?
En Arduino, una función es un trozo de código que hace una tarea específica, le ponemos un nombre, y podemos llamarlo desde cualquier parte del programa.
Imaginad una función como una receta de cocina a la que le ponéis un nombre.
En lugar de explicar paso a paso cómo hacer una tortilla cada vez que tenéis hambre (“romper huevos”, “batir”, “calentar aceite”…), simplemente decís: Eh tú, haz una tortilla.
De hecho, ¡ya habéis usado funciones!
setup()yloop()son funciones.digitalWrite()ydelay()son funcoines.
Estas son funcinoes que alguien escribió para vosotros. Ahora vamos a aprender a escribir las nuestras.
Creando tu primera función
La estructura básica para definir una fucnión es:
tipoDevuelto nombreFuncion(parametros) {
// El código de la receta
}
Veámoslo mejor con un ejemplo sencillo, una función simple llamada parpadearTresVeces().
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
// En lugar de escribir todo el código aquí, solo llamamos a la función
parpadearTresVeces();
delay(2000); // Esperamos un poco
parpadearTresVeces(); // ¡Podemos reusarla las veces que queramos!
}
// --- ZONA DE TUS FUNCIONES ---
// (Normalmente se escriben después del loop)
void parpadearTresVeces() {
for(int i=0; i<3; i++) {
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
}
}
void: Significa “vacío”. Indica que esta función hace cosas (enciende luces), pero no nos devuelve ningún resultado (no nos da un número).parpadearTresVeces: Es el nombre que le hemos puesto. (usad nombres descriptivos).(): Paréntesis vacíos, porque no necesita información extra para funcionar.{ ... }: El cuerpo de la función.
Gracias a esto, vuestro loop() queda limpísimo y es muy fácil de leer. Cualquiera que lea parpadearTresVeces() entiende qué pasa sin necesidad de ver los digitalWrite internos.
Funciones con parámetros
La función anterior está bien, pero es un poco rígida. Siempre parpadea 3 veces. ¿Y si quiero que parpadee 5? ¿O 10?
Podemos pasarle información a la función a través de los paréntesis. Esto se llaman Parámetros de la función.
Vamos a mejorar nuestra función:
void parpadear(int numeroVeces) {
for(int i=0; i < numeroVeces; i++) {
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
}
}
Ahora, cuando la llamemos desde el loop, tenemos que darle el dato:
void loop() {
parpadear(5); // Parpadea 5 veces
delay(1000);
parpadear(2); // Parpadea 2 veces
}
Hemos creado una herramienta genérica que se adapta a lo que necesitemos.
Las librerías: Usando el código de otros
Una librería no es más que un conjunto de funciones que podemos añadir a nuestro proyecto para no tener que reinventar la rueda.
Gente muy lista y ha dedicado su tiempo ha escribir cientos de funciones súper útiles para controlar motores, pantallas, sensores complejos o conectarse a Internet.
Además ese “alguien” ha empaquetado todas esas funciones en un archivo y lo ha compartido gratis. Eso es una Librería.
Cómo se usan
Para usar una librería, primero tenemos que avisar a nuestro programa de que la queremos incluir. Esto se hace con el comando #include.
Por ejemplo, para controlar un Servomotor (un motor que podemos mover a un ángulo exacto), usaríamos la librería Servo.h que ya viene instalada en Arduino.
#include <Servo.h> // Incluimos la "caja de herramientas" del Servo
Servo miMotor; // Creamos nuestro objeto motor
void setup() {
miMotor.attach(9); // Le decimos que el motor está en el pin 9
}
void loop() {
// ¡Mirad qué fácil! No tenemos que saber cómo funcionan los pulsos eléctricos.
// Solo usamos la función "write" que viene en la librería.
miMotor.write(90); // "Ponte a 90 grados"
delay(1000);
miMotor.write(0); // "Ponte a 0 grados"
delay(1000);
}
Sin la librería, tendríamos que haber escrito decenas de líneas de código complejo con digitalWrite y microsegundos para mover ese motor. Con la librería, es una sola línea.
¿Dónde consigo librerías?
Arduino tiene un Gestor de Librerías integrado.
- Vais a
Sketch>Include Library>Manage Libraries... - Buscáis lo que necesitéis (ej: “DHT11” para temperatura, “NeoPixel” para luces de colores).
- Le dais a Install.
Antes de pelearos programando un sensor complejo desde cero, buscad en Google “Arduino library [nombre del sensor]”. El 99% de las veces, alguien ya ha hecho el trabajo duro por vosotros.
