ФОРУМ КУПИТЬ

Последние статьи

ВСЕ СТАТЬИ

Сбылась мечта идиота? Тестирование сенсоров TSL2591 и MAX44009

10/11/2016 16:17:45

О датчиках освещенности я писал много: тестирование TEMT6000, тестирование BH1750FVI и, наверное, уже изрядно надоел с этим. Все протестированные мною датчики вполне удовлетворительно справлялись со своей задачей, но одна проблема все же не давала мне покоя. Дело в том, что опробованные сенсоры практически не различали сумерки. При низкой освещенности, когда человеческий глаз может не просто ориентироваться в пространстве, но даже различать буквы напечатанные на листке бумаги, датчики рапортовали "0". Фактически это означало, что при использовании сенсоров в системах домашней автоматизации для управления, например, уличным освещением, свет включался раньше необходимого, а выключался позже. Эта разница была всего в несколько минут, но тем не менее... Нездоровый перфекционизм заставлял искать новые решения.


TSL2591

И вот однажды я натолкнулся на интересный сенсор TSL2591, разработанный компанией AMS (и продвигаемый магазином Adafruit). Главной особенностью датчика является комбинация двух фотодиодов, один из которых чувствителен к широкому спектру (видимый + ИК), а другой только к ИК. Такая конфигурация фотодиодов позволяет с использованием определенной эмпирической формулы вычислять уровень освещенности, приближенный к восприятию человеческого глаза, учитывая ИК составляющую. Кроме того, производитель заявил динамический диапазон 600М:1 и чувствительность от 188 uLux до 88000 Lux. Таким образом, по заверениям Adafruit, мы можем получать значение освещенности с точностью до 6 знака после запятой. Работает датчик по протоколу I2C.


Датчик TSL2591

Для подключения датчика можно использовать MegaD-328 + MegaD-14-IN или MegaD-2561. В качестве программного компонента - библиотека I2C-PHP.
В текущий момент я нашел две версии распаянных плат с датчиком: от Adafruit и от известной китайской фирмы Unknown. Обе платы позволяют задействовать питание +3,3В, но у чисто китайской разработки питание +3,3В и линии SCL/SDA разнесены на разные "гребенки", что слегка усложняет подключение.

Получение данных от датчика типичное для I2C-PHP

<?
define("SCL", "30");
define("SDA", "31");
define("MD", "http://192.168.0.14/sec/?");
require_once("mod_i2c_tsl2591.php");
$lux = get_lux();
echo "Lux: $lux";
?>

Формула, которая реализована в драйвере mod_i2c_tsl2591.php отдает значение уже в Люксах. Но у меня был еще один датчик, который также выдавал показания в Люксах. Это BH1750FVI, поэтому логичным было бы сравнить их работу в реальных условиях, что я и сделал.

Красный график - TSL2591 (настройки > Medium Gain, 100 ms Integration time)
Зеленый график - BH1750FVI


TSL2591 vs BH1750FVI

На примере облачного (облака не в Интернете, а в небе) ноябрьского утра мы видим практически идентичную работу двух датчиков. Значения в Люксах, полученные от TSL2591 в сравнении с BH1750FVI чуть ниже, что логично, ведь датчик отбрасывает ИК составляющую. Но в целом форма графиков почти совпадает на всем временном отрезке. Здесь я не ждал каких-либо сюрпризов. Однако больше всего меня интересовал отрезок времени, когда датчики показывали минимальное значение, когда ночь уступало место утру. И вот, посмотрите...


TSL2591 начинает фиксировать наличие света раньше!

На графике мы хорошо можем видеть, что TSL2591 (в режиме Medium Gain - это важно!) увидел свет на 15 минут раньше. Сенсор BH1750FVI не умеет выдавать дробные значения. За 0 Lux, у него сразу идет 1 Lux. Все то время, пока более простой и дешевый BH1750FVI сообщал о 0 Lux, сенсор TSL2591 сначала зафиксировал 0,04 Lux, затем 0,05 Lux, а следом 0.11 Lux. Примечательно, что 1 Lux сенсоры зафиксировали одновременно.

Gain, Integration time и половник дёгтя

Результаты, которые описаны выше, были получены при следующих настройках: Medium Gain, 100ms Integration time.
Разрешающая способность датчика может быть существенно выше при использовании High gain mode или Maximum gain mode и времени конвертации не 100мс, а 600мс. Теоретически при максимальных параметрах можно попробовать измерять свет от звездного неба. Настройки датчика можно менять налету. Но! При средних и высоких значениях Gain датчик выдает некорректные результаты при высокой освещенности. Так, например, при установке Medium Gain, фактически невозможно измерять освещенность выше 2000-2300 люкс. Если установить Low Gain, то датчик измеряет освещенность корректно во всем диапазоне, но при этом в условиях низкой освещенности 0-20 люкс его показания не отличаются точностью. Реальная точность при таких условиях +- 2-3 люкс, что весьма много. Для простоты можно всегда использовать Low Gain, но в этом режиме TSL2591 мало чем отличается от BH1750FVI. Чтобы получить действительно точные результаты во всем диапазоне, нужно программно переключать Gain в зависимости от уровня освещенности. А эта задача не такая простая, как может показаться. Самостоятельно в автоматическом режиме TSL2591 этого сделать не может.

 

MAX44009

Спустя некоторое время пользователи форума посоветовали протестировать еще один датчик, работающий по шине I2C - MAX44009. При схожих параметрах (0.045 - 188000 люкс) этот датчик от известной компании Maxim существенно дешевле.

MAX44009
Датчик MAX44009

В отличие от TSL2591 отличительной особеностью MAX44009 является возможность работы в автоматическом режиме, когда датчик самостоятельно изменяет настройки измерения в зависимости от освещенности. Контроллеру остается лишь считать готовые данные, используя очень простую процедуру конвертации полученных значений в люксы. Напомню, что для рассчета люксов для датчика TSL2591 применяются эмпирические коэффициенты и более сложные формулы.


Сравнительное тестирование MAX44009 и TSL2591

Красный график - TSL2591 (настройки > Low Gain, 100 ms Integration time)
Зеленый график - MAX44009


MAX44009 считает, что люксов больше

На изображении мы видим, что форма графиков практически полностью совпадает. И TSL2591 и MAX44009 реагируют на изменение освещенности аналогично. Но с MAX44009 люксов получается больше. К сожалению в отсутствии какого-то эталона трудно сказать, какие значения более правильные. Чисто субъективно доверя к компании Maxim больше, да и BH1750 также показывал люксов больше.

А на этом изображении мы можем наблюдать плавный график нарастания освещенности, полученный с помощью MAX44009 в режиме AUTO. А вот TSL2591, который работает с настройкой Low Gain, низкую освещенности прогнозируемо отображает ступенчато. Полагаю, что с настройками High Gain точность измерений TSL2591 при низкой освещенности будет даже выше, чем у MAX44009, но в силу относительной сложности реализации автопереключения в прошивке контроллера, данное изображение демонстрирует, какие данные будут получены от датчика TSL2591 с помощью MegaD-2561. Для того, чтобы дать пользователю корректные данные во всем диапазоне измерения, в прошивке реализована работа с TSL2591 только в режиме Low Gain.

А вот тот же график (MAX44009), фиксирующий ранний рассвет на временном промежутке в 20 минут. Считывание данных происходило раз в минуту. Видно, как плавно и ровно изменяются значения без намека на колебания.

Таким образом, MAX44009 можно предварительно считать оптимальным решением для измерения освещенности в домашней автоматизации. И если у TSL2591 имеется существенный недостаток в виде крайне высокой стоимости, то MAX44009 лишен этой проблемы. Эти датчики можно купить вполне по демократичным ценам (150-220 руб).

Библиотека I2C-PHP с поддержкой TSL2591


 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



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

(необязательно, не отображается на сайте)


Сортировка комментариев: Последние сверху | Первые сверху

