Фонарик-тепловизор

Однажды на одном из зарубежных сайтов (adafruit.com) мне попался на глаза интересный аппарат. Это было устройство по форме напоминающее пистолет. В основе его был дистанционный датчик температуры из серии MLX, а также модуль адресных светодиодов и контроллер. Наводим аппарат, к примеру, на горячий чайник и он его тут же подсвечивает ярким красным цветом. Наводим на стакан с холодной водой — всё становится синим. Получился этакий пистолет-тепловизор.

Вещь не предназначалась для какой-то серьезной работы, однако, представляла собой хороший образец полноценного законченного прибора, при создании которого можно получить полезные навыки и знания. Да и просто веселая штука, достойная того, чтобы её создать.

В этой статье я опишу создание подобного устройства, но немного в другом форм-факторе. Это будет уже не пистолет, а фонарик-тепловизор!

Компоненты для урока "Фонарик-тепловизор" на shop.robotclass.ru
В корзину
В корзину
В корзину
В корзину
В корзину

Схема устройства

Фонарик-тепловизор на Ардуино
Фонарик-тепловизор на Ардуино

Программа

Программа должна считывать показания датчика температуры и выводить на светодиодное кольцо соответствующий цвет.

#include <Adafruit_MLX90614.h>
#include <Adafruit_NeoPixel.h>

#define PIN 12
#define NUMPIXELS 16 // количество адресных светодиодов

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_RGB + NEO_KHZ800);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();

uint32_t temp_to_color(int);

void setup() {
    Serial.begin(9600);
    mlx.begin(); // инициализация датчика температуры
    pixels.begin(); // инициализация адресных светодиодов
}

void loop() {
    float to = mlx.readObjectTempC(); // считывание температуры
    uint32_t c = temp_to_color(int(to*10));
    for(int i=0; i<NUMPIXELS; i++){
        pixels.setPixelColor(i, c);
        pixels.show();
    }
}

// карта диапазона цветов
uint8_t cmap[] = {
    0xff, 0xff, 0xff, // 0C - белый
    0x00, 0x00, 0xff, // 12C - синий
    0xff, 0x00, 0x00, // 24C - зеленый
    0xc0, 0xff, 0x00, // 36C - оранжевый
    0x00, 0xff, 0x00, // 48C - красный
};

uint32_t temp_to_color(int degree_tenths){
    uint32_t c;
    uint8_t i;
    int floor_t;
    float scale;

    if (degree_tenths <= 0) // если температура меньше 0, то цвет белый
        c = pixels.Color(cmap[0], cmap[1], cmap[2]);
    else if (degree_tenths >= 480) // если температура больше 48, то цвет красный
        c = pixels.Color(cmap[12], cmap[13], cmap[14]);
    else { // если температура между 0 и 48, то вычисляем промежуточный цвет по таблице
        i = (degree_tenths / 120) * 3;
        floor_t = i * 40;
        scale = (degree_tenths - floor_t)/ 120.0; // calc how far along this range
        c = pixels.Color(cmap[i] + (cmap[i+3]-cmap[i])*scale,
            cmap[i+1] + (cmap[i+4]-cmap[i+1])*scale,
            cmap[i+2] + (cmap[i+5]-cmap[i+2])*scale
        );
    }
    return(c);
}

Загружаем программу на Ардуино и проверяем работу. Для теста наводим датчик на разные предметы: на холодное окно, на руку, на стакан с горячей водой. Исходя из настроек в начале программы, при наведении фонарика на что-то, теплее 48 градусов Цельсия (например, стакан с кипятком), он будет светить красным цветом. Если же посветим на стакан со льдом, то получим или белый, или голубой цвет.

Корпус

Теперь, когда схема работает как надо, можно заняться корпусом. Для проектирования фонарика я использовал редактор SketchUp. Детали были изготовлены на 3D-принтере.

Фонарик-тепловизор на Ардуино

Самый сложный узел в фонарике — это крепление аккумулятора. Я ориентировался на стандартные решения: с плюсовой стороны аккумулятора (справа) — пластина с небольшим наплывом припоя. С минусовой стороны (слева) — контакт с прижимающей пружиной.

Фонарик-тепловизор на Ардуино

Чертежи деталей в формате SKP и STL можно скачать здесь: https://www.thingiverse.com/thing:2689467

Сборка

Рекомендую следующую последовательность сборки.

1) Вырезаем из куска фольгированного стеклотекстолита кружок и сверлим в нем отверстие.

Фонарик-тепловизор на Ардуино

2) Продеваем сквозь кружок провод и припаиваем его с одной стороны. Делаем жирную горку припоя. Затем с обратной стороны наклеиваем двухсторонний скотч и запихиваем кружок в трубку до упора. При этом, плюсовой провод от кружка должен пройти сквозь отверстие и вылезти с передней стороны фонарика.

3) Припаиваем в выключателю два длинных провода, затем вставляем его в соответствующее отверстие в корпусе фонарика. Провод от плюса аккумулятора припаиваем к одному контакту выключателя, а провод от второго контакта соединяем с плюсом повышающего стабилизатора. Провод от минуса аккумулятора припаиваем к VIN- стабилизатора.

Внимание! Стабилизатор сначала нужно настроить на 5 Вольт на выходе, и только затем впаивать в цепь фонарика.

Фонарик-тепловизор на Ардуино

4) К передней крышке фонарика прикручиваем держатель датчика. Подпаиваем к датчику провода.

Фонарик-тепловизор на Ардуино

5) Подпаиваем провода к светодиодному кольцу и приклеиваем его к крышке фонарика на двухсторонний скотч.

Фонарик-тепловизор на Ардуино

6) Припаиваем стабилизатор, датчик и светодиодное кольцо к Ардуино Про Мини.

Фонарик-тепловизор на Ардуино

6) Наконец, вставляем аккумулятор и фиксируем его пробкой.

Фонарик-тепловизор на Ардуино

7) Закрываем крышку фонарика — готово!

Фонарик-тепловизор на Ардуино

6. Фонарик в действии

Фонарик-тепловизор на Ардуино

Изменено:

Фонарик-тепловизор: 3 комментария

  1. Видел у китайцев такой датчик, но вроде как с узким лучом (на него трубка как объектив надета была). Тогда можно поставить такой фонарь в центре комнаты, сервоприводом его направлять а фотоаппаратом на длинной выдержке снимать термограмму помещения. Во как!

    • На самом деле, ставят такие датчики на сервопривод, данные собирают в массив и выводят в виде картинки. Так проще, чем с фотоаппаратом:)
      И кстати, при использовании нехитрой математики можно и датчик с широким углом использовать для такого сканера.

  2. На каком расстоянии может работать датчик? и как сильно от расстояния зависит достоверность его показания?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.