ФОРУМ КУПИТЬ

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

ВСЕ СТАТЬИ

Про датчик освещенности BH1750. Что, опять? Да...

06/09/2016 10:36:22

Про аналоговые датчики освещенности, подключаемые к АЦП-портам, я уже писал: статья про P550, статья про TEMT6000. Для домашней автоматизации дешевый и простой датчик TEMT600 подходит весьма неплохо. Его достоинство - датчик умеет отличать пасмурную погоду от яркого солнца. Недостаток - датчик, несмотря на пометку "Adapted to human eye responsivity" практически не различает поздние сумерки от кромешной тьмы. Может быть, на рынке существуют более продвинутые решения? В этот раз попробуем датчик BH1750FVI.

Датчик освещенности BH1750

Основное отличие датчика 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, куда и как отправляет эти данные. Вопрос поставлен не совсем корректно. Опишите задачу, для которой время замера может иметь значение.