2016-11-11 17:21:42 | Владимир
датчик дороже, но обычно его требуется всего 1 шт.


2016-11-12 12:20:06 | Михаил
Андрей, сделайте пожалуйста чтобы I2C датчики, подключенные к MegaD можно было увидеть в openhab.


2016-11-12 14:12:37 | Andrey_B
Михаил, для работы с I2C-устройствами необходима дополнительная программная поддержка со стороны сервера. Например, библиотека I2C-PHP и "драйверы" к ней. Поэтому нужно адресовать вопрос разработчикам OpenHAB. Существует пока только один датчик, который полностью аппаратно поддерживается контроллером MegaD-2561 - это HTU21D. Этот датчик можно интегрировать в серверное ПО без специальной программной поддержки. В перспективе планируется увеличить перечень аппаратно поддерживаемых устройств контроллером MegaD-2561. Но для этого необходимо определиться какие датчики для этого подходят больше.


2016-11-14 10:13:05 | Виктор
Добрый день, а что скажете по поводу датчика TSL2561
Вроде дешевле, и тоже в двух диапазонах измеряет. А в чем разница между ними?


2016-11-14 12:08:26 | Andrey_B
Виктор, я не тестировал TLS2561, но вот, что пишет о TLS2591 adafruit:
"This sensor is much like the TSL2561 but with a wider range".


2019-03-16 10:33:30 | Максим Владимирович
Добрый день Андрей, не тестировали случаем OPT3001?


2019-03-16 11:43:15 | Andrey_B
Максим Владимирович, не тестировал, но спасибо за наводку - обязательно попробую.


2020-03-18 08:08:08 | Владимир
Андрей, а имеется подобный драйвер для MAX44009 ?
Я попытался написать свой, но при посылке 0x03 всегда получаю FF.
Пробовал посылать 0х04 и 0х03 для старшего и младшего байта, по аналогии как делают на C++, но тоже получаю в ответ FF FF

Единственный вариант, который сработал это посылка:
0x94 (адрес чипа как я понимаю), а затем посылка 0х95 в этом случаем случае микросхема возвращает значение, которое меняется в зависимости от освещения. Но старший и младший байт я так и не смог получить таким способом и в комбинации с вышеприведенным. А это как я понимаю нужно для вычисления LUX.


2020-03-18 09:52:56 | Andrey_B
Владимир, так как контроллер MegaD-2561 поддерживает MAX44009 на уровне прошивки, вроде бы нет никакого смысла писать программный драйвер. Я не писал.


2020-03-18 14:30:35 | Владимир
А 328 не поддерживает ) Я для него делаю


2020-06-29 23:37:33 | Александр
Добрый день! Возможно ли использовать эти датчики освещенности для измерения отдельного модулированного сигнала света? Возможно ли синхронизировать с генератором модуляции?


2020-07-02 22:29:22 | Andrey_B
Александр, извините, но не готов ответить на такой вопрос.


2021-02-18 12:16:25 | Александр
Добрый день, подключил датчик MAX44009
P30/ON, Type, I2C, Mode SCL
P31, lux:0.00, Type I2C, Mode SDA, SCL 30, Cat Light, Dev MAX44009,
VIN на +3.3, данные Lux не меняются, что я мог не так сделать?


2021-02-18 13:52:42 | Andrey_B
Александр, необходимо, чтобы датчик отзывался на процедуру сканирования (Scan) и отображал свой адрес. Если этого не происходит, то чаще всего ошибка где-то в подключении или в надежности контактов. Неисправность датчика также возможна, но это чрезвычайно редкая ситуация.


2021-05-08 15:36:30 | Виталий
Стал замечать, что если раньше пасмурный день был около 500ед, то теперь пляшет у 25, на которые у меня были настроены "сумерки". У этого датчика есть срок годности?


2021-05-08 22:10:49 | Andrey_B
Виталий, не думаю, что у этих датчиков есть срок годности. Я не совсем понял, о каком именно датчике вы спрашиваете, но MAX44009 я использую уже несколько лет. Показания всегда одинаковые. Не дрейфуют. Не слышал и лично не сталкивался с таким явлением у датчиков освещенности.


