Во время отладки электронных схем иногда возникает необходимость проверки температуры ряда компонентов в схеме. Обычные медицинские термометры здесь не подойдут – здесь нужен бесконтактный инфракрасный термометр. В данной статье мы рассмотрим создание подобного бесконтактного инфракрасного термометра на основе платы Arduino и бесконтактного датчика температуры MLX90614. Но этот датчик можно использовать не только для измерения температуры электронных компонентов, но и для измерения температуры тела, температуры поверхности, температуры воздуха в трубе вентиляции и др.
Изначально этот проект предназначался именно для измерения температуры электронных компонентов, но в связи с разразившейся в этом году пандемией коронавируса резко увеличился спрос на бесконтактные термометры для быстрого измерения температуры человека, поэтому значительно увеличился и интерес радиолюбителей к созданию подобных устройств. Надеемся, наш проект будет не особенно сложным и доступным для сборки даже начинающим радиолюбителям.
Необходимые компоненты
- Плата Arduino Pro Mini (купить на AliExpress), но можно использовать и Arduino Nano (купить на AliExpress) с небольшими изменениями в проекте.
- Инфракрасный датчик температуры (Infrared Temperature Sensor) MLX90614 (купить на AliExpress).
- OLED дисплей SSD1306 (купить на AliExpress).
- Лазерный диод (купить на AliExpress).
- Батарейка 9V.
- Кнопка.
- Зажим для батарейки.
- Соединительные провода.
Инфракрасный датчик температуры MLX90614
В настоящее время в электронных схемах широкое применение находят датчики температуры DHT11 и LM35. На нашем сайте вы можете посмотреть следующие примеры использования данных датчиков:
- цифровой термометр на Arduino и датчике температуры LM35;
- измерение температуры и влажности с помощью Arduino и датчика DHT11;
- мониторинг температуры и влажности через Интернет с помощью Arduino;
- логгер данных (температуры, влажности) на SD карту и компьютер с помощью Arduino.
Но в нашем проекте нам нужен совершенно иной датчик температуры, который мог бы определять температуру конкретного объекта (не температуру окружающей среды вокруг него) без непосредственного контакта с ним. Для этой цели могут быть использованы бесконтактные датчики температуры, которые используют лазерное или инфракрасное излучение для определения температуры объекта. К числу подобных датчиков относится и MLX90614, использующий инфракрасную энергию для определения температуры объекта. Внешний вид данного датчика показан на следующем рисунке.
Датчик MLX90614 производится компанией Melexis Microelectronics Integrated system. В своем составе он содержит два устройства: инфракрасный термоэлектрический детектор (обнаруживающий элемент) и вычислительное устройство, построенное на принципах цифровой обработки сигналов. Принцип работы датчика основан на законе Стефана – Больцмана, который говорит о том, что каждое нагретое тело излучает инфракрасную энергию, интенсивность которой прямо пропорционально температуре этого тела. Обнаруживающий элемент датчика измеряет какое количество энергии инфракрасной энергии излучается выбранным объектом, а вычислительный блок конвертирует это значение энергии в значение температуры используя встроенный 17-битный АЦП (аналого-цифровой преобразователь). На выход датчика информация о температуре передается по интерфейсу I2C.
Краткие технические характеристики датчика температуры MLX90614:
- рабочее напряжение: от 3.6V до 5V;
- измеряемый диапазон температур: от -70°C до 382.2°C;
- температура окружающей среды: от -40°C до 125°C;
- точность измерения температуры: 0.02°C.
Более полную информацию о датчике MLX90614 вы можете посмотреть в даташите на него.
Какой должна быть дистанция между датчиком и объектом?
К сожалению, ответ на этот вопрос не содержится напрямую в даташите на датчик MLX90614. Для нашего экземпляра датчика мы экспериментальным путем установили, что его рабочая дистанция определяется его полем зрения, которое для нашего датчика составляет примерно 80°.
Логично предположить, что диапазон работы датчика представляет собой конус с вершиной в датчике как показано на приведенном рисунке. Соответственно, чем дальше мы удаляемся от измеряемого объекта, тем больше увеличивается площадь зоны, в которой он может производить измерения. То есть при удалении от объекта на 1 см радиус зоны работы датчика увеличивается примерно на 2 см. В нашем проекте бесконтактного термометра мы разместили лазерный диод сверху над датчиком температуры MLX90614 чтобы правильно определять в какой точке объекта мы будем измерять температуру. Экспериментально мы обнаружили, что максимальная точность работы датчика обеспечивается на расстояниях до 2 см от измеряемого объекта, а с увеличением расстояния свыше 2 см точность работы датчика начинает падать.
Схема проекта
Схема бесконтактного термометра на основе платы Arduino и датчике температуры MLX90614 представлена на следующем рисунке.
Схема была нарисована с использованием программы Fritzing. Поскольку эта программа не поддерживает датчик MLX90614, мы вместо него на схеме использовали соответствующим образом подписанный прямоугольник, также на схеме мы использовали светодиод красного цвета вместо лазерного диода. Вся схема запитывается от батарейки 9V через кнопку. При нажатии кнопки контакт батарейки подключается к контакту RAW платы Arduino. Это напряжение 9V с помощью встроенного регулятора напряжения платы Arduino преобразуется в стабилизированное напряжение 5V, которое используется для питания OLED дисплея, датчика температуры и лазерного диода.
Если вы будете использовать этот термометр только для измерения температуры человеческого тела или других достаточно крупных объектов, то лазерный диод (он облегчает прицеливание термометра на маленьких объектах) можно из его схемы исключить.
Внешний вид конструкции нашего бесконтактного термометра показан на следующем рисунке.
Если вы раньше не работали с OLED дисплеями, то на нашем сайте вы можете прочитать статью о подключении OLED дисплея SSD1306 к плате Arduino. Приведенную схему можно усовершенствовать, используя отдельную схему для управления лазерным диодом, чтобы сделать лазерный луч более мощным.
Дизайн корпуса для термометра
Мы в нашем проекте для изготовления корпуса нашего бесконтактного термометра использовали 3D принтер. Корпус термометра состоит из двух частей. Верхняя часть термометра содержит все его основные компоненты: плату Arduino, OLED дисплей, датчик температуры и лазерный диод. Нижняя часть термометра представляет собой ручку, в которой размещены батарейка и кнопка включения термометра. Внешний вид корпуса термометра показан на следующем рисунке.
Файлы дизайна для печати компонентов корпуса термометра на 3D принтере вы можете скачать по следующей ссылке: Thermal Gun 3D Model.
3D печать компонентов термометра
Представленная 3D модель затем была сохранена в виде STL файлов и конвертирована в G-code (G-код) с помощью программного обеспечения Cura. Для печати компонентов термометра мы использовали 3D принтер Tevo tarantula. После печати компонентов мы скрепили их вместе с помощью шурупов. Если ваш принтер поддерживает возможность печати корпуса термометра целиком, то тогда ваша задача упрощается.
Напечатанные нами элементы корпуса термометра с размещенными внутри электронными компонентами показаны на следующих рисунках.
Мы решили верхнюю часть корпуса термометра оставить открытой для возможности внесения в нее изменений, но вы можете сделать ее закрытой.
Объяснение программы для Arduino
Полный текст программы приведен в конце статьи, здесь же мы кратко обсудим ее основные фрагменты.
Программа для нашего бесконтактного термометра должна считывать значение температуры с датчика MLX90614 и отображать ее на экране OLED дисплея. К счастью для нас программа будет достаточно простой благодаря специальной библиотеке для работы с датчиком MLX90614, разработанной компанией Adafruit. Эту библиотеку можно скачать по следующей ссылке — Arduino MLX90614 Library.
По этой ссылке вы скачаете библиотеку в виде ZIP архива. После этого вы можете добавить ее в Arduino IDE с помощью команды Sketch -> Include Library -> Add .ZIP Library. Также убедитесь в том, что у вас уже есть библиотеки, необходимые для работы с OLED дисплеем, ссылки для их скачивания есть в этой статье.
Первым делом в программе мы должны подключить необходимые заголовочные файлы. В нашей программе мы будем использовать встроенную в Arduino IDE библиотеку Wire для задействования возможностей протокола I2C, библиотека SparkFunML90614 (ее мы скачали ранее) используется для работы с датчиком температуры. Библиотеки SPI, GFX и SSD1306 используются для взаимодействия по 4-х проводному интерфейсу SPI с модулем OLED дисплея.
1 2 3 4 5 |
#include <Wire.h> #include <SparkFunMLX90614.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> |
Затем мы укажем контакты платы Arduino, к которым подключается OLED дисплей. Поскольку наш OLED дисплей работает по протоколу SPI, мы использовали для его подключения SPI контакты платы Arduino. Конечно, есть OLED дисплеи, которые работают по протоколу I2C, но в нашем проекте I2C контакты платы Arduino заняты датчиком температуры.
1 2 3 4 5 6 |
#define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 13 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); |
Внутри функции void setup() мы инициализируем последовательную связь для целей отладки и инициализируем датчик температуры (объект для работы с ним создан ранее в программе). Мы будем измерять температуру в градусах Цельсия, поэтому для установки режима работы датчика мы использовали параметр TEMP_C. Если же вы хотите измерять температуру в Фаренгейтах, то вам необходимо использовать параметр TEMP_F. Далее мы инициализируем OLED дисплей и очищаем его экран. Также мы используем поворот экрана дисплея на 180 градусов для повышения удобства считывания с него значений температуры.
1 2 3 4 5 6 7 8 9 10 |
void setup() { Serial.begin(9600); therm.begin(); therm.setUnit(TEMP_C); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); display.setRotation(2); } |
Внутри функции loop мы считываем значение температуры с датчика MLX90614 и конвертируем ее в строку чтобы отображать ее на экране OLED дисплея. Также мы печатаем это значение в окно монитора последовательной связи для целей отладки. Еще мы инкрементируем значение переменной runner, которая далее будет использоваться для создания небольшой анимации на экране дисплея. Анимация будет производиться при каждом успешном считывании значения температуры с датчика – это поможет нам быстро определить если что то пойдет не так.
1 2 3 4 5 6 7 8 9 |
if (therm.read()) // On success, read() will return 1, on fail 0. { temperature = String(therm.object(), 2); Serial.print("Object: "); Serial.print(temperature); Serial.println("C"); display.clearDisplay(); runner++; delay(5); } |
Тестирование работы термометра
Когда аппаратная часть проекта будет готова, загрузите программу в плату Arduino Pro Mini. Для этой цели можно использовать TTL programmer или FTDI board. Но если вы в этом проекте будете использовать плату Arduino Nano, то ее можно будет программировать с помощью USB кабеля, подключаемого к компьютеру.
Когда все будет готово, нажмите кнопку – она запустит в работу наш бесконтактный термометр. После этого вы должны увидеть как лазерный луч подсвечивает объект, а на экране OLED дисплея показывается температура этого объекта. Мы с помощью данного термометра проверяли температуру компонентов на печатной плате.
Работа термометра была проверена и на других объектах: паяльник, сопло 3D принтера, кусках льда и т.п. Более подробно работу термометра вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
/*********************************** Code for Arduino MLX90614 Contactless thermometer MLX90614 I2C connection OLED 4-wire SPI connection Dated: 7-6-2019 Code by: Aswint Raj **********************************/ #include <Wire.h> #include <SparkFunMLX90614.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // If using software SPI (the default case): #define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 13 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); IRTherm therm; void setup() { Serial.begin(9600); therm.begin(); therm.setUnit(TEMP_C); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); display.setRotation(2); } String temperature; char runner; void loop() { if (therm.read()) // при успешном считывании температуры функция read() возвращает 1, при неуспешном - 0. { temperature = String(therm.object(), 2); Serial.print("Object: "); Serial.print(temperature); Serial.println("C"); display.clearDisplay(); runner++; delay(5); } display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(display.width()/4,display.height()/12); if (therm.object()>=100) display.setCursor(display.width()/4,display.height()/12); display.println(temperature); display.drawLine(display.width()/runner,display.height() - display.height()/2.5, display.width()/runner+1, display.height() - display.height()/2.5, WHITE); display.setCursor(0,display.height()-display.height()/4); display.setTextSize(1); display.println(" Arduino Thermlgun"); display.setCursor(display.width()- display.width()/4,display.height()/12); display.println("deg C"); display.display(); if (runner>20) runner=0; } |