Funciones en Arduino

En esta sesión vamos a realizar un sencillo proyecto donde utilizaremos componentes ya vistos anteriormente: una pantalla LCD, un sensor de temperatura, un potenciómetro y unos botones. Con todos ellos realizaremos un montaje que nos informará de la temperatura actual, máxima y mínima, a través de la pantalla. Si pulsamos uno de los dos botones nos dará la temperatura mínima y máxima desde el último encendido. Si pulsamos el otro botón resetearemos estos valores máximo y mínimo a la temperatura actual.

Podéis ver una foto del montaje a continuación

 

Pero la principal novedad en esta sesión es que vamos a introducir un concepto importante en cualquier lenguaje de programación: las funciones.

Una función es un conjunto de instrucciones que realizan una acción determinada. Esta función tendrá un nombre y podrá ser llamada desde otras partes del código tantas veces como sea necesario. Las funciones pueden recibir datos, denominados parámetros, que pueden ser manipulados en su interior. En ocasiones, esta función, además de ejecutar todas estas instrucciones, podrá devolver un valor final que pueda ser utilizado allí donde la función ha sido llamada.

Veamos un ejemplo. Supongamos que gracias al sensor ya tenemos la temperatura y está guardada en la variable actual. A continuación lo que queremos es mostrar en la pantalla LCD esta información. Para agrupar todas las instrucciones necesarias para sacar la información a través de la pantalla LCD creamos una función a la cual llamamos mostrarTempActual() y que ejecutaremos en alguna parte dentro de nuestra función principal loop(). Esta función recibirá como parámetro el valor de la variable actual. El código necesario para hacer la llamada a la función sería:

mostrarTempActual(actual);

A su vez, el código necesario para declarar esta función sería el siguiente:

void mostrarTempActual(float actual){

lcd.clear();

lcd.setCursor(0,0);

lcd.print("Temperatura actual:");

lcd.setCursor(0,1);

lcd.print(actual);

lcd.print(" C/");

}

La palabra reservada void indica que la función no devuelve ningún valor. El paso de parámetros, en este caso la variable actual, que es una variable de tipo float (número con decimales), siempre tienen que ir encerrados entre paréntesis.

Vamos a poner a continuación el código completo y posteriormente explicamos todas las funciones:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

float min = 0;
float max = 0;
void setup() {

//Podríamos haber hecho actual global, como min o max
float actual=0;

lcd.begin(16,2);
lcd.clear();

//Establezco un mínimo y máximo inicial a partir de la T actual

actual=obtenerTemp();
min=actual; max=actual;

pinMode (2,INPUT); //Botón para redefinir la T máxima y mínima
pinMode (3, INPUT); //Botón para mostrar la T máxima y mínima
}

void loop() {

float actual=0;
actual=obtenerTemp();

//Si la temperatura actual supera los límites, los redefino
if (actual<min) {
min = actual;
}

if (actual>max) {
max = actual;
}

mostrarTempActual(actual);
delay(100);

//Si pulso el botón de "reset"
if (digitalRead(2) == HIGH) {
min = actual;
max = actual;
}

//Si pulso el botón de mostrar máximo y mínimo
if (digitalRead(3) == HIGH) {
mostrarTempMin();
delay(3000);
mostrarTempMax();
delay(3000);
}

}
/*Función que obtiene directamente la temperatura a partir
del voltaje leído en la entrada del sensor TMP36 */

float obtenerTemp(){

return (((analogRead(5)*5.0)/1024)-0.5)*100;

}

/*Función que muestra la temperatura actual. Como actual es una
variable local de loop(), la tengo que pasar como parámetro. En
cambio, con max y min, al ser globales, eso no es necesario */

void mostrarTempActual(float actual){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatura actual:");
lcd.setCursor(0,1);
lcd.print(actual);
lcd.print(" C/");
}

//Función que muestra la temperatura mínima
void mostrarTempMin(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatura mínima:");
lcd.setCursor(0,1);
lcd.print(min);
lcd.print(" C/");
}

//Función que muestra la temperatura máxima

void mostrarTempMax(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatura máxima:");
lcd.setCursor(0,1);
lcd.print(max);
lcd.print(" C/");
}

Para empezar, podemos hablar de la función obtenerTemp():

float obtenerTemp(){

return (((analogRead(5)*5.0)/1024)-0.5)*100;

}

Esta función va a utilizar la fórmula ya comentada para transformar el voltaje del sensor de temperatura a grados centigrados. El sensor está conectado en la entrada analógica 5 de Arduino. Como podemos ver tenemos la palabra reservada return con la cual vamos a indicar que esta función va a devolver como salida un valor, de tipo float (número decimal), concretamente la temperatura en grados centígrados.

Por lo tanto, cada vez que ejecutamos esta instrucción:

actual=obtenerTemp();

estamos ejecutando la función obtenerTemp() con la instrucción que tiene en su interior, y el valor que devuelve la función lo almacenamos en la variable actual.

Las funciones TempActual(float actual)(), mostrarTempMin() y mostrarTempMin() son muy parecidas. Todas ellas se dedican a mostrar los valores de sus respectivas variables (actual, min y max) en el LCD. De hecho, la principal diferencia es que la función que visualiza la temperatura actual recibe como parámetro la variable actual. La otra diferencia es en el mensaje a visualizar como texto, que obviamente será diferente para cada uno de ellos.

Para finalizar, Pilar Calvo nos explica detalladamente todo el proceso del montaje y de la programación.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *