Безконтактний термометр на MLX90614 з OLED-дисплеєм
Інфрачервоний сенсор MLX90614 міряє температуру поверхні на відстані — від чашки чаю до лоба. Виводимо показання на OLED, пищимо при «гарячці» і розбираємося з полем зору, коефіцієнтом випромінювання і тим, чому це не медичний прилад.
Про проєкт
Будь-яке тіло випромінює інфрачервоне світло, і що воно гарячіше, то яскравіше. 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 обмежений.