2021-05-10 22:03:04 | Виталий
Андрей, спасибо за ответ! Всё как всегда банально. В эти выходные смог пробраться к окну котельной, где на стекле был закреплен малярным скотчем датчик. Скотч за пару лет высох и отвалился, поэтому датчик лежал на подоконнике. И конечно, показания уже не те, что были, когда он был закреплен на стекле. Вернул датчик на прежнее место, пока опять также на новый кусок малярного скотча. Нет ничего более постоянного чем временное( Продумаю что можно использовать как кронштейн.


2021-05-19 17:37:16 | Дмитрий
Спасибо за хороший обзор. Как раз колебался с выбором.


2021-08-08 08:16:02 | Сергей
Добрый день! Датчик max44009 подключен к меге 2561 прошивка (fw: 4.49b5). Датчик опрашиваю раз в две минуты. Иногда бывают значения N/A , а ночью иногда выдает значения более 35000.0. (значение фиксированное что-то вроде 37656.05). Что нужно проверить. Пробовал два датчика уже. Провода проверял.


2021-08-08 12:44:55 | Andrey_B
Сергей, отображение NA и некорректных значений скорее всего указывает на проблемы в передаче данных по шине. Причин тому может быть много.
1. Ненадежные контакты, коррозия контактов, недостаточная герметизация.
2. Неправильный кабель (лучше использовать неэкранированную медную UTP).
3. Неправильное подключение к кабелю. Линия SCL должна быть свита с GND, а линия SDA с питанием Vcc.
4. Если используется экранированная UTP, то экран нужно подключать к заземлению (настоящему заземлению) максимально близко к контроллеру.
5. Слишком длинная линия (более 25-30 метров). В таких случаях иногда помогает уменьшение номинала подтяжки (подстроечным резистором, как в MegaD-14-IOR или внешним резистором).
6. Наличие рядом мощных электромагнитных помех (электродвигателей, срабатывающих контакторов и т.д.).
В любом случае, при использовании сервера некорректные значения могут и должны фильтроваться. Это нормально, когда время от времени могут проскакивать такие значения. Более того, сервер может несколько раз запрашивать значение с паузой в пару секунд, отбрасывать явно ошибочные, а остальные усреднять. Только тогда можно говорить о максимально приближенной к реальности картине. Тогда и график будет плавнее и интерпретация значений более объективная.


2021-08-12 01:05:59 | Сергей
Описанное мной происходит только в ночное время. Только когда моло света на датчике MAX44009 Lux: NA или более 35000.
По совету завел обработчик ошибок и перезапроса значений. Пока все работает. Линия менее 3м, подключен через UTP. Помех рядом нет.


2021-08-21 23:39:06 | Сергей
Доброго времени суток! Закаывал на сайте партию датчиков max44009. Сейчас возникла проблема, после непродолжительной работы Мега определяет адрес датчика как 0x4b и все . Значений нет. Как выставить адрес в 0x4a ? В инете не нашел, пишут, что нужно использовать перемычку.


2021-08-22 08:17:26 | Сергей
Отпишусь . Проблему решил. Оказалось на датчиках не выставлен адре . Адрес выставляется пропайкой. 0x4a или 0x4b. От этого Мега не могла определить где он ( он один на шине) пропаял и все отлично. На датчике vcc, gnd, sda, scl . А ещё есть a0 и int. На картинках эти отверстия не подписаны( см картинку в статье). Датчик нужно перевернуть, там три нашлепки. Нужно спаять две : либо верхнюю и среднюю, либо нижнюю и среднюю. Верхняя даёт 0x4a. Нижняя соответственно 0x4b


2021-08-22 10:52:15 | Andrey_B
Сергей, вы совершенно правы. Попалась партия без запаянной перемычки адреса. Соответственно пин выбора адреса болтался в воздухе и адрес принимал произвольное значение. Исправили, запаяли перемычку для всех датчиков, которые есть на складе.