

The MLX90614 is a non-contact infrared temperature sensor designed to measure the temperature of objects without requiring direct physical contact. Manufactured by Melexis, this sensor utilizes infrared thermopile technology and integrates a low-noise amplifier, 17-bit ADC, and a powerful DSP for accurate temperature readings. It communicates via the I2C protocol, making it easy to interface with microcontrollers and other digital systems.








The MLX90614 is available in various models, but the following specifications are common across most variants:
| Parameter | Value |
|---|---|
| Operating Voltage | 3.6V to 5.5V |
| Communication Protocol | I2C (default address: 0x5A) |
| Object Temperature Range | -70°C to +380°C |
| Ambient Temperature Range | -40°C to +125°C |
| Accuracy | ±0.5°C (typical, for 0°C to +50°C range) |
| Field of View (FOV) | 35° (standard model) |
| Resolution | 0.02°C |
| Current Consumption | 1.5mA (typical) |
| Sleep Mode Current | 2µA |
The MLX90614 is typically available in a 4-pin TO-39 package. Below is the pinout description:
| Pin | Name | Description |
|---|---|---|
| 1 | VDD | Power supply (3.6V to 5.5V) |
| 2 | VSS | Ground |
| 3 | SDA | I2C data line |
| 4 | SCL | I2C clock line |
The MLX90614 can be easily interfaced with an Arduino UNO using the Wire library. Below is an example code to read the object temperature:
#include <Wire.h>
// MLX90614 default I2C address
#define MLX90614_I2C_ADDR 0x5A
// MLX90614 register for object temperature
#define MLX90614_TOBJ1 0x07
void setup() {
Wire.begin(); // Initialize I2C communication
Serial.begin(9600); // Start serial communication for debugging
Serial.println("MLX90614 Temperature Sensor Test");
}
void loop() {
float objectTemp = readTemperature(MLX90614_TOBJ1); // Read object temperature
Serial.print("Object Temperature: ");
Serial.print(objectTemp);
Serial.println(" °C");
delay(1000); // Wait 1 second before the next reading
}
// Function to read temperature from the MLX90614
float readTemperature(uint8_t reg) {
Wire.beginTransmission(MLX90614_I2C_ADDR); // Start communication with sensor
Wire.write(reg); // Request data from the specified register
Wire.endTransmission(false); // Send repeated start condition
Wire.requestFrom(MLX90614_I2C_ADDR, (uint8_t)3); // Request 3 bytes of data
if (Wire.available() < 3) {
return NAN; // Return NaN if data is not available
}
uint16_t data = Wire.read(); // Read low byte
data |= Wire.read() << 8; // Read high byte and combine
uint8_t pec = Wire.read(); // Read PEC (Packet Error Code, not used here)
// Convert raw data to temperature in Celsius
return (data * 0.02) - 273.15;
}
No Data from Sensor:
Inaccurate Temperature Readings:
I2C Communication Errors:
Q: Can the MLX90614 measure the temperature of liquids?
A: Yes, but the sensor must have a clear line of sight to the liquid's surface. Ensure the liquid is not reflective to avoid inaccurate readings.
Q: How can I reduce noise in the temperature readings?
A: Use a stable power supply, add a bypass capacitor (0.1µF) near the sensor, and average multiple readings in your code.
Q: Can I change the I2C address of the MLX90614?
A: Yes, the I2C address can be changed by writing to the sensor's EEPROM. Refer to the manufacturer's datasheet for detailed instructions.
Q: What is the maximum distance for accurate temperature measurement?
A: The effective range depends on the size and emissivity of the target object. For small objects, the sensor should be placed closer to ensure accurate readings.