Симулятор MLX90614 онлайн — IR-термометр бесконтактно
MLX90614 от Melexis это бесконтактный инфракрасный термометр. Он меряет температуру объекта перед датчиком и отдельно температуру воздуха вокруг себя, и отдаёт два числа по I2C. Дальность работы до 10 см, при этом ничего трогать не нужно.
В симуляторе MLX90614 виртуальный: два ползунка, один для температуры объекта в диапазоне от -70 до 380 градусов, второй для температуры воздуха от -40 до 125. Код Adafruit_MLX90614 mlx и mlx.begin(), и виджет появляется на стенде, а readObjectTempC возвращает значение с ползунка.
Главное отличие от обычного термодатчика в том, что MLX90614 меряет поверхность, а не воздух. Поэтому за окном он покажет не погоду, а температуру стекла, а на стене будет видно, какая часть прогрелась лучше.
Принцип: термопары и ИК-оптика
Чип MLX90614 это массив термопар, собранных в фокусе линзы из германия. Любой объект температурой выше абсолютного нуля излучает инфракрасное излучение, мощность которого растёт примерно как четвёртая степень температуры, это закон Стефана-Больцмана. Линза собирает излучение на термопару, та вырабатывает напряжение, пропорциональное температуре. Чип измеряет две вещи: температуру своих собственных термопар, то есть температуру объекта, и температуру корпуса, то есть температуру воздуха вокруг датчика.
Грабль: датчик показывает среднюю температуру по полю зрения. У обычной версии MLX90614 поле зрения 35 градусов, у медицинской BAA оно узкое, 10 градусов. Если в кадр попали лоб и стена, результат будет смесью двух температур, и это не ошибка датчика, а физика. Для измерения температуры тела подносят датчик на 3-5 см так, чтобы в поле зрения попал только нужный участок.
Второй момент, о котором забывают, это коэффициент излучения. Датчик по умолчанию считает, что объект излучает как абсолютно чёрное тело, то есть коэффициент 0.95. У человеческой кожи он около 0.98, у металла 0.1-0.3, у полированной поверхности и стекла ещё ниже. Отсюда типичная ошибка: на блестящей металлической детали термометр показывает заметно меньше, чем на коже. В симуляторе коэффициент излучения не моделируется, и значение объекта берётся прямо с ползунка.
Код: 2 температуры
#include <Wire.h>#include <Adafruit_MLX90614.h>Adafruit_MLX90614 mlx;void setup() { Serial.begin(9600); mlx.begin();}void loop() { Serial.print("Объект: "); Serial.print(mlx.readObjectTempC()); Serial.print(" °C Воздух: "); Serial.print(mlx.readAmbientTempC()); Serial.println(" °C"); delay(500);}Распиновка: VCC к 3.3 В, GND к GND, SDA к A4, SCL к A5. Сам чип работает от 2.5 до 3.6 В, на платах-адаптерах обычно стоит стабилизатор и тогда можно подавать 5 В. Адрес на шине 0x5A. Библиотека Adafruit_MLX90614 делает всю работу с регистрами: читает два 16-битных слова, переводит их в градусы Цельсия и отдаёт готовые float-значения. Разрешение исходных данных 0.02 градуса, но библиотека округляет до сотых долей.
Грабль при инициализации: если begin() не вызвать или датчик не ответил, чтение вернёт некорректные значения, а не ноль. В симуляторе begin() всегда успешен, так что проверку «датчик не найден» в учебном скетче придётся написать самому. Разница с реальным чипом важна: на железе ошибка связи выглядит как случайный мусор в температуре, и без проверки вы долго будете искать проблему в коде.
| Параметр | Значение | Заметка |
|---|---|---|
| Диапазон объекта | -70..380 °C | MLX90614 mlxkx, mlxkxx |
| Диапазон воздуха | -40..125 °C | Корпус чипа |
| Точность | ±0.5 °C (0..50 °C) | ±2% вне диапазона |
| FOV | 35° (стандарт) / 10° (medical) | Поле зрения |
| Дальность | до 10 см (оптимально 3 см) | Зависит от FOV |
Что сначала не получилось
Первый термометр я подключил к чашке с горячей водой и увидел 28 градусов вместо ожидаемых 60. Я решил, что датчик сломан, и начал проверять библиотеку и адрес. Причина оказалась в расстоянии: я держал датчик в 20 см от чашки, и в это поле зрения попадала вся комната вместе с её стенами. Когда поднёс его на 3 см, показание стало адекватным.
Второй раз я направил датчик в окно, и он показал температуру, близкую к уличной. Это тоже оказалось правильным поведением: стекло прозрачно для видимого света, но не для инфракрасного, и датчик меряет именно стекло, а не то, что за ним. Начав понимать, что датчик всегда меряет поверхность, я перестал считать его сломанным.
Личный опыт: контроль температуры в щитке
Первое применение у меня было техническое: контроль температуры поверхности радиатора и силового транзистора в силовом щитке. Там важно было не столько абсолютное значение, сколько изменение. Я выводил температуру объекта и температуру воздуха рядом и считал разницу: у транзистора под нагрузкой объект был заметно горячее воздуха, и по этой разнице было видно, начинается ли перегрев.
Проверял я это сравнением с контактным термометром. Разница между показаниями бесконтактного датчика на алюминиевой радиаторной пластине и контактного термометра, прижатого к той же пластине, укладывалась в 1-2 градуса, что соответствует заявленной точности около плюс-минус 0.5 градуса в диапазоне 0-50. На тёмной поверхности датчик совпадал с контактным ещё точнее, а вот на блестящей детали давал занижение, и это ровно тот случай, где не хватает поправки на коэффициент излучения.
Коэффициент излучения и поправки
Если вы измеряете не кожу и не шершавую поверхность, а полированный металл или пластик с блеском, показание придётся исправлять. В даташите MLX90614 есть регистр настройки коэффициента излучения, и библиотека Adafruit позволяет его задать. Практический приём: измерьте температуру того же участка контактным термометром, сравните с показанием MLX90614 и подберите коэффициент так, чтобы цифры сошлись. Для большинства пластиков и бумаги коэффициент близок к 0.95, для матового металла около 0.3-0.5, для кожи около 0.98.
Второй приём, который сильно упрощает жизнь, это измерение разницы температур. Если задача не «какая температура», а «насколько объект горячее фона», то поправка на коэффициент излучения почти не нужна: она влияет на абсолютное значение, а разность с температурой окружающего воздуха остаётся показательной. Именно так работают тепловизоры промышленного назначения.
MLX90614 или DS18B20
- DS18B20: контактный, точность ±0.5 °C, нужен физический контакт с объектом
- MLX90614: бесконтактный, точность около ±0.5 °C в диапазоне 0-50 °C
- DHT22: воздух, температура и влажность, точность заметно ниже
- Для контроля двигающегося объекта бесконтактный вариант единственный возможный
- Для точной температуры в конкретной точке контактный датчик надёжнее
Авторская позиция: что взять новичку
Берите обычную версию с полем зрения 35 градусов: она дешевле и проще в применении, а для большинства задач, где нужно «померить температуру поверхности», разницы не будет. Медицинскую BAA с полем 10 градусов имеет смысл только там, где вы измеряете лоб или ухо и важна точность позиционирования. И всегда держите дистанцию: 3-5 см это рабочий диапазон, на котором поле зрения ещё не накрывает лишнее. Для климатики и замера температуры воздуха MLX90614 вообще не подходит, там нужен обычный датчик влажности и температуры.