ARD-SYN 03 – Sintaxis (III). Aritmética

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

Arduino cuenta con una serie de funciones para la realización de cálculos matemáticos que pueden ser necesarios para la operativa del sketch. Elemental, querido Watson: ningún lenguaje de programación puede hacer nada si no implementa funcionalidades matemáticas y, desde luego, Arduino no es la excepción, aunque sí es cierto que sus capacidades de cálculo no son tantas y tan elaboradas como las de otros lenguajes en algunos aspectos, lo que implementa es suficiente para lo que está concebido.

En este artículo vamos a cotejar las funcionalidades aritméticas de Arduino.

LOS OPERADORES ARITMÉTICOS

Empezaremos por aquí, detallando los operadores que llevan a cabo operaciones elementales, como la suma o la división, antes de centrarnos en funciones más complejas.

EL OPERADOR DE ASIGNACIÓN =

Se emplea para asignar un valor a una variable. La asignación puede hacerse en la misma sentencia de la declaración (int pinDeLed = 7;) o puede hacerse (o rehacerse) después. Si una variable ya está declarada (por ejemplo, int temperatura;) podemos reasignarla en cualquier momento (por ejemplo, temperatura = 25; o temperatura = analogRead(sensorTermico);). El valor o expresión situado a la derecha del operador se asigna a la variable situada a la izquierda del mismo.

EL OPERADOR DE SUMA +

Se emplea para sumar dos o más valores o expresiones. El resultado puede, a su vez asignarse a una variable mediante el operador de asignación. Por ejemplo, podemos poner total = dato1 + dato 2 + dato3;. Esto sumaría los tres datos y asignaría el resultado a la variable llamada total. Hay que tener cuidado al declarar el tipo de variable. Debemos pensar si, durante la ejecución del script, la suma de valores puede llegar a exceder del límite que tenga el tipo de variable elegida. Por ejemplo. Si total se ha declarado como de tipo byte, dato1 vale 200, dato2 vale 70 y dato3 vale 150, se producirá un desbordamiento. Los resultados de un desbordamiento pueden ser impredecibles y, desde luego, nuestro sketch no funcionará como esperamos que lo haga. Estos errores son de difícil localización.

EL OPERADOR RESTA –

Se emplea para restar dos valores o expresiones. El resultado podemos, a su vez, asignarlo a una variable. Por ejemplo, total = dato1 - dato2;. Como en el caso anterior, es necesario tener en cuenta los tipos de variables y posibles resultados, para evitar desbordamientos. Esta advertencia es válida, en general para cualquier operación aritmética, por lo que no insistiremos sobre ella. Tenla presente en todos tus sketches.

EL OPERADOR PRODUCTO *

El asterisco se emplea para multiplicar dos o más valores o expresiones. El resultado puede ser usado directamente o asignado a una variable para su uso posterior. Por ejemplo total = dato1 * dato2;.

EL OPERADOR DIVISIÓN /

La barra inclinada, también conocida en el argot de la programación como slash, se emplea para dividir dos valores o expresiones. Por ejemplo, total = valor1 / valor 2;. Aparte de lo que ya sabemos del rango de variables, aquí hay que tener en cuenta una cosa más. El cociente de dos números enteros no tiene por que ser, a su vez, un número entero; puede ser fraccionario por lo que, aunque dividamos dos datos que sean enteros, la variable donde vamos a asignar el resultado debería ser de tipo float. De lo contrario, el resultado se truncará (perderá los decimales) o incluso, puede ser drásticamente distinto de lo esperado.

EL OPERADOR MÓDULO %

Se emplea para obtener el resto de una división. Por ejemplo, valor = 45 % 5;. Esto daría como resultado 0, ya que 45 dividido por 5 es 9 y el resto es 0. Si pusiéramos valor = 46 % 5; obtendríamos como resultado 1.

EL OPERADOR DE INCREMENTO ++

Podemos usar un doble signo más para indicarle a Arduino que debe incrementar el valor de una variable numérica en una unidad. Por ejemplo, la siguiente linea:

cantidad ++;

es equivalente a:

cantidad = cantidad + 1;

Hasta aquí creo que esté todo claro. No obstante, con el operador de incremento hay una cuestión de matiz. No es lo mismo ponerlo antes del nombre de variable (preincremento) que después (postincremento). Mira las siguientes líneas:

alfa = 10; // La variable alfa vale 10
beta = ++alfa; // Se incrementa alfa; pasa a valer 11. El valor se asigna a beta.
               // Ahora alfa y beta valen 11.

alfa = 10; // Ahora alfa vuelve a valer 10, y beta sigue valiendo 11.
beta = alfa++; // El valor actual de alfa (10) se asigna a beta, y luego se incrementa alfa,
               // que pasa a valer 11, pero beta ya tiene asignado el valor 10.

EL OPERADOR DE DECREMENTO —

Funciona del mismo modo que el anterior, pero referido a la reducción de un valor, en lugar de su aumento.

OPERADORES CON AUTOASIGNACIÓN

Existe una forma de simplificar la sintaxis de las operaciones aritméticas sencillas. Supongamos que queremos aumentar el valor de una variable en, digamos, cuatro unidades. Observa las siguientes líneas:

cantidad = 10;
cantidad = cantidad + 4; // La variable cantidad contiene 14.

Esto es equivalente:

cantidad = 10;
cantidad += 4; // La variable cantidad contiene 14.

Esta forma de usar un operador compuesto (seguido por el operador = de asignación) se conoce como operadores con autoasignación, y puede emplearse con las operaciones básicas. Así, los operadores de autoasignación con los que contamos en Arduino son los siguientes: +=, -=, *=, /=, y %=.

LAS FUNCIONES ARITMÉTICAS

Además de los operadores que hemos visto para realizar operaciones simples, Arduino cuenta con una serie de funciones que llevan a cabo determinadas operaciones aritméticas más complejas.

LA FUNCIÓN abs()

Se emplea para obtener el valor absoluto de un número o expresión. Esto quiere decir el valor sin signo. Es decir, que si ponemos valor = abs (3); obtendremos el mismo resultado que si escribimos valor = abs (-3);.

LA FUNCIÓN constrain()

Se emplea para “acotar” o “constreñir” una variable entre dos valores, uno mínimo y otro máximo. La sintaxis general es resultado = constrain (valor, minimo, maximo);. Esto quiere decir que si valor es mayor o igual que minimo, y, al mismo tiempo, menor o igual que maximo, la función nos devolverá valor; si es menor que minimo, nos devolverá minimo y si es mayor que maximo, nos devolverá maximo. Mira los siguientes ejemplos:

resultado = constrain (7, 3, 10); // Devuelve 7
resultado = constrain (7, 8, 10); // Devuelve 8
resultado = constrain (5, 2, 4); // Devuelve 4

LA FUNCIÓN cos()

Devuelve el coseno trigonométrico de un número. Por ejemplo, resultado = cos (82); devolvería 0.13917310096 (aproximadamente).

LA FUNCIÓN map()

Se emplea para mapear un valor, que está entre dos límites, obteniendo el resultado proporcional de otro valor que se encuentra entre dos límites diferentes. La sintaxis general es resultado = map(valor, desde_minimo, desde maximo, hasta_minimo, hasta_maximo);. Lo veremos más claro con un ejemplo:

resultado = map(lectura, 0, 1023, 0, 255); // Si lectura vale 300, el resultado será 75.

Para ver más claro el uso (a menudo muy necesario) de esta función, puedes echa un vistazo al artículo 05.

LA FUNCIÓN max();

Recibe, como argumentos, dos valores numéricos, y devuelve el mayor de ellos. Por ejemplo:

valor1 = 20;
valor2 = 50;
resultado = max(valor1, valor2); // Devuelve 50

LA FUNCIÓN min()

Lo has adivinado. Recibe, como argumentos, dos valores numéricos y devuelve el menor de ellos. Por ejemplo:

 valor1 = 20;
valor2 = 50;
resultado = max(valor1, valor2); // Devuelve 20

LA FUNCIÓN pow()

Calcula el resultado de elevar una base a un exponente. La sintaxis general es resultado = pow(base, exp);. Por ejemplo:

resultado = (6, 2); // Devuelve 36

LA FUNCIÓN randomSeed()

Se usa para establecer la semilla para la generación de números aleatorios, de forma que sean, realmente, aleatorios. La sintaxis general es randomSeed(n);, donde n es cualquier número entero positivo, de 1 en adelante (da igual el que pongas). Lo suyo es incluir esta función una sola vez en la sección setup de nuestro sketch.

LA FUNCIÓN random()

Una vez establecida una remilla, podemos generar los números aleatorios que necesitemos con esta función. Opera de distinto modo, según reciba uno o dos argumentos. Si recibe uno solo, se generará un aleatorio entere 0 y el argumento menos 1. Si recibe dos argumentos, el aleatorio se generará entre el primero y el segundo menos 1. Por ejemplo:

resultado = random (50); // Generará un aleatorio entero entre 0 y 49.
resultado = random (20, 50); // Generará un aleatorio entero entre 20 y 49.

Para facilitarte el uso, tienes un ejemplo en el artículo 12.

LA FUNCIÓN sin()

Calcula el seno trigonométrico de un número pasado como argumento. Por ejemplo:

resultado = sin (85); // Devuelve 0,996194698 (aproximadamente).

LA FUNCIÓN sqrt()

Calcula la raíz cuadrada del valor pasado cómo argumento. Es necesario tomar precauciones para evitar que el argumento sea negativo, ya que daría un error. Por ejemplo:

resultado = sqrt(9); // Deveulve 3.

LA FUNCIÓN tan()

Calcula la tangente trigonométrica de un valor pasado como argumento. Por ejemplo:

resultado = tan (27); // Devuelve 0,50952544949 (aproximadamente).

Con esto damos por cerrada la referencia de aritmética de Arduino. En el próximo artículo exploraremos las estructuras de control de flujo.

 

     

Deja un comentario

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