Transformar el valor bruto en porcentaje

Los resultados obtenidos en el apartado anterior nos permiten hacernos una idea de cómo funciona el sensor y cómo la cantidad de radiación infrarroja cambia en diferentes situaciones. Pero, para ser sinceros, no son unos valores muy descriptivos… ¿No sería mucho mejor poder leer el resultado como un porcentaje? Así 0 % querría decir “Nada de radiación infrarroja” y 100 % sería la máxima radiación que el sensor puede medir. Afortunadamente Arduino tiene una función que nos permite conseguir esto de manera muy sencilla: la función map. Prueba este código que utiliza la función map y muestra la cantidad de radiación infrarroja como un porcentaje:

const int sensor = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(sensor);
  int percentage = map(sensorValue, 0, 1023, 100, 0);

  Serial.print("IR radiation: ");
  Serial.print(percentage);
  Serial.println(" %");

  delay(1000);
}

Este es el significado de cada una de las líneas de código:

const int sensor = 0;

Con esta instrucción, que hemos colocado antes de la función setup, estamos definiendo un valor constante (de ahí la palabra const) que podemos usar más tarde en el programa. De este modo, cada vez que utilicemos la palabra sensor, esta será sustituida automáticamente por el valor que le hemos asignado, en este caso 0 (que es el pin analógico al que hemos conectado el sensor).

void setup() {
  Serial.begin(9600);
}

En la función setup inicializamos la comunicación serie a 9600 bits de datos por segundo.

void loop() {

Empieza la función loop.

int sensorValue = analogRead(sensor);

Esta instrucción crea una variable entera, llamada sensorValue, y le asigna el valor que ha leído el sensor. Recuerda que sensor es una constante que hemos creado en la primera instrucción del sketch con el valor 0, así que analogRead(sensor) es equivalente a analogRead(0).

int percentage = map(sensorValue, 0, 1023, 100, 0);

En primer lugar creamos la variable percentage, que contendrá valores enteros. En ella almacenaremos los valores medidos por el sensor expresados en tanto por ciento.

Para expresar los valores brutos leídos por el sensor en porcentaje usamos la función map, que transforma los números dentro de un rango de valores en los correspondientes en otro rango diferente. La sintaxis de esta función es la siguiente: map(value, fromLow, fromHigh, toLow, toHigh). El primer argumento, value, se refiere a la variable que queremos transformar; fromLow y fromHigh son, respectivamente, los límites inferior y superior del rango original en que están los valores de la variable, y toLow y toHigh se refieren a los límites del nuevo rango al que queremos transformar los datos. En nuestro caso, con map(sensorValue, 0, 1023, 100, 0) transformamos cada valor de la variable sensorValue, que está entre 0 y 1023, en un nuevo valor en el rango 0-100, de manera que el valor 0 del sensor se corresponde con un 100 % de radiación y el valor 1023 se corresponde con un 0 % de radiación.

Serial.print("IR radiation: ");
Serial.print(percentage);
Serial.println(" %");

Para presentar los datos en el monitor serie estamos usando dos funciones muy similares: print y println. La única diferencia entre ellas es que println introduce un salto de línea después de escribir el valor que está entre los paréntesis, mientras que la instrucción print no lo hace.

Hay otra cuestión importante en estas líneas de código. ¿Te has fijado en que los argumentos de las instrucciones primera y tercera están entrecomillados, mientras que el argumento de la segunda instrucción no lleva comillas? Las comillas indican que la función print va a imprimir una cadena de caracteres, es decir, el texto se imprime tal cual está. Sin embargo, al no utilizar comillas el argumento que le pasamos a la función print es una variable, por lo tanto lo que imprime es su valor.

delay(1000);
}

El programa espera un segundo antes de volver a la línea inicial de la función loop.

Al subir el programa a la placa el resultado será similar al siguiente:

Last updated