Saltar al contenido

Crear Funciones en Arduino - Programación Modular

¡Bienvenido al décimo capítulo de este curso básico! En el tutorial de hoy te voy a explicar cómo implementar tus propias funciones en Arduino. Además repasaremos algunas de las funciones más importantes, como por ejemplo map, millis y delay, que ya vienen incluidas en el propio lenguaje de programación.  

¡Suscríbete a nuestro canal de YouTube para aprender más sobre Arduino!

Qué es y para qué sirve una función

Una función es un conjunto de instrucciones que realizan una tarea específica. Además, puede ser diseñada e implementada de forma independiente al resto del código.

Las funciones sirven principalmente para ordenar tu código y hacer que unas partes del programa sean independientes de otras. Esto te facilita mucho el trabajo cuando tienes que buscar y solucionar errores. Además, evitan repetir las mismas instrucciones de código una y otra vez. 

Sintaxis y ejemplos

En la imagen de abajo puedes ver cómo es la sintaxis de una función en Arduino y dos ejemplos reales. Al crear una función, lo primero que tienes que escribir es el tipo de dato que te va a devolver. 

Si por ejemplo quieres crear una función que mida la distancia, podrías utilizar tanto «float» como «double», para que te devuelva la distancia medida con decimales. En caso de que los decimales no te interesen, podrías utilizar «int». Si no necesitas que la función te devuelva algún dato, simplemente escribe «void». Ésto significa que no devuelve nada. 

Sintaxis de una función en Arduino

Lo siguiente es el nombre. Puede ser el que tu quieras. Sin embargo es muy recomendable que utilices un nombre que describa rápidamente lo que hace la función. Ésto es una muy buena práctica de programación. 

Dentro de los paréntesis van los parámetros. Éstos son opcionales. Básicamente son variables que le pasas a la función para que las utilice. Por último, dentro de los corchetes tienes que escribir las instrucciones, es decir, lo que quieres que haga la función. 

Ejemplos de funciones en Arduino

En el código que tienes más abajo he creado dos funciones totalmente diferentes. Una se llama «medirDistancia()» y como su propio nombre indica, sirve para medir la distancia con un sensor de ultrasonidos. La otra se llama «alerta()» y básicamente hace parpadear un LED tres veces.  

Prototipos

Antes de implementar las funciones, tienes que escribir sus prototipos. ¿Para qué? Esto sirve básicamente para decirle al programa que en algún lugar de tu código se encuentran tus funciones y que las tenga en cuenta. 

El prototipo de una función está formado por el tipo de dato que te va a devolver, el nombre y los parámetros. Al final también debes poner un punto y coma. Estos prototipos suelen escribirse justo debajo de donde creas las variables, como puedes ver en el código de ejemplo. 

Implementación

Ha llegado el momento de desarrollar tus primeras funciones en Arduino. El lugar donde lo tienes que hacer es justo debajo de la función «void loop». En este caso, también tienes que escribir el tipo de dato, el nombre y los parámetros de la función. Sin embargo, en vez de terminar con un punto y coma, tienes que abrir unos corchetes. Dentro de dichos corchetes van las instrucciones de código que quieres que ejecute tu función. 

Además, también es muy recomendable poner un comentario justo arriba de la implementación, en el cual se explique que es lo que hace la función exactamente. 

Return

Si la función no es de tipo void, significa que devuelve algún dato. Para devolverlo simplemente tienes que utilizar la palabra «return» al final de la implementación de la función y al lado escribir el nombre de la variable que guarda el dato que quieres devolver. «medirDistancia()» es un ejemplo de esto mismo. 

Cómo llamar funciones en Arduino

Para llamar a una función creada por ti se hace exactamente igual que cuando llamas a una función ya incorporada en el propio lenguaje de programación, como por ejemplo «digitalWrite() o delay()». 

En caso de que sea una función que devuelve un dato, como «medirDistancia()», tienes que igualarla a una variable del mismo tipo para que almacene el dato devuelto. Si es una función de tipo void no hace falta igualarla a nada, como es el caso de «alerta()».

