Introducción
El MLX90614 es un sensor de temperatura infrarrojo sin de contacto fabricado por la empresa Melexis. Es posible conectar estos sensores con un autómata o procesador como Arduino para medir la temperatura de un objeto a distancia.
Existen distintos modelos del MLX90614 cada uno con un sufijo de tres letras. Los diferentes sensores difieren en el voltaje de operación, el numero de sensores infrarrojos, y la posición del filtro.
La comunicación se realiza a través de SMBus, un subconjunto de bus I2C, por lo que resulta sencilla su lectura, y es posible conectar más de un sensor de forma simultáneamente.
Frecuentemente se encuentran termómetros MLX90614 integrados en módulos como la GY-906 que incorporan la electrónica necesaria para conectarla de forma sencilla a un Arduino. En la mayoría de los módulos, esto incluye un regulador de voltaje que permite alimentar directamente a 5V.
Este tipo de termómetros infrarrojos tienen un gran número de aplicaciones, incluyendo sistemas de control de temperatura en instalaciones térmicas en edificios, control industrial de temperatura, detección de movimiento, y aplicaciones de salud.
¿Cómo funciona el MLX90614?
Según la ley de Stefan-Boltzmann, todo objeto por encima del cero absoluto (ºK) emite radiación cuyo espectro es proporcional a su temperatura. El MLX90614 recoge esta radiación y su salida es una señal eléctrica proporcional a la temperatura de todos los objetos en su campo de visión.
Internamente el MLX90614 está constituido con un chip de silicio con una fina membrana micromecanizada sensible a la radiación infrarroja, junto con la electrónica necesaria para amplificar y digitalizar la señal y calcular la temperatura.
El conjunto incluye un amplificador de bajo ruido, un conversor ADC de 17 bits, un DSP (procesador digital de señal) y compensación de la temperatura ambiente.
El MLX90614 viene calibrado de fábrica en un amplio rango de temperaturas: -40 a 85 °C para la temperatura ambiente y -70 a 382 °C para la temperatura de objetos. La precisión estándar es de 0.5 °C referente a la temperatura ambiente, aunque existen versiones médicas que ofrecen una resolución de 0.1ºC en temperaturas entre 35-38ºC.
El MLX90614 dispone de dos modos de salida. La estándar es SMBus, un conjunto del I2C, con una resolución de 0.02ºC. También puede emplear una salida PWM de 10 bits para mediciones continuas, aunque con menor resolución 0.14ºC.
Es importante tener en cuenta la lectura del sensor solo es estable cuando el sensor se encuentra en equilibrio térmico con el ambiente. También puede afectarle la suciedad en la ventana del sensor.
También es importante entender que el MLX90614 es sensible a todos los objetos ubicados en su campo de visión. El ángulo de visión depende del modelo, y varía desde 5º a 80ºC. En el ángulo más amplio de 80º, el área de medición a 0.5 tiene un diámetro de 0.83 metros
Es decir, los modelos de menos ángulo son apropiados para medidas puntuales en frente del sensor. Los sensores de ángulo amplio están diseñados para detectar incrementos de temperatura en una gran zona, por ejemplo, para detección de fallas en maquinaria.
Esquema de Montaje
La conexión es sencilla, simplemente alimentamos el módulo desde Arduino mediante GND y 5V y conectamos el pin SDA y SCL de Arduino con los pines correspondientes del sensor.
Mientras que la conexión vista desde el lado de Arduino quedaría así.
Verificar que vuestra placa es compatible con 5V antes de conectarla a Arduino. Si no, tendréis que usar un adaptador de nivel lógico.
Código de ejemplo
Para realizar la lectura del MLX90614 usaremos la librería desarrollada por Sparkfun, disponible en este enlace.
La librería proporciona ejemplos de código, que resulta aconsejable revisar. El siguiente ejemplo es una modificación a partir de los disponibles en la librería, que realiza la lectura del sensor y muestra los resultados por puerto serie.
#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
void setup() {
Serial.begin(9600);
mlx.begin();
}
void loop() {
Serial.print("Ambiente = ");
Serial.print(mlx.readAmbientTempC());
Serial.print("ºC\tObjeto = ");
Serial.print(mlx.readObjectTempC());
Serial.println("ºC");
delay(500);
}