← До всіх проєктів
Сенсори Початковий

Безконтактний термометр на MLX90614 з OLED-дисплеєм

Інфрачервоний сенсор MLX90614 міряє температуру поверхні на відстані — від чашки чаю до лоба. Виводимо показання на OLED, пищимо при «гарячці» і розбираємося з полем зору, коефіцієнтом випромінювання і тим, чому це не медичний прилад.

Складність
Початковий
Час
40 min
Категорія
Сенсори
Оновлено

Про проєкт

Будь-яке тіло випромінює інфрачервоне світло, і що воно гарячіше, то яскравіше. MLX90614 — термостовпчик із фільтром і процесором усередині: він ловить це випромінювання і віддає готову температуру по I2C. Так працюють «пістолети» для вимірювання температури. Збираємо кишеньковий термометр: цифри на OLED 0.96″ і сигнал, коли поверхня гарячіша за 37.5 °C.

Що знадобиться

  • ESP32 DevKit
  • Модуль MLX90614 (GY-906, версія на 3 В або 5 В зі стабілізатором)
  • OLED SSD1306 128×64 (I2C)
  • Зумер і резистор 100 Ом
  • Бібліотеки Adafruit MLX90614 і Adafruit SSD1306 (+ Adafruit GFX)

Схема

Обидва модулі на шині I2C, адреси різні (MLX90614 — 0x5A, OLED — 0x3C):

Модуль VIN/VCC GND SDA SCL
MLX90614 3V3 GND GPIO21 GPIO22
OLED 3V3 GND GPIO21 GPIO22

Зумер: GPIO25 → 100 Ом → «+», «−» → GND.

Що саме міряє датчик

  • Два значення. readAmbientTempC() — температура самого корпусу датчика (≈ повітря). readObjectTempC() — середня температура всього, що потрапляє в поле зору.
  • Поле зору ~90° у GY-906 (модель BAA). На відстані 5 см це пляма діаметром ~10 см. Відійдете далі, і датчик «побачить» стіну довкола чашки. Для вимірювань здалеку є версії з вузьким полем (BCI: 5°).
  • Коефіцієнт випромінювання (ε). Датчик налаштовано на ε = 1.0 (ідеальне «чорне тіло»). Шкіра має ≈ 0.98, тож він занижує на ~0.3 °C. Полірований метал з ε ≈ 0.1 датчик майже «не бачить»: він показує відбиту температуру кімнати. Для металу наклейте шматок чорної ізострічки й міряйте по ній.

Код

// Безконтактний термометр: MLX90614 + OLED 128×64 + зумер
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_SSD1306.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();
Adafruit_SSD1306 oled(128, 64, &Wire);
const int BUZZER = 25;
const float FEVER = 37.5;   // поріг «гарячої» поверхні, °C

void setup() {
  Serial.begin(115200);
  if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLED не знайдено");
    while (true) delay(1000);
  }
  oled.setTextColor(SSD1306_WHITE);
  if (!mlx.begin()) {
    oled.clearDisplay();
    oled.println("MLX90614 missing");
    oled.display();
    while (true) delay(1000);
  }
}

void loop() {
  float obj = mlx.readObjectTempC();    // те, на що дивиться датчик
  float amb = mlx.readAmbientTempC();   // корпус датчика ≈ повітря
  oled.clearDisplay();
  oled.setTextSize(1);
  oled.setCursor(0, 0);
  oled.print("Object");
  oled.setTextSize(3);
  oled.setCursor(0, 16);
  oled.printf("%.1f", obj);
  oled.setTextSize(1);
  oled.print(" C");
  oled.setCursor(0, 54);
  oled.printf("Ambient %.1f C", amb);
  if (obj >= FEVER) {
    oled.setCursor(92, 0);
    oled.print("HOT!");
    tone(BUZZER, 2500, 150);
  }
  oled.display();
  Serial.printf("об'єкт %.2f °C, повітря %.2f °C\n", obj, amb);
  delay(1000);
}

Чому це не медичний термометр

  • Лоб на 0.5–2 °C холодніший за температуру тіла і сильно залежить від вітру, поту й зачіски.
  • Датчик реагує на тепло власного корпусу: тримайте його за краї, не за кришку.
  • Після перенесення з холоду в тепло дайте датчику 10–15 хвилин, щоб температура корпусу вирівнялася.

Для порівняння «гарячіше/холодніше» (труби, розетки, двигуни, підшипники) його точності ±0.5 °C більш ніж достатньо.

Що далі

  • Кнопка «виміряти» і утримання максимального значення за 2 секунди, як у справжніх пістолетах.
  • Змінити ε можна програмно (writeEmissivity()), але значення записується в EEPROM датчика і набирає сили лише після його перезавантаження. Не робіть цього в кожному setup(): ресурс EEPROM обмежений.