- Назначение, характеристики и разновидности,
- Подключение к Ардуино,
- Пример использования,
- Вывод,
- FAQ.
Назначение, характеристики и разновидности
Предназначение модуля раскрывается из его названия - измерять температуру на расстоянии. Особую актуальность задача приобрела полтора-два года назад, с момента коварного нападения на нас COVID-19, и, к сожалению, датчик до сих пор востребован на переднем крае этой войны. Разумеется, выявлять лица с повышенной температурой - не единственная задача, решаемая данным прибором. Сенсор может применяться в сотне различных проектов, где требуется точный и оперативный контроль температуры, от медицинского до промышленного и сельскохозяйственного назначения.Сенсор состоит из двух датчиков. Один из них, вспомогательный, контролирует температуру окружающей среды (воздуха), что можно использовать в качестве опорных данных. Диапазон измерения от -40, до +125 градусов цельсия, что покрывает почти все возможные задачи. Второй датчик (основной) наблюдает за температурой конкретного физического тела, размещенного прямо перед объективом, регистрируя интенсивность его инфракрасного излучения. Диапазон измерений основного датчика намного шире, от -70 до +380 градусов Цельсия, во что 99,9% задач DIY-мастеров укладываются уже с большим запасом. Сенсор выпускается в нескольких вариантах исполнения. Основные отличия заключаются в угле обзора, точности, напряжении питания и прочих технических характеристиках. Часть из них зашифрована в названии модели буквами. Нам в руки попался средний по всем показателям вариант - GY-906-BCC. Согласно таблице, он рассчитан на трехвольтовое питание и имеет угол обзора 35 градусов, что позволяет наиболее точно определять температуру предметов на расстоянии 5-10 см. Сенсор достался нам в виде модуля, удобного к подключению к Ардуино. На борту, кроме прочего, имеется преобразователь напряжения, что дает возможность запитать устройство от стандартных ардуиновских пяти вольт. Чаще всего GY-906 продается именно в подобной сборке с небольшими отличиями во внешнем виде и размере платы.
Где приобрести?
Датчики для Arduino можно купить в нашем магазине
Подключение к Ардуино
Плата сенсора подключается к Ардуино по шине SPI (Serial Peripheral Interface). Более подробно о протоколе можно почитать в нашей специальной статье. У Ардуино UNO и ей подобных, на базе контроллеров Atmega328 и Atmega168, имеются пины A4 (SDA) и A5 (SCL) с аппаратной поддержкой SPI. Просто соединяем их с одноименными пинами на плате, подаем питание от 3,3 В до 5 В и готово!С программной точки зрения, быстрее и проще всего воспользоваться готовой библиотекой от Adafruit, для работы которой может понадобиться надстройка в виде интерфейсной библиотеки того же производителя. Скачав и установив то и другое, можно уже начинать работу с GY-906, например, запустив скетчи с примерами. Разумеется, никто не запрещает создать собственный способ обмена данными с сенсором, возможно код получится даже более компактным и изящным. Довольно подробное описание протокола имеется в даташите.
Как видите, сенсор предельно прост в подключении и эксплуатации.
Пример использования
Как было замечено в начале статьи, сенсор получил особую популярность в качестве бесконтактного медицинского измерителя температуры тела для выявления больных и заразных с безопасного расстояния. Благодаря высокой точности и скорости работы, GY-906 отлично справляется с этой ролью. Давайте попробуем сделать простой, но вполне рабочий прототип такого дистанционного “градусника”.Сперва немного теории. Измерять температуру принято на открытых, максимально теплых, участках тела, каковыми является, как ни странно, лоб и большая часть лица. Для наглядности, нам любезно предоставили фото с тепловизора лица полярника, погулявшего немного на свежем воздухе при бодрящих -50 градусах. Как видно, практически вся не покрытая шерстью поверхность лица, кроме щёк, вполне достойна измерения адекватной температуры тела даже после таких экстремальных условий охлаждения. Еще имеется небольшая тонкость. Для более точных и достоверных измерений датчик следует предварительно настроить под данную конкретную задачу. Как известно, поверхности из разных материалов обладают разной излучательной способностью и датчик должен это учитывать, иначе данные могут быть весьма далеки от реальности. Существует таблица с коэффициентами излучения для большей части материалов. Для текущего проекта ищем пункт “кожа, человек”. Возьмем среднее значение 0.98. Откроем скетч “mix_set_emissivity” из примера библиотеки, вставим наш коэффициент в соответствующую переменную. Запустим программу, дождемся подтверждения. После перезагрузки модуля “кожный” коэффициент будет принят для максимально точного расчета температуры.
Что нам потребуется ещё, кроме датчика? Как минимум, индикатор, чтобы видеть измеренное значение. Предлагаю четырехразрядный семисегментный индикатор на базе TM1637, он прост, надежен, красив и не грузит контроллер, формируя символы самостоятельно. Подробное описание индикатора есть на нашем сайте.
На этом комплекте можно и остановиться, но мы сделаем результаты немного выразительнее. Например, если температура укладывается в норму, подтверждаем этот факт зеленым светодиодом, который интуитивно ассоциируется с чем-то хорошим. А если ничего хорошего в результатах измерений нет, то есть когда температура тела превышает 37 градусов, включим красный светодиод и усугубим его опасный цвет тревожным миганием и звуковым сигналом. Стало быть, нам потребуется еще два светодиода и бузер-пищалка.
Из зала подсказывают, что неплохо бы оснастить датчик соосной подсветкой, чтобы знать куда он смотрит. Добавим и белый светодиод на всякий случай, хоть в его необходимости имеются смутные сомнения.
Собираем схему. У нас на макетной плате получилось как то так:
Пишем простой код, чтобы это все оживить.
Важное примечание: код учебный, для сокращения его размеров и упрощения понимания, были использованы конструкции с паузами delay(), которых следует категорически избегать в реальной прошивке. Однако, эту возможность мы оставим на доработку и улучшение.
#include <TM1637Display.h> // библиотека индикатора #define CLK A0 // пины индикатора #define DIO A1 TM1637Display display(CLK, DIO); // подключаем индикатор byte data[4]; // данные для разрядов индикатора #include <Adafruit_MLX90614.h> // библиотека датчика температуры Adafruit_MLX90614 mlx = Adafruit_MLX90614(); // инициализация дачика #define WHITE 3 // светодиод белый #define RED 5 // светодиод красный #define GREEN 4 // светодиод зеленый #define BUZ 2 // пищалка void setup() { Serial.begin(9600); Serial.println("start"); pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(WHITE, OUTPUT); pinMode(BUZ, OUTPUT); display.setBrightness(4); // яркость индикатора 0-7 blank(); // прочерки на индикаторе if (!mlx.begin()) { // ищем датчик, если его нет, выдаем ощибку и зависаем Serial.println("Error MLX sensor"); digitalWrite(RED, HIGH); while (1); }; digitalWrite(RED, HIGH); // проверка светодиодов и пищалки при включении digitalWrite(GREEN, HIGH); digitalWrite(WHITE, HIGH); delay(500); digitalWrite(RED, LOW); digitalWrite(GREEN, LOW); digitalWrite(WHITE, LOW); digitalWrite(BUZ, HIGH); delay(10); digitalWrite(BUZ, LOW); } void loop() { static float t[3] = {25, 25, 25}; // кольцевой буфер измеряемых температур t[0] = t[1]; t[1] = t[2]; t[2] = mlx.readObjectTempC(); // замер температуры if (t[0] > 30.0 && t[1] > 30.0 && t[2] > 30.0) { // есть теплый объект, берем последнее измерение из трех, оно самое точное disp(t[2]); if (t[2] > 37) { for (byte i = 0; i < 10; i++) { // температура выше 37, пищим и мигаем digitalWrite(RED, LOW); digitalWrite(BUZ, HIGH); delay(50); digitalWrite(RED, HIGH); digitalWrite(BUZ, LOW); delay(100); } } else { // температура ниже 37, все хорошо digitalWrite(GREEN, HIGH); digitalWrite(BUZ, HIGH); delay(100); digitalWrite(BUZ, LOW); } while (mlx.readObjectTempC() > 30.0); // ждем пока уберут текущий объект измерений delay(2000); digitalWrite(RED, LOW); digitalWrite(GREEN, LOW); blank(); } delay(500); } void blank() { // очистка индикатора (прочерки) data[0] = 0b01000000; data[1] = 0b01000000; data[2] = 0b01000000; data[3] = 0b01000000; display.setSegments(data); } void disp(float a) { // вывод на экран температуры byte b = a; int c = a * 10; data[0] = display.encodeDigit(b / 10); data[1] = display.encodeDigit(b % 10) | 0b10000000; data[2] = display.encodeDigit(c % 10); data[3] = 0b00111001; display.setSegments(data); }
Логика работы следующая. Устройство ждет, пока в зону его наблюдения попадет объект теплее 30 градусов, после чего немного выждав, пропуская переходный период, выдает результат на индикатор, сопровождая это либо зеленой, либо красной подсветкой. Далее “градусник” ждет, пока пациент покинет зону наблюдения и с нетерпением ожидает следующего.Проверяем, работает. Непродолжительные испытания показали, что наиболее точные и стабильные результаты получаются при наведении сенсора на лоб, но и температура на запястье немногим уступает лбу в достоверности.
Необходимы комплектующие для Arduino?
Купить ардуино можно в нашем магазине 3DIY
Вывод
Бесконтактный температурный сенсор GY-906 на базе MLX90614 представляет собой компактное, надежное, недорогое и достаточно точное устройство с максимально простым интерфейсом и подключением. Огромный диапазон измеряемых температур, ряд отличающихся разновидностей и настройки под конкретные задачи дают возможность применять датчик в большом количестве разноплановых проектов, в которых требуется контроль температуры. Знать и уметь им пользоваться должен каждый уважающий себя DIY-мастер.FAQ
Можно ли доверять показаниям датчика с точки зрения медицины?Датчик, используемый в нашем проекте имеет точность в пределах 0,5 градуса Цельсия и не обладает медицинской сертификацией, а потому не может быть однозначно рекомендован для использования в медицинских учреждениях. В продаже существуют существуют специализированные модели с более высокой точностью расчета температуры (до 0,02 градусов), однако их цена в несколько раз выше стандартных. В маркировке таких изделий первой гордо стоит буква D. Для бытового применения вполне достаточно того, что использован в данном проекте, найти человека с повышенной температурой он способен довольно уверенно.
5-10 см достаточно небольшое расстояние, можно ли его увеличить?
Да, существуют длиннофокусные датчики с углом обзора 10 градусов, которые уверенно снимают показания с площади лба на расстоянии 30-40 см. Однако, кроме того, что они заметно дороже и габаритнее, следует дополнительно озадачиться точным наведением на цель. Если в объектив попадет лишь часть лба (или запястья), показания будут занижены.
Для чего в сенсоре датчик температуры воздуха?
Его можно применять как отдельно, так и совместно с основным. Например, для расчета порога срабатывания. В нашем проекте, с той программой что есть, при температуре окружающей среды выше 30 градусов, устройство будет работать некорректно. В идеале надо учитывать все обстоятельства.
Сколько сенсоров можно использовать одновременно?
Производитель обещает, что к одному SPI-порту можно подключать одновременно до 127 сенсоров GY-906.