Тепловизор на связке STM32 и инфракрасного сенсора MLX90640 способен показывать картину температур в реальном времени — при этом стоимость компонентов заметно ниже готового прибора. Основная сложность проекта — не схемотехника, а обработка данных: сенсор выдаёт сырой массив значений, который нужно скомпенсировать, отмасштабировать и превратить в цветное изображение на дисплее.
В этом руководстве разберём выбор ИК-матрицы и микроконтроллера, схему подключения по I2C, структуру прошивки и типичные ошибки начинающих. Материал ориентирован на тех, кто уже держал в руках паяльник и программировал STM32 хотя бы в среде STM32CubeIDE или Arduino IDE.
Как устроен самодельный тепловизор
Принцип работы прост: ИК-сенсор измеряет тепловое излучение объектов в поле зрения и формирует двумерный массив температур. Микроконтроллер считывает этот массив, применяет калибровочные коэффициенты из памяти датчика и интерполирует низкое разрешение до размера экрана. Каждому диапазону температур назначается цвет — так получается привычная «тепловая» картинка.
Ключевое отличие от фотоаппарата — здесь нет оптики в привычном смысле. Сенсор имеет фиксированный угол обзора и низкое разрешение, поэтому детальность ограничена физикой устройства. Даже лучший самодельный тепловизор на MLX90640 не заменит промышленный прибор для точных измерений — но для поиска перегрева на плате, утечек тепла или неисправных компонентов его достаточно.
Частота обновления картинки зависит от возможностей сенсора и скорости шины: у MLX90640 она настраивается программно, у более простого AMG8833 ограничена жёстко. Для комфортного наблюдения желательно получить хотя бы несколько кадров в секунду.
Выбор ИК-сенсора и микроконтроллера
От сенсора зависит почти всё: разрешение, точность, цена и сложность прошивки. Два самых популярных варианта в DIY-сообществе — MLX90640 от Melexis и AMG8833 (Grid-EYE) от Panasonic. Первый даёт бо́льшее разрешение и требует сложной математики компенсации, второй проще в освоении, но картинка грубее.
По микроконтроллеру: для обработки массива температур и вывода на цветной дисплей нужен чип с достаточным объёмом ОЗУ и желательно с аппаратным FPU. Хорошо подходят STM32F103 (для простых вариантов), STM32F401/F411 (оптимум цены и мощности) или STM32F407, если планируется интерполяция высокого порядка.
| Параметр | MLX90640 | AMG8833 |
|---|---|---|
| Встроенное разрешение | 32×24 пикселя | 8×8 пикселей |
| Интерфейс | I2C | I2C |
| Сложность прошивки | Высокая (калибровка по данным EEPROM) | Низкая (готовые значения температуры) |
| Требования к MCU | Желателен FPU и больше RAM | Хватит базового STM32F1 |
| Типичное применение | Детальная картина, поиск точек перегрева | Обучение, простое обнаружение тепла |
⚠️ Внимание: модули с MLX90640 выпускаются в версиях на разное напряжение питания и с разными полями зрения. Перед заказом сверьтесь с datasheet конкретного модуля — подача неверного питания может вывести сенсор из строя, а сенсор стоит заметно дороже остальных компонентов.
Список компонентов и схема подключения
Помимо сенсора и микроконтроллера понадобятся дисплей, источник питания и мелкая обвязка. Наиболее удобны SPI-дисплеи на контроллере ILI9341 или ST7789 — для них есть готовые библиотеки под STM32.
- 🔧 Микроконтроллер: отладочная плата Blue Pill (STM32F103) или Black Pill (STM32F401/F411)
- 🌡️ ИК-сенсор: модуль MLX90640 или AMG8833 с обвязкой
- 🖥️ Дисплей: TFT 2.4–3.2 дюйма на ILI9341 с интерфейсом SPI
- 🔋 Питание: аккумулятор 18650 с модулем заряда и стабилизатором, либо питание от USB
- 🔌 Программатор ST-Link для прошивки и отладки
- 🧷 Резисторы подтяжки для линий I2C, если их нет на модуле сенсора
Подключение по I2C стандартное: линии SDA и SCL сенсора соединяются с соответствующими выводами STM32 (например, PB7 и PB6 для I2C1), плюс общий провод и питание. Дисплей подключается к аппаратному SPI: SCK, MOSI, а также служебные линии CS, DC и RESET на произвольные GPIO.
⚠️ Внимание: проверьте уровни логики сенсора и дисплея. STM32 работает с логикой 3.3 В — если модуль рассчитан на 5 В без преобразователя уровней, потребуется согласование, иначе возможны сбои связи или повреждение входов.
Подготовка среды и структура прошивки
Для разработки удобнее всего использовать STM32CubeIDE: конфигуратор CubeMX позволяет графически настроить периферию — включить I2C, SPI, тактирование — и сгенерировать каркас проекта на HAL. Альтернатива — PlatformIO или Arduino-ядро для STM32, если хочется быстрее получить результат на готовых библиотеках.
Логика прошивки строится по циклу: инициализация периферии → чтение калибровочных данных сенсора → основной цикл «захват кадра → обработка → отрисовка». Для MLX90640 производитель публикует библиотеку драйвера, которая реализует формулы компенсации — писать математику с нуля по datasheet не нужно.
// Упрощённый каркас основного цикла
while (1) {
MLX90640_GetFrameData(MLX90640_address, frameData);
MLX90640_CalculateTo(frameData, &mlx90640, emissivity, tr, temperature);
interpolate_and_render(temperature); // масштабирование + вывод на TFT
}
Обратите внимание на объём буферов: массив температур из 768 значений типа float занимает около 3 КБ RAM, а с промежуточными буферами кадра потребности растут. Именно поэтому на совсем слабых чипах с малым объёмом ОЗУ проект может не поместиться — проверяйте карту памяти после компиляции.
Начните с вывода температур в UART через printf-отладку, прежде чем подключать дисплей. Так вы убедитесь, что сенсор отвечает и данные осмысленные, и отделите проблемы связи от проблем отрисовки.
Пошаговая сборка и прошивка
Собирать устройство лучше поэтапно, проверяя каждый узел отдельно. Такой порядок экономит часы отладки: когда всё спаяно разом, локализовать неисправность гораздо труднее.
☑️ Порядок сборки тепловизора
Сначала прошейте минимальный код, который только инициализирует I2C и опрашивает шину. Если сенсор отвечает по ожидаемому адресу — переходите к чтению данных. Затем подключайте дисплей: отдельно проверьте его тестовым эскизом, поскольку дисплеи на разных контроллерах требуют разных последовательностей инициализации.
Цветовая палитра реализуется просто: диапазон температур кадра (минимум–максимум) линейно отображается на градиент «синий → зелёный → красный → белый». Каждому пикселю сенсора соответствует прямоугольник на экране; билинейная интерполяция между соседними точками заметно улучшает визуальное качество, но стоит процессорного времени.
Почему картинка «плывёт» при наведении на руку
У MLX90640 есть параметр компенсации температуры самого сенсора (Ta). Если вызывать расчёт без учёта реальной температуры корпуса датчика или с неверным коэффициентом излучения (emissivity), показания будут смещаться. Проверьте, что в CalculateTo передаётся актуальное значение Ta и корректный коэффициент излучения для материала, который вы измеряете.
Типичные ошибки и их диагностика
Чаще всего проект «не заводится» по одной из нескольких повторяющихся причин. Разберём их в порядке вероятности.
- ❌ Сенсор не отвечает по I2C — проверьте подтяжку линий, питание модуля и правильность адреса; полезен сканер шины
- 📉 Данные читаются, но это мусор — возможная причина: неверная частота I2C или перепутанный порядок чтения регистров; сверьтесь с примером производителя
- 🎨 Дисплей белый или чёрный — неверная инициализация контроллера дисплея либо перепутаны линии
CS/DC - 🐌 Картинка обновляется рывками — снизьте разрешение отрисовки, упростите интерполяцию или поднимите тактовую частоту MCU
- 🌡️ Температуры явно завышены/занижены — проверьте коэффициент излучения и компенсацию температуры корпуса сенсора
⚠️ Внимание: не питайте всю конструкцию от случайных источников без стабилизации. Пульсации по питанию влияют на ИК-сенсор сильнее, чем на цифровую часть, и проявляются как «плавающие» показания температуры, которые легко принять за программную ошибку.
Большинство проблем самодельного тепловизора — это проблемы I2C (подтяжка, адрес, частота) или инициализации дисплея. Отлаживайте узлы по отдельности: сначала сенсор через UART-лог, потом экран, потом их связку.
Калибровка и точность измерений
Заводская калибровка сенсора хранится в его внутренней памяти — библиотека драйвера использует эти коэффициенты автоматически. Однако итоговая точность зависит и от внешних факторов: коэффициента излучения поверхности, расстояния до объекта, температуры самого прибора.
Блестящие металлические поверхности отражают ИК-излучение окружения, и тепловизор показывает не их температуру, а «отражённую». Для ориентировочных измерений на таких объектах можно наклеить кусочек матовой изоленты — её излучательная способность близка к типичным материалам. Это старый приём термографов, он работает и с самоделкой.
Для самопроверки полезно навести прибор на объект с известной температурой — например, на ладонь или кружку с водой измеренной температуры. Точного соответствия лабораторным приборам ждать не стоит, но грубые отклонения (десятки градусов) укажут на ошибку в расчётах.
Дайте сенсору несколько минут после включения на термостабилизацию. Пока корпус датчика не вышел на рабочую температуру, показания могут заметно дрейфовать.
Корпус и автономность
Финальный этап — упаковать устройство в удобный форм-фактор. Популярное решение — корпус, напечатанный на 3D-принтере, в форме пистолетной рукоятки: дисплей сверху, сенсор спереди, аккумулятор в рукояти. При проектировании оставьте перед сенсором чистое окно — обычный прозрачный пластик для ИК-диапазона непрозрачен, поэтому «стекло» ставить нельзя.
Автономность определяется ёмкостью аккумулятора и потреблением дисплея — именно подсветка экрана обычно главный потребитель. Программное снижение яркости и отключение подсветки при бездействии заметно продлевают работу. Кнопку питания и, при желании, кнопку «заморозки» кадра выведите на корпус.
Самодельный тепловизор на STM32 — реально рабочий инструмент для поиска перегревов на платах, проверки теплоизоляции и обучения. Его ограничения — низкое разрешение и ориентировочная точность; для сертифицированных измерений нужен промышленный прибор.
Часто задаваемые вопросы
Подойдёт ли Arduino Uno вместо STM32?
Технически проекты на AVR существуют, но ресурсов ATmega328 (2 КБ ОЗУ) не хватает для полноценной обработки кадра MLX90640 с буферами. STM32 — более практичный выбор при сопоставимой цене отладочной платы. Для простого AMG8833 слабый MCU ещё допустим, но без запаса на интерполяцию.
Какое реальное разрешение получится на экране?
Сенсор выдаёт физическое разрешение (32×24 или 8×8), а на дисплей картинка выводится в размере экрана за счёт масштабирования и интерполяции. Визуально изображение выглядит гладко, но детальность определяется именно исходной матрицей сенсора — новые детали интерполяция не создаёт.
Можно ли измерять температуру тела человека таким прибором?
Самодельный тепловизор не является медицинским прибором и не обеспечивает точность, необходимую для диагностики. Для ориентировочного наблюдения он подходит, но любые выводы о состоянии здоровья по его показаниям делать нельзя — для этого существуют сертифицированные устройства.
Сенсор отвечает, но картинка зашумлена. Что проверить?
Возможные причины: нестабильное питание, слишком высокая частота обновления кадров (при высокой частоте растёт шум), отсутствие усреднения. Попробуйте снизить частоту кадров в настройках сенсора, добавить программное усреднение нескольких кадров и проверить качество стабилизации питания.
Где взять библиотеку драйвера для MLX90640?
Производитель сенсора публикует официальный драйвер с реализацией формул компенсации — ищите его на официальном репозитории Melexis или в экосистеме вашей среды разработки. Использование готового драйвера предпочтительнее самостоятельной реализации математики по datasheet: там много коэффициентов, и ошибиться легко.