[AUDIO EN BLANCO] Hola, bienvenidos a la última lección de este módulo, donde vamos a hablar un poco más sobre funciones. Vamos a partir hablando de funciones en particular y después vamos a ver estos 2 tipos de funciones que son un poco especiales, que son las interrupciones, las funciones de interfaz analógica. Entonces, ya hemos visto cómo se usan las funciones. Ya sabemos que necesitamos saber, por ejemplo, el nombre, que necesitamos saber los parámetros. Sabemos que pueden tener algún tipo de retorno y que hacen algo. Pero ahora aprenderemos la estructura interna de la función. ¿Cómo crear nuestras propias funciones? ¿Cuál es la sintaxis? ¿Qué es lo que hacen las funciones internamente? Entonces, volvamos a nuestro esquema. Nosotros tenemos una función, la llamamos función ejemplo, que es una caja negra. Recibe parámetros y tiene algún tipo de retorno. Y además puede hacer alguna acción. Entonces, ¿cómo yo la llamo? Yo la llamo por el nombre función ejemplo, le entrego estos 2 parámetros, pueden ser más, puede no recibir parámetros, y la función me entrega un retorno, que yo asigno a una variable, que tiene que ser consistente con el tipo. Ahora, ¿cómo yo creo esta función ejemplo? Yo necesito saber la sintaxis. ¿Cómo creo una función? De esta forma. Esta declaración que está acá, se escribe fuera del loop y el setup. Sino que se escribe fuera de cualquier otra función. ¿Y cómo funciona? Yo tengo que asignar un tipo. ¿Recuerdan que la función tiene un retorno y ese retorno tiene un tipo? Bueno, ese tipo está declarado acá. Esta función ejemplo tiene un retorno que puede ser un int, un stream, cualquiera, y además recibe parámetros, por ejemplo, esta función recibe 2 parámetros, pero no cualquier parámetro. Los parámetros tienen un tipo que también está determinado y está determinado en el momento en que yo declaro la función, al igual que su retorno. Por tanto, si volvemos atrás, nosotros llamamos a una función, conocemos su nombre, le damos 2 parámetros, esos 2 parámetros tienen que ser del tipo que la función tiene determinado en su declaración. Y además de eso, la función no es nada más que una porción de códigos encerrados entre 2 corchetes. O sea, yo solamente tengo que declarar la función y dentro de esa función yo hago algo. Por ejemplo, puedo imprimir la consola, puedo cambiar la salida de un pin, en fin, puedo hacer prácticamente cualquier cosa dentro de una función y esta es la forma de implementarlo. Y finalmente, yo termino la función con este comando que es return, que es básicamente entrega la respuesta, donde respuesta, por supuesto tiene que ser alguna variable, consistente con el tipo de mi función. Entonces, esto es lo que necesitamos saber para declarar una función. Ahora por supuesto, vamos a ver un ejemplo donde quede un poco más claro la declaración y el uso de una función. Entonces, veamos, a ver, tengo void como siempre, tengo loop, como siempre, pero ahora, además, tengo esta función ejemplo, que está fuera de loop, y está fuera de void, aquí no se ve pero el corchete de loop está aquí. Entonces fuera de loop y fuera de void, yo tengo esta declaración. ¿Qué dice? Int función ejemplo. Entonces, el tipo de retorno es int. El nombre es función ejemplo y recibe 2 parámetros x e y, que son números enteros. Bien. Después entra la función, que llega de aquí, hasta acá y ¿qué hace? Crea una variable que se llama z y después si es que x es mayor que cero, o sea, si el primer parámetro es mayor que cero, z vale 2 veces el segundo parámetro. O sea, a ver, si yo graficara esto, este es y este es z, y si es que x es menor que cero, tengo que z es igual a [INAUDIBLE] si es que x es mayor que 0, tengo que z es igual a 2 veces y. Si no, z es igual y. Z igual, esta es para x mayor que cero, esta es para x menor o igual a cero. Eso es básicamente lo que hace mi función. Es una función donde z toma uno un otro valor, dependiendo del valor de x. Entonces intentemos ahora predecir, y por supuesto, el retorno de esta función es z que es correcto porque es un entero, como lo exige la declaración de la función. Por tanto esta función en cuanto a sintaxis está correcta. Intentemos predecir los resultados. Entonces, a ver, primero, como siempre, iniciamos la consola serial y enviamos el comando empezamos. Esto ya lo hemos visto muchas veces, no tenemos problema para entenderlo. ¿Qué viene después? Yo tengo 3 variables, la variable a que vale menos 2, la variable b que vale 3 y una variable c, que todavía no tiene valor. Entonces, vamos al loop, y lo primero que hace es función ejemplo a más más coma b. Y a más más lo hemos visto antes. Por lo tanto, ¿qué pasa con a más más? Primero evalúa y después le suma 1. Entonces yo llamo a la función ejemplo, con el parámetro menos 2 coma 3. Entonces x internamente, vamos a borrar aquí. entonces mi función recibe un x que vale menos 2, y un y que vale 3. Por tanto, ¿cuál va a ser la respuesta? Z va a ser, directamente, y, o sea, es decir, va a ser 3. Entonces c vale 3 y en este momento a aumenta a menos 1 y c tiene un valor de 3. Yo imprimo c, por tanto lo primero que imprimo es 3. Se acaba el loop, vuelve al principio. Llamo a la función ejemplo con menos 1 y 3. Nuevamente z vale 3, mi retorno es 3, a aumenta a cero e imprimo 3 por segunda vez. Salgo del loop, vuelvo para acá. A más más coma b. Entonces x ahora vale el valor de a, vale cero, b sigue valiendo 3. ¿Es x mayor que cero? No, x es igual a cero, por lo tanto entro aquí nuevamente y c nuevamente vale 3. En este momento, c vale 3 y ya pasa a valer 1. Sigo por acá, imprimo el 3. Espero un segundo, vuelvo aquí, ahora sí que el valor x igual a 1, ahora x igual 1, por tanto entro acá, ahora z vale 6, entonces cuando salgo de la función, c vale 6 y el a aumenta a 1 por a más más y de aquí en adelante imprimo 6 y siempre que voy a entrar en esta función voy a seguir imprimiendo 6 porque a solo va a solo va seguir creciendo y infinitamente voy a estar imprimiendo el número 6. Este ejemplo puede ser un poco aburrido, pero sirve para expresar exactamente cómo la secuencia, y algo súper relevante, que estas variables x e y son diferentes de a y b. Si es que yo aquí, por ejemplo, modifico x, a no se va a modificar, esto hay que tenerlo súper claro. Las variables, yo recibo a y b, pero la función trabaja con variables locales, que son x e y, que copian el valor de a, copian el valor de b, pero que después, si yo modifico x e y, no modifican a y b, esto hay que tenerlo súper claro. Y lo segundo es que todas las variables que yo cree dentro de mi función, solo existen dentro de mi función. Una vez que termino de ejecutar la función, por ejemplo, la variable z desaparece. Ahora yo por suerte no la pierdo porque la asigné a c. Pero supongamos que yo creo en alguna otra parte de aquí una variable que no doy como retorno en ninguna parte, esa variable la uso solamente dentro de la función y después desaparece. Entonces esas sutilezas las que hay que tener al momento de hacer funciones, como siempre, practiquen, traten de predecir el resultado y veamos efectivamente el resultado que habíamos predicho. Ahora hay un caso especial de funciones que son las funciones sin retorno. ¿Cómo se llama esto? Ya lo hicimos al principio, las primeras funciones que usamos no tienen retorno, solamente hacían algo. Entonces cuando una función no tiene retorno es igual que una función con retorno con la diferencia de que en vez de dar un tipo, se le llama void, suena familiar, void setup, void loop, son funciones sin retorno. Y lo demás se mantiene todo igual, reciben parámetros, los parámetros todavía necesitan un tipo, la función tiene un nombre, ejecutan un cierto código y no se entrega respuesta, opcionalmente, yo puedo poner return. No necesito ponerlo, puedo no ponerlo y simplemente cuando la función llega al final se va a acabar. Es importante mencionar que en cualquier función, con o sin retorno, si es que llega a return, la función se acaba. Por ejemplo, si es que yo tengo aquí código, tengo 5 líneas de código, y al final tengo return, no hay problema, se va a ejecutar mi código, finalmente esto, pero si esto, si yo tuviera un retorno más arriba, la función se ejecuta, llega a return y la función se acaba. Nunca se van a ejecutar las líneas de abajo. Por tanto tengan cuidado, si es que usan esto, función con retorno o función sin retorno, porque siempre cuando una función llega al momento de retorno, la función se acaba. Siempre tiene que ir al final o usarlo cuidadosamente para hacer un comando de escape. Pues vamos al ejemplo anterior, este de acá es muy similar, ¿cuál es la diferencia al ejemplo que acabamos de ver? A ver, la variable c no existe. Mi función ejemplo es igual. Hace lo mismo, pero ya no tiene retorno. Entonces, ¿cuál es la diferencia? A ver, y acá en vez de asignar la variable c, imprimo directamente el resultado acá. Entonces tengo un caso de una función que tiene de base exactamente lo mismo que hacía el otro programa, solamente que ahora mi función, en vez de devolverme el valor, imprime directamente el valor, y por tanto debería obtener el mismo resultado que tuvimos antes. Hagan el análisis paso a paso como lo hicimos antes y vean que van a llegar a lo mismo. Les imprime el número 3 3 veces y después imprime 6 indefinidamente. Eso es todo por este vídeo, muchas gracias.