[AUDIO EN BLANCO] Hola, seguimos con la última clase de la lección 2 donde vamos a ver operaciones aritméticas y funciones con retorno. Las operaciones aritméticas disponibles en Arduino son bastantes, las más típicas, algunas las hemos usado ahora las vamos a ver un poco más formalmente pero no vamos a entrar en demasiado detalle es el operador igual, que me sirve como ya habíamos visto para asignar variables y por supuesto tengo disponible la suma, la resta, multiplicación y división. Hay otros operadores que se llaman los operadores compuestos que pueden ser un tanto extraños y no lo vamos a ver todos pero se los mostramos aquí para que por si se encuentran con alguno de estos operadores en un código, sepan qué son y puedan ir a la referencia de Arduino y ver exactamente qué hacen. Por ejemplo este A+=, qué pasa si ustedes ven en un código A += 3, eso significa A = A + 3 y en términos prácticos el resultado del mismo tiene algunas diferencias en cuanto a la eficiencia de código que nosotros no nos vamos a preocupar de eso, como les digo se los mostramos solo para que si lo ven en alguna parte sepan qué son. Lo que sí nos interesan son estos dos, que es el ++ y el --. Qué pasa si yo aquí tengo A ++, si tengo A++ eso es equivalente a decir A = A + 1, es decir A++ simplemente aumenta A en 1. Pero tiene una particularidad, que si es que yo lo uso en alguna parte del código por ejemplo si uso un digital write. [AUDIO EN BLANCO] Y pongo aquí A++, low por ejemplo, supongamos que tengo un pin que es A que es el pin 7 si es que yo escribo esto, voy a escribir en el pin 7 el valor low y después le voy a sumar 1 a A. Entonces eso es un poco confuso, lo vamos a entender cuando veamos ejemplos pero quédense con solamente estos dos operadores en la cabeza, estos los vamos a usar solamente si se encuentran con ellos en un código. Ahora vamos a ver más funciones, ya hemos visto un poco funciones como una caja negra que hace algo, ahora la función tiene un retorno. ¿Qué significa que tiene un retorno? La función además entrega una respuesta. Por lo tanto esta misma caja negra hace algo que todavía no sabemos cómo lo hace, sabemos qué hace pero además me entrega una respuesta y esta respuesta tiene un tipo definido, por ejemplo me entrega un número entero, me entrega un double, me entrega un string y puede ser asignado a una variable y por eso son de gran utilidad. Entonces, ¿cómo funciona esto? Tenemos un diagrama similar al que vimos antes, tenemos que la función está identificada por un nombre, recibe parámetros, yo tengo que conocer necesariamente el nombre de la función y qué parámetros darle y además ahora me entrega una respuesta, por lo tanto yo asigno esa respuesta a una variable y esta variable está definida previamente y tiene un tipo y este tipo tiene que ser consistente con el tipo que me entrega esta función. Entonces mi función si es una caja negra recibe parámetros, hace algo pero además entrega una respuesta. Y ya habíamos visto algo así cuando usamos digital read. Lo vemos antes con un ejemplo ahora lo vemos con más formalidad, al usar digital read lo que hacíamos era ver un valor digital que estaba en la entrada y almacenarlo en una variable de tipo entero. Entonces es lo mismo pero por supuesto esto es bastante más genérico. Entonces veamos algunas de las funciones matemáticas que tiene Arduino que son de hecho funciones con retorno. Tenemos varios tipos de funciones que aceptan cualquier tipo de variable y entregan otra variable del mismo tipo, entonces son operaciones, son opciones matemáticas pero aceptan cualquier tipo de variables, o sea yo podría si quisiera hacer una operación matemática sobre un char, por ejemplo. Tiene más sentido operar sobre enteros pero de hecho en el ejemplo anterior ya operamos sobre un char cuando teníamos el índice y lo ibamos aumentado en 1 y recordemos de esa forma toda la tabla de caracteres. De la misma forma yo puedo operar con cualquier tipo de variable, pero insisto tiene más sentido normalmemte operar sobre variables que representen números. Por ejemplo tenemos las funciones mínimo y máximo que me entregan el mínimo entre dos números, por ejemplo yo le entrego x e y y me devuelve el valor mínimo de los dos. De la misma forma el máximo son funciones similares, también podemos calcular valor absoluto de un número, podemos limitar una variable a un cierto rango, interesante porque qué pasa si aquí yo quiero limitar una variable entre 3 y 7. Bueno qué pasa si x vale 4, entonces a1 es 3, b1 es 7, x vale 4 esto me entrega 4 porque 4 está entre 3 y 7, si x vale 0 esto me va a entregar 3, si x vale más de 7 por ejemplo 9, esto me va a entregar 7. Esto va a ser muy útil cuando empecemos a comunicarnos por ejemplo con periféricos. Y por último tenemos la función map que reescala una variable x según esta regla definida por a1, b1 a2, b2. No vamos a entrar en detalle, lo vamos a ver más adelante en un ejemplo pero pueden ver la información al respecto en la página de Arduino. Hay otras funciones matemáticas que están hechas específicamente para utilizar double que son estas que presentamos acá. Son funciones que permiten calcular potencias, raíz cuadrada y funciones trigonométricas y estas funciones vienen a implementarse en Arduino. La particularidad que tienen es que sus input son de tipo float y el retorno es de tipo double. Como mencionamos al principio el double y el float en la mayoría de los procesadores Arduino son los mismos, sobre todo para los efectos prácticos tanto el input como el output podemos considerarlo de tipo float. Entonces estas funciones me permiten hacer cálculos complicados pero hay que tener cuidado porque son más lentas. Al hacer operaciones tenemos que tener algunas consideraciones particulares. Por ejemplo si se excede el rango de una variable, la variable se da la vuelta. ¿Cómo es esto? Recordemos que los int pueden ir desde menos 32768 hasta 32767. Entonces qué pasa si yo intento asignar un valor 32768 en una variable de tipo int. Es 1 más que el valor máximo, por lo tanto lo que va a pasar es que en vez de almacenarse el valor que yo quise, esto se va a dar toda la vuelta y va a almacenarse su valor mínimo. De la misma forma con un int sin signo que van desde 0 hasta 65535. ¿Qué pasa si yo quiero asignar el valor 65536? Lo mismo, es 1 más que el valor máximo permitido y se devuelve a 0. ¿Qué pasa si quiero asignar 65537? Voy a obtener el valor 1 y así, si me excedo de un valor me doy toda la vuelta y empiezo desde el principio. La otra consideración importante que hay que tener es que si se usan números enteros el valor se trunca, por lo tanto si es que yo divido 5 dividido 2, voy a obtener 2 y no 2.5. Entonces para estos casos si es que yo quiero ese nivel de precisión, si es que yo quiero hacer cálculos matemáticos y obtener el resultado correcto, voy a tener que usar números float pero los números float usan más espacio en memoria y los cálculos son más lentos. Por tanto, yo puedo elegir usar float o puedo intentar realizar el cálculo de otra forma y calcular por ejemplo en decimal como lo mencionamos antes con el operador mode y eso me da 1 y después yo combinar con una forma esos dos. Entonces aquí siempre hay un trade off entre el tiempo que demora, el espacio que usan los cálculos y el tema de la precisión de las variables si están truncadas o no están truncadas. Esto es todo por hoy día, nos vemos en la siguiente lección. Muchas gracias.