Con el programa de ejemplo, lo que hago es medir la distancia con la función que he creado. Compruebo si la distancia medida es menor que 15 centímetros con una sentencia If. En caso de ser así, llamo a la función «alerta()» para que me avise.

const int EchoPin = 5;
const int TriggerPin = 6;
const int LED = 13;

double distance = 0;

//Prototipos de las funciones
void alerta(int led);
double medirDistancia();

 
void setup() {
   Serial.begin(9600);
   pinMode(TriggerPin, OUTPUT);
   pinMode(EchoPin, INPUT);
   pinMode(LED, OUTPUT);
}
 
void loop() {   
   //Enviamos onda de ultrasonidos
   distance = medirDistancia();   //Llama a medirDistancia
   if(distance <= 15){
    alerta(LED);    //Llama a alerta
   }

   //Mostramos la distancia por el puerto serie
   Serial.print("Distancia: ");
   Serial.println(distance);
   delay(500);
}

//Alerta: hace parpadear un led 3 veces
void alerta(int led){
  digitalWrite(led, HIGH);
  delay(200);
  digitalWrite(led, LOW);
  delay(200);
  digitalWrite(led, HIGH);
  delay(200);
  digitalWrite(led, LOW);
  delay(200);
  digitalWrite(led, HIGH);
  delay(200);
  digitalWrite(led, LOW);
  delay(200);
}

//medirDistancia: mide la distancia con un sensor de ultrasonidos
double medirDistancia(){
   double distancia = 0;
   double duracion = 0;
   digitalWrite(TriggerPin, LOW);
   delayMicroseconds(4);
   digitalWrite(TriggerPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(TriggerPin, LOW);

   //Mide el tiempo entre pulsos (microsegundos)
   duracion = pulseIn(EchoPin, HIGH)/2;

   //Pasamos de tiempo a distancia (cm)
   distancia = duracion /29.2;
   return distancia;
}

Repaso de varias funciones en Arduino - Las más utilizadas

Como ya sabrás, aparte de las funciones de usuario, que son las que tu mismo creas, Arduino incluye funciones ya creadas que puedes utilizar en tus programas. Vamos a recordar 3 de ellas que pueden serte de mucha utilidad.

Función map

La función map básicamente mapea un número de un rango a otro. ¿Qué significa esto? Imagina que estás leyendo una entrada analógica. Los valores que recibes van de 0 a 1023. Teniendo en cuenta el rango anterior, qué ocurre si tu quieres saber cual sería el equivalente de 521 en un rango de 0 a 256. 

La solución a esta pregunta te la da la función map, la cual te devuelve el valor equivalente. Aquí puedes ver cómo es su sintaxis y el ejemplo anterior expresado en código. 

//Sintáxis: map(value, fromLow, fromHigh, toLow, toHigh);
numEquivalente = map(521, 0, 1023, 0, 255);

Funciones millis y micros

Las funciones micros y millis en Arduino te devuelven el tiempo que ha pasado desde que la placa empezó a ejecutar el último programa que le has subido. La función millis, como su propio nombre indica, lo hace en milisegundos, y micros en microsegundos. El tiempo contado se resetea a 0 cuando llega aproximadamente a 50 días para millis y 70 minutos para micros.  

time1 = millis();
time2 = micros();

Función delay

La función delay detiene el programa el tiempo que tu necesites. Este tiempo lo tienes que especificar en milisegundos como parámetro de la función. Aquí puedes ver un ejemplo llamando a «delay()». 

delay(2000); //Pausa el programa durante 2 segundos

Función random

Random genera números pseudo-aleatorios entre un rango de números que tu especificas como parámetros de la función.

//Sintáxis: random(min, max);
numAleatorio = random(0, 100);

Te dejo aquí el enlace a la documentación de Arduino donde puedes encontrar la explicación de todas las funciones: Guía de referencia de Arduino.

Funciones de usuario en Arduino - Conclusión

Desde mi punto de vista, este es el concepto de programación más complicado que hemos visto hasta el momento. Si al principio te cuesta entenderlo y aplicarlo, no te preocupes y tomate tu tiempo. Crear tus propias funciones en Arduino no es difícil cuando tienes práctica, pero al principio puede costar. ¡Practica mucho y verás como acabarás haciéndolo fácilmente!