Однажды на одном из зарубежных сайтов (adafruit.com) мне попался на глаза интересный аппарат. Это было устройство по форме напоминающее пистолет. В основе его был дистанционный датчик температуры из серии MLX, а также модуль адресных светодиодов и контроллер. Наводим аппарат, к примеру, на горячий чайник и он его тут же подсвечивает ярким красным цветом. Наводим на стакан с холодной водой — всё становится синим. Получился этакий пистолет-тепловизор.
Вещь не предназначалась для какой-то серьезной работы, однако, представляла собой хороший образец полноценного законченного прибора, при создании которого можно получить полезные навыки и знания. Да и просто веселая штука, достойная того, чтобы её создать.
В этой статье я опишу создание подобного устройства, но немного в другом форм-факторе. Это будет уже не пистолет, а фонарик-тепловизор!
Схема устройства
Программа
Программа должна считывать показания датчика температуры и выводить на светодиодное кольцо соответствующий цвет.
#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. Фонарик в действии
Видел у китайцев такой датчик, но вроде как с узким лучом (на него трубка как объектив надета была). Тогда можно поставить такой фонарь в центре комнаты, сервоприводом его направлять а фотоаппаратом на длинной выдержке снимать термограмму помещения. Во как!
На самом деле, ставят такие датчики на сервопривод, данные собирают в массив и выводят в виде картинки. Так проще, чем с фотоаппаратом:)
И кстати, при использовании нехитрой математики можно и датчик с широким углом использовать для такого сканера.
На каком расстоянии может работать датчик? и как сильно от расстояния зависит достоверность его показания?