Последние статьи
- Твердотельный датчик направления и скорости ветра. Эксперимент
- iPhone на стене в качестве панели управления домом
- MegaD-16M-XT - подсветка выключателей и не только
- Переделка выключателей в кнопки и мини-обзор текущего рынка
- RadSens - модульный счетчик Гейгера с интерфейсом I2C
- "U" - значит универсальный. Обзор модуля MegaD-16U-XT
- SCD4x - современная альтернатива для измерения концентрации CO2
- HTU31D - новый датчик температуры и влажности с нагревательным элементом
- Измерение коэффициента пульсации ламп с помощью MegaD-2561
- Использование солнечных панелей в качестве датчика освещенности
- Согласование датчиков с выходом типа TTL со стандартными входами контроллера
- DPS368 - датчик атмосферного давления индустриального класса повышенной точности
- DS18B20 Waterpoof - импортзамещение
- TMP117 - высокоточный датчик температуры с интерфейсом I2C
- MegaD-16R-XT - расширитель на 16 релейных выходов
- MegaD-2561-RTC V3 - больше портов, зуммер и ИОН
Про датчик освещенности BH1750. Что, опять? Да...
06/09/2016 10:36:22
Про аналоговые датчики освещенности, подключаемые к АЦП-портам, я уже писал: статья про P550, статья про TEMT6000. Для домашней автоматизации дешевый и простой датчик TEMT600 подходит весьма неплохо. Его достоинство - датчик умеет отличать пасмурную погоду от яркого солнца. Недостаток - датчик, несмотря на пометку "Adapted to human eye responsivity" практически не различает поздние сумерки от кромешной тьмы. Может быть, на рынке существуют более продвинутые решения? В этот раз попробуем датчик BH1750FVI.
Основное отличие датчика BH1750FVI заключается в том, что он не аналоговый (его бесполезно подключать к АЦП-портам), а цифровой и работает по шине I2C. Он также как TEMT6000 адаптирован под человеческое зрение: "Spectral responsibility is approximately human eye response". Кроме того, датчик отображает освещенность не в "попугаях" (как любые аналоговые датчики), а сразу в Люксах (Lux).
По правде сказать, для задач, которые решаются в системах домашней автоматизации, единицы измерения, "попугаи" это или Люксы, особого значения не имеют. Гораздо важнее иметь широкий динамический диапазон в области низкой освещенности, чтобы правильно определять момент включения или выключения света. Глаз человека - удивительный прибор. Когда иные датчики показывают "по нулям", глаза могут вполне различать буквы в книге. С этой точки зрения, а также учитывая текущие цены на электричество, плохо, когда свет включается слишком рано или выключается слишком поздно. Одним словом, пора протестировать датчик BH1750FVI в различных условиях.
Для подключения датчика BH1750FVI я в этот раз использовал новый контроллер MegaD-2561. Датчик можно подключить как непосредственно к контроллеру MegaD-2561 (блок зеленых клеммников), так и к любым портам исполнительного модуля MegaD-14-IN. Поскольку датчик BH1750FVI работает по шине I2C, то необходимо задействовать два порта (например): SCL - P30, SDA - P31.
Питание я взял от модуля контроллера. Датчик прекрасно работает от +3,3В. Важной особенностью BH1750FVI является то, что на одну шину можно повесить два датчика. Для этого у датчика выведен специальный провод. Если он болтается в воздухе (как на фото), то адрес один, а если подключен к питанию, то другой.
Чтобы получить данные от датчика я написал драйвер для библиотеки I2C-PHP. Программа, считывающая значения, выглядит следующим образом.
<? define("SCL", "30"); define("SDA", "31"); define("MD", "http://192.168.0.14/sec/?"); require_once("mod_i2c_bh1750.php"); $lux = get_lux(); echo "Lux: $lux"; ?>
Посмотрим, что же получилось... Прежде всего, стоит сказать, что если для аналоговых датчиков диапазон значений находится в области 0-1023, то для BH1750FVI этот диапазон намного шине: 0-54612. Поэтому привожу два графика отдельно. Итак, сентябрьский день. Переменная облачность.
BH1750FVI
TEMT6000
Очень интересная картина, правда? Прежде всего, поясню, что за исследуемый период солнце выходило из-за облаков два раза. Это отчетливо видно на графиках. Оба датчика зафиксировали эту ситуацию, но совершенно по-разному. Если аналоговый TEMT6000 зафиксировал облачно как "995", а ясно как "1015", одним словом, изменил свое значение всего на 2% (!), то цифровой BH1750FVI сработал принципиально иначе. Облачно в его понимании - это 3000-5000 lux, а ясно уже 17000-27000 lux! Разница чуть не на порядок. На графике BH1750FVI мы отчетливо видим, что второй выход солнца из-за тучек был не таким ярким. TEMT6000 действительно "видит" разницу в освещенности, но гораздо хуже. В этом смысле BH1750FVI не только способен вполне определенно различить пасмурный и ясный день, но и показать отдельные нюансы (дымку, легкую облачность). А теперь, чтобы продемонстрировать вышесказанное приведу те же два графика, но уже за более длительный период измерений.
BH1750FVI. По-прежнему видим, когда прояснялась погода
TEMT6000. Пожалуй, мало что можем сказать об изменении освещенности днем
BH1750FVI прекрасно замеряет освещенность в широком диапазоне. График освещенности, который построен с использованием этого датчика, выглядит более правдоподобным. Посмотрите, как ведет себя TEMT6000. В определенный момент времени красный график резко идет вниз. Но в действительности солнце заходило плавно и никаких резких колебаний в освещенности в этот день больше не было. В этом смысле на зеленом графике, полученным от BH1750FVI, мы видим плавное и пологое снижение освещенности, как оно в действительности и было. Таким образом, чувствительность TEMT6000 не совсем линейная или во всяком случае не совпадает с восприятием человеческого глаза, тогда как показания BH1750FVI весьма точно совпадают с субъективным ощущением освещенности.
Это все замечательно. Используя BH1750FVI, можно строить достаточно правдоподобные графики изменения освещенности, даже судить по форме кривой о погоде. Но как этот датчик работает в условиях низкой освещенности. Отличается ли он в этом отношении от простого аналогового TEMT6000? А вот...
BH1750FVI
TEMT6000
Увы! В то время, как глаз еще отчетливо различал предметы, оба датчика показали 0... BH1750FVI сделал это всего лишь на пару минут позже. Одним словом, с точки зрения фиксации факта наступления темноты/рассвета оба датчика работают примерно одинаково. Отличие лишь в том, что цифровой BH1750FVI выдает более предсказуемые значения, по которым можно построить более плавный график, в то время как связка аналоговый TEMT6000 - АЦП порт atmega2561 во всем диапазоне имеет определенный "дрейф", "люфт", в результате которого график имеет множество зубчиков.
В целом датчик BH1750FVI с точки зрения определения уровня освещенности превосходит TEMT6000, особенно при ярком освещении, но требует 2 порта MegaD-328/2561 и программной поддержки (I2C) со стороны сервера.
Ну и напоследок архив с исходными кодами на PHP с библиотекой I2C-PHP для MegaD-328/2561 и драйвером для BH1750FVI.
Исходники I2C-PHP для BH1750FVI
Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.
Добавить комментарий:
Сортировка комментариев: Последние сверху | Первые сверху
2018-04-30 14:15:25 | Виктор
Огромное спасибо за статью. Уже неделю бьюсь с этой задачей и никак не мог найти достойного решения!!!
2018-04-30 15:20:50 | Andrey_B
Виктор, посмотрите еще вот эту статью.
2018-10-18 14:39:53 | Андрей Сафронов
Добрый день!
Подскажите пожалуйста, может встречали в Вашей практике. Установил на кровле датчик BH1750, подключил напрямую к Меге2561. Пока датчик лежал внутри (я искал оптимальную длину кабеля) показания были хоть как то похожи на истину в моем представлении - в неосвещенном коридоре около 500 люкс, в освещенной гостиной 15000.... Вынес на кровлю - и поймал показания lux:4294946271..... Датчик спрятан под прозрачную пластиковую крышку, расположен, естественно, под прямыми солнечными лучами... Есть какие нибудь идеи по этому поводу? Не переносить же его в тень.....
2018-10-19 10:06:02 | Andrey_B
Андрей, а он такие показания показывает только под прямыми солнечными лучами или всегда? Думаю, что скорее всего причина в другом - слишком большое расстояние до контроллера или что-то не так с подключением.
2018-10-19 10:23:24 | Андрей Сафронов
Андрей, спасибо за оперативность! :)
Показания такие датчик выдавал только когда солнце стояло в зените, как стало вечереть - показания пришли в норму. Сегодня поставил писаться график освещенности - вечером посмотрим на результат.
По поводу длины кабели - проверял я его на 23 метрах витой пары (питание и SDA SCL разведены по-парно) - все работало вполне корректно. Сейчас длина кабеля около 6 метров. На этом же куске кабеля висит BMP180 (установлены в одной коробочке).
2018-10-19 11:41:48 | Andrey_B
Андрей, если такие значения получаются только при прямых солнечных лучах, тогда возможна проблема в прошивке. Проверю.
2018-10-19 11:43:22 | Андрей Сафронов
Спасибо.
Как раз сейчас данная ситуация повторилась. Освещенность плавно нарастала до уровня 25590 люкс и затем произошел заброс показаний до заоблачных величин. Продолжаю вести наблюдение :)
Прошивка - fw: 4.29b5
2018-10-19 12:17:34 | Andrey_B
Андрей, исправил в 4.30b3.
2018-10-19 12:20:53 | Андрей Сафронов
Спасибо еще раз!
Вечером перепрошьюсь и обязательно отпишусь :)
2018-10-19 12:55:39 | Андрей Сафронов
Не вынесла душа IT-шника томительного ожидания :) и перепрошил я мегу удаленно (хоть и зарекался так не делать) - все заработало корректно!!!
Спасибо большое!!!
2019-03-07 11:54:31 | Valentinych
Ребята, кто-нибудь оценивал быстродействие этого (и других) датчика освещенности? Какое у него минимальное время преобразования (оцифровки)?
2019-03-07 13:09:20 | Andrey_B
Valentinych, все параметры датчиков, в том числе время измерения, указаны в Datasheet'ах. Но само по себе это значение мало о чем говорит. Важно также, с какой периодичностью упрашивает датчик MCU, куда и как отправляет эти данные. Вопрос поставлен не совсем корректно. Опишите задачу, для которой время замера может иметь значение.