Пирометр на Arduino: бесконтактный термометр с MLX90614 и LCD
Пирометр — единственный термометр в арсенале Arduino, которому не нужен прижим: модуль MLX90614 ловит инфракрасное излучение объекта и выдаёт температуру по шине I2C с точностью ±0,2 °C в медицинском диапазоне. Из него собирают бесконтактные градусники, контроль нагрева моторов и сопел 3D-принтера, термометрию пивоваренного сусла — всюду, где трогать объект нельзя, неудобно или просто горячо.
В симуляторе пирометр собирается за минуту: карточка MLX90614 из палитры «Макетка» встаёт на шину I2C рядом с дисплеем, ползунки задают температуру объекта от −70 до 380 °C и воздуха от −40 до 125 °C, а рантайм исполняет begin и оба чтения как настоящие методы библиотеки. Ниже — физика бесконтактного измерения, распиновка, скетч с LCD и честный список того, что симулятор не моделирует в принципе.
Как чип меряет на расстоянии
Внутри MLX90614 — термобатарея (thermopile): линза собирает инфракрасное излучение объекта и фокусирует его на крошечных спаях, а разница температур спаёв превращается в микровольты. Мощность излучения растёт как четвёртая степень температуры — закон Стефана–Больцмана, — поэтому даже далёкий тёплый предмет оставляет заметный след. Второй термометр измеряет корпус самого датчика: без этой компенсации показания гуляли бы на десятки градусов. Угол зрения фиксированный, у стандартного исполнения около 35 градусов: с тридцати сантиметров датчик усредняет круг диаметром примерно 19 сантиметров, и в «пятно» попадает всё — включая стену позади цели.
Подключение: две платы на одной шине
Модуль сидит на I2C: SDA уходит на A4, SCL — на A5, питание — 3,3 В на голом чипе или 5 В на модульной плате со стабилизатором. Адрес фиксированный, 0x5A, и он не конфликтует с дисплеем на 0x27 — обе платы вешаем на одну шину, чем скетч ниже и пользуется. Если шина молчит, пройдитесь сканером адресов из раздела Wire — он покажет, кто из устройств отвечает.
| Вывод MLX90614 | Пин Arduino | Заметка |
|---|---|---|
| VIN | 3,3 В или 5 В | голый чип — только 3,3 В, модуль со стабилизатором — 5 В |
| GND | GND | общая земля с дисплеем |
| SDA | A4 | линия данных I2C |
| SCL | A5 | линия тактирования I2C |
Дисплей LCD 16×2 со встроенным преобразователем I2C ставим параллельно: питание — 5 В, адрес по умолчанию 0x27. Его подключение и адреса разобраны в лендинге про LCD по I2C.
Object и Ambient: две температуры из одного чипа
readObjectTempC() возвращает температуру поверхности, на которую смотрит датчик, а readAmbientTempC() — температуру его собственного корпуса, примерно равную воздуху вокруг. Сравнение полезно само по себе: если корпус заметно нагрелся, датчик долго смотрел на горячее, и первым секундам после поворота доверять не стоит. Главный источник «чудес» — коэффициент излучения: матовые тела (кожа, дерево, вода) излучают почти как идеальный излучатель, а блестящие металлы отражают соседей и врут в минус — алюминиевый чайник при 80 °C легко показывает −5. Лечение на живой плате: кусочек малярного скотча или мазок матовым маркером на цели, их излучение около 0,95. Внутри симулятора это не нужно — значение берётся с ползунка.
Скетч пирометра с LCD
Готовый прибор: на верхней строке дисплея — название, на нижней — температура объекта, в Serial — обе температуры с одним знаком после запятой, на D13 — сигнальный светодиод при превышении порога. Порог 37,5 °C взят «медицинский», но логика та же для контроля перегрева двигателя или хотэнда.
#include <Wire.h>#include <Adafruit_MLX90614.h>#include <LiquidCrystal_I2C.h> Adafruit_MLX90614 mlx; // SDA -> A4, SCL -> A5, адрес 0x5ALiquidCrystal_I2C lcd(0x27, 16, 2); // дисплей на той же шине I2Cconst float POROG = 37.5; // порог сигнального светодиода, градусы void setup() { Serial.begin(9600); pinMode(13, OUTPUT); lcd.init(); lcd.backlight(); mlx.begin(); // на живой плате проверьте код возврата lcd.setCursor(0, 0); lcd.print("IR pyrometer"); // латиницей: HD44780 не знает кириллицу} void loop() { float t = mlx.readObjectTempC(); // температура объекта: лоб, чайник, радиатор float a = mlx.readAmbientTempC(); // температура корпуса самого датчика Serial.print("Object: "); Serial.print(t, 1); Serial.print(" C Case: "); Serial.print(a, 1); Serial.println(" C"); lcd.setCursor(0, 1); lcd.print("T="); if (t < 10.0) lcd.print(" "); // выравнивание: без него остаются хвосты lcd.print(t, 1); if (t >= POROG) { digitalWrite(13, HIGH); // перегрев или жар — сигнал на D13 Serial.println("porog prevyshen"); } else { digitalWrite(13, LOW); } delay(1000);}Две детали скетча сделаны для живого железа, а не для симулятора. Строка «T=» напечатана латиницей: контроллер HD44780 не хранит кириллицу, и русская буква превратилась бы в кракозябру. Выравнивающий пробел перед температурой ниже 10 градусов защищает от хвостов: без него «9.5» не затирает четвёртый знак прошлого кадра, и дисплей показывает «9.56». На виртуальном LCD это воспроизводится так же — можете проверить, убрав строку с пробелом.
Что исполняет симулятор, а что нет
Рантайм поддерживает begin, readObjectTempC и readAmbientTempC (в градусах Цельсия и Фаренгейта) плюс всю LCD-часть скетча: init, backlight, setCursor, печать с одним знаком после запятой — как в настоящей библиотеке. Температуры задаются ползунками карточки: объект от −70 до 380 °C, воздух от −40 до 125 °C. Не моделируется оптика: угол зрения, коэффициент излучения, отражения от блестящих поверхностей и время установления показаний — симулятор честно показывает то, что вы выставили. На это и расчёт: пороги, вывод и интерфейс отлаживаются в браузере, а физика излучения остаётся живому датчику.