Working Principle
The MLX90614 from Melexis is a non-contact infrared thermometer in a small TO-39 metal can. It contains two chips: an infrared thermopile detector and a signal-conditioning ASSP (Application-Specific Signal Processor). Every object above absolute zero emits infrared radiation proportional to its temperature (Stefan–Boltzmann law). The MLX90614 focuses this IR radiation onto its thermopile through a built-in optical filter, measures the resulting voltage, compensates for its own case temperature, and outputs the object temperature via I2C (SMBus) or PWM.
Analogy: Imagine pointing a digital camera at an object, but instead of capturing visible light, it measures the invisible heat glow and converts it to a temperature reading — all without touching the surface.
Electrical Characteristics
| Parameter | Value |
|---|---|
| Supply Voltage | 3.3 V (MLX90614xCx) or 5 V (MLX90614xAx) |
| Object Temperature Range | −70 to +380 °C |
| Ambient Temperature Range | −40 to +125 °C |
| Accuracy (Object) | ±0.5 °C (0 to +50 °C range) |
| Resolution | 0.02 °C |
| Field of View (FoV) | 90° (BAA), 35° (BCI), 10° (BCF) |
| Interface | I2C (SMBus) / PWM |
| Current Draw | ~1.5 mA |
| Response Time | ~100 ms |
Interfacing with an MCU
Connect SDA and SCL to the I2C bus with pull-up resistors (4.7 kΩ). Default I2C address is 0x5A. The sensor has two temperature outputs:
- Tambient: Internal die temperature (cold-junction reference)
- Tobject: Measured surface temperature via IR
Calibration
The MLX90614 is factory-calibrated against a black body radiator. For real-world accuracy:
- Emissivity setting: Default is 1.0 (black body). Reduce for shiny surfaces (e.g., polished metal ≈ 0.1–0.3). Write to the emissivity register via I2C.
- Distance-to-spot ratio: At 10 cm with 90° FoV, the measured spot is ~20 cm diameter. Ensure the target fills the FoV.
- Thermal settling: Allow 1–2 minutes after power-on for the sensor to reach thermal equilibrium.
Code Example
/*
* MLX90614 Non-Contact IR Thermometer — Arduino
* Requires: Adafruit MLX90614 library
* Wiring: SDA → A4, SCL → A5 (Arduino Uno), 3.3V, GND
*/
#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
void setup() {
Serial.begin(9600);
if (!mlx.begin()) {
Serial.println("MLX90614 not found!");
while (1);
}
Serial.println("MLX90614 IR Thermometer Ready");
Serial.print("Emissivity: ");
Serial.println(mlx.readEmissivity());
}
void loop() {
float ambientC = mlx.readAmbientTempC();
float objectC = mlx.readObjectTempC();
Serial.print("Ambient: ");
Serial.print(ambientC, 2);
Serial.print(" C | Object: ");
Serial.print(objectC, 2);
Serial.println(" C");
delay(500);
}
Real-World Applications
Medical Non-Contact Thermometry
The MLX90614 became globally recognised during the COVID-19 pandemic as the sensing element in non-contact forehead thermometers. Its fast 100 ms response, medical-grade ±0.5 °C accuracy in the human body range (32–42 °C), and contactless operation made it ideal for rapid screening at hospitals, airports, and offices.
Limitations
- Emissivity dependent: Shiny or reflective surfaces give inaccurate readings without emissivity correction.
- Wide FoV (BAA): The 90° default variant averages a large area — cannot precisely measure small objects without narrow-FoV variants.
- Ambient sensitivity: Rapid ambient temperature changes (e.g., moving from AC to outdoor sun) cause drift until thermal equilibrium is restored.
- Not for transparent materials: Glass, plastics, and water are partially transparent to IR, leading to systematically low readings.
- I2C address conflicts: Default 0x5A cannot be changed without EEPROM programming. Multiple sensors on one bus require address reconfiguration.