Hay veces que tenemos un valor expresado en una escala y queremos pasarla a otra. Por ejemplo uno de los casos más habituales es el calcular un porcentaje. Que pasamos un número expresado en una escala a otra que va de 0 a 100. En Arduino para pasar un valor de un rango o escala [in_min, in_max] a otro [out_min, out_max] podemos usar la función map.
long map(long x, long in_min, long in_max, long out_min, long out_max)
La función map toma 5 parámetros:
- x: Valor a transformar
- in_min: Valor más bajo de la escala origen
- in_max: Valor más alto de la escala origen
- out_min: Valor más bajo de la escala destino
- out_max: Valor más alto de la escala destino.
La función tiene la siguiente implementación interna:
long map(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Os habréis dado cuenta de que trabajo con long ¿Qué pasa si queremos otro tipo de datos?. Muy fácil, nos hacemos nosotros mismos la función:
float floatMap(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
double doubleMap(double x, double in_min, double in_max, double out_min, double out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Optimizar la función map
Ya que nos hemos puesto a crear nuestras funciones veamos como podemos optimizar los cálculos, si siempre tenemos que usar la función map con los mismos rango de números podemos crear nuestra versión personalizarla para que se ejecute más rápido. Es tan sencillo como sustituir los valores min y max de cada rango y simplificar. Veamoslo con un ejemplo, vamos a crearnos nuestro propio map que transforme de la escala de 0 a 1023 a otra escala de 0 a 255.
in: 0..1023 out: 0..255 int_min = 0 int_max = 1023 out_min = 0 out_max = 255
Reemplazamos:
long customMap(long x) {
return ((x - 0) * (255 - 0) / (1023 - 0)) + 0;
}
Simplificamos donde podamos:
long customMap(long x) {
return (x * 255) / 1023;
}
Ahora tenemos nuestra función personalizada que realiza solo dos operaciones. Como no es necesario pesarle los rangos usa solo un parámetro.
Pingback: Normalizar un valor entre 0 y 1en Arduino. | Construyendo a Chispas