Problema
Usted quiere saber cómo añadir funciones a un Sketch, y la cantidad correcto de
funcionalidad a ir en sus funciones. Usted también quiere entender cómo planificar la
estructura global del Sketch.
Solución
Las funciones son usadas para organizar las acciones realizadas por su Sketch en bloques
funcionales. Las Funciones empaquetan funcionalmente en bien definidas entradas
(Información dado a una función) y salidas (Información prevista por una función) que
hacen fácil estructurar, almacenar, y reutilizar su código. Usted ya está familiarizado con
las dos funciones que están en cada Sketch Arduino: void y loop. Usted crea una función
declarando su tipo de retorno (La información que proporciona), su nombre, y cualquier
parámetro opcional (Los valores) que la función recibirá cuando es llamada.
45
Los términos funciones y métodos son usados para referirse a bloques bien definidos de código que puede ser llamado como una sola entidad por otras regiones de un programa. El lenguaje C se refiere a estos como funciones. Lenguajes orientados a objetos como C + + que exponen funcionalidad a través de clases tienden a utilizar el término método. Arduino usa una mezcla de estilos (La Sketches ejemplo tienden a utilizar estilo C-like, las librerias tienden a ser escritas a exponiendo métodos de clase C++). En este libro, el término función es usado usualmente a menos que el código sea expuesto a través de una clase. No se preocupe; si esos terminos no son claros para usted, trate ambos terminos como el misma.
Aquí hay una simple función que sólo parpadea un LED. Esta no tiene parámetros y no devuelve nada (La anterior funcion void indica que nada será devuelto):
// parpadear un led una vez LED blink1 ()
{
digitalWrite (13, HIGH); // encender el LED delay (500); // esperar 500 milisegundos digitalWrite (13, LOW); // apagar el LED delay (500); // esperar 500 milisegundos }
La siguiente versión tiene un parámetro (El entero llamado count) que determina cuántos veces el LED parpadea:
// Parpadear un LED el número de veces determinado en el parámetro count void blink2(int count)
{
while (count > 0) // repetición hasta que la cuenta ya no sea mayor que cero {
digitalWrite (13, HIGH); delay (500);
digitalWrite (13, LOW); delay (500);
count = count -1; // decrementa el count }
}
Programadores experimentados notarán que ambas funciones podría ser parpadear porque la compilador diferenciará estos por el tipo de valores utilizados para la parámetro. Este comportamiento es llamada función sobrecargada. La Arduino
print discutida en la Receta4.2 es un común ejemplo. Otro ejemplo de sobrecarga es en la discusión de la Receta4.6.
Esa versión revisa para ver si el valor de count es 0. Si no, esta parpadea el LED y luego reduceelvalordecount de a uno. Esteserárepetidohasta quecount no seamayor que0.
46
Un parámetro es a veces referido como un argumento en algunas documentaciones. Por prácticos propósitos, usted puede tratar estos términos como si significaran lo mismo.
Aquí hay un Sketch ejemplo que toma un parámetro y retorna un valor. El parámetro determina la longitud del tiempo del LED encendido y apagado (En milisegundos). La función continúa parpadeando el LED hasta que un botón es presionado, y la número de veces que el LED parpadeo es devuelto desde la función:
/*
blink3 sketch
Demuestra llamando a una función con un parámetro y devolviendo un valor. Utiliza el mismo cableado que el sketch de pull-up de la Receta 5.2
El LED parpadea cuando el programa se inicia y se detiene cuando se pulsa un interruptor conectado al pin digital 2.
El programa imprime el número de veces que el LED parpadea. * /
const int ledPin = 13; // pin de salida para el LED
const int InputPin = 2 // pin de entrada para el interruptor; void setup () {
pinMode (ledPin, OUTPUT); pinMode (InputPin, INPUT);
digitalWrite (InputPin, HIGH); // Uso resistencia interna pull-up (Receta 5.2) Serial.begin (9600);
}
void loop () {
Serial.println ("Pulse y mantenga pulsado el interruptor para detener el parpadeo"); int cuenta = blink3 (250) // parpadear el 250 ms LED encendido y 250 ms
apagado Serial.print ("El número de veces que el conmutador parpadeó fue"); Serial.println (cuenta);
}
// Parpadear un LED utilizando el período de retardo dado // Devuelve el número de veces que el LED destellaba int blink3 (int período)
{
int resultado = 0;
int switchVal = ALTO // con pull-ups, esta será alta cuando el interruptor está hacia arriba
while(switchVal == HIGH) // repetir este bucle hasta que se pulse el interruptor // (esta será baja cuando se pulsa)
{
digitalWrite (13, HIGH); delay(período);
digitalWrite (13, LOW); delay(período);
47
switchVal = digitalRead (InputPin); // lee el valor de entrada }
// Aquí switchVal ya no es alto porque el interruptor se presiona return resultado; // se devolverá este valor
}
Discusión
Elcódigoenestareceta deSoluciónilustralas tresformasdefunciónllamarqueusted se encontrará.blink1tieneno tieneparámetro ynoretornavalor.Su formaes:
void blink1 () {
/ / Código de aplicación va aquí ... }
blink2tomaunsoloparámetroperonoretornaunValor:
void blink2 (int count) {
/ / Código de aplicación va aquí ... }
blink3tieneunsoloparámetroyretornaunValor:
int blink3 (int período) {
// Código de aplicación va aquí ... }
El tipo de dato que precede el nombre de la función indica el tipo de retorno (no retorna si es void). Cuando declara la función (Escribirndo el código que define la función y su acción), usted no pone un punto y coma siguido al paréntesis al final. Cuando utiliza la función (Call), usted no necesita un punto y coma al final de la línea que llama la función.
La mayor parte de la funciones que se encontrará serán algunas variantes de estas formas. Por ejemplo, aquí hay una función que toma un parámetro y retorna un Valor:
int sensorPercent(int pin) {
int percent;
int val = analogRead(pin) // leer el sensor (rangos de 0 a 1023)
percent=map(val, 0,1023,0,100);//percentirádesde 0a100. returnpercent;
}
La el nombre de la función es sensorPercent. Esta da un número de pin analógico para leer y devuelve el valor como un porcentaje (Véase la Receta5.7 para más sobre analogRead y map). El
int en frente de la declaración dice al compilador (Y recuerda al programador) que la función retornará un número entero. Al crear funciones, elegir el tipo de retorno apropiado a la acción que la función realiza. Esta función retorna un valor entero de 0 a 100, así un tipo de retorno int es apropiado.
48
Es recomendado que de sus funciones nombres significativos, y es una práctica común combinar palabras escribiendo con mayúscula la primera letra de cada palabra, excepto para la primera palabra. Use cualquier estilo que prefiera, pero esto ayuda a otros que lean su código si usted conserva su estilo de nombramiento consistente.
sensorPercent tiene un parámetro llamado pin (Cuando la función es llamada, pin es da el valor que es pasado a la función).
cuerpo de la función (La código dentro de los paréntesis) realiza la acción quiere que lea un valor desde un pin de entrada analógica y lo convierta a un porcentaje. En el anterior ejemplo, el porcentaje es temporalmente almacenado en una variable llamada percent. La siguiente declaración causa que el valor almacenado en la variable temporal percent sea regresado a la aplicación llamada:
return percent;
Lamismafuncionalidad puedeser alcanzadasin usolavariable temporalpercent:
int sensorPercent(int pin) {
int val = analogRead (pin) // leer el sensor (rangos de 0 a 1023) return map(val, 0,1023,0,100);// percent irá
desde0a100. }
Aquíescómolafunción puedeser llamada:
// Imprimir el valor del porcentaje de 6 pines analógicos for int sensorPin = 0; sensorPin <6; sensorPin + +) {
Serial.print("Porcentaje de sensor en el pin"); Serial.print(sensorPin);
Serial.print("es");
int val = sensorPercent (sensorPin); Serial.print(val);
}