Андрей Смирнов
Время чтения: ~20 мин.
Просмотров: 10

Как подключить датчик освещённости BH1750 к Arduino

HTB16BlVHpXXXXbkXpXXq6xXFXXXL.jpg

  • Цена: $1.30

Здоровья всем читателям Муськи! Неоднократно делал для дома и аквариумов разные светильники на галогенках, ЛЛ и светодиодах. И в какой-то момент понял, что не помешало бы иметь хотя бы простейший приборчик для количественного сравнения светильников, ибо человеческий глаз ну очень не стабильный измеритель. Если светильники включать не одновременно, то глаз адаптируется и освещенность отличающаяся даже не в разы, а на порядки, кажется одинаковой. Но потом оказывается, что под этим светом не получается различить мелкие детали, цвета, а в аквариуме трава не растет. Но тратиться на нормальный прибор для домашнего применения пару раз в год казалось излишеством. И тут как нельзя кстати оказались обзоры самодельных люксметров на дешевом датчике BH1750FVI (datasheet), который выдает уровень освещенности прямо в люксах, да еще с приличной точностью. Замечательно — прибор делаем сами, заодно изучив новые технологии. В обзоре помимо конструкции люксметра расскажу об отличиях двух модулей датчиков и будет некоторый ликбез по шине I2C. Аналогичные люксметры на таком же датчике собирались вот в этих обзорах, которыми я и вдохновлялся:Приборный корпус с ТАОБАО и самодельный люксметр в нем.Люксометр за 80 рублей. Часть 1Люксометр за 80 рублей. Часть 2. Сравнение с Extech 407026 Однако, по-моему, осталась некоторая недосказанность по вопросам: — в продаже присутствуют почти одинаковые модули CY-30 и CY-302 на одном том же датчике BH1750FVI. Чем они отличаются и который лучше купить? — датчик работает от 3.3В, микроконтроллер как правило от 5В, для их связи на модулях применены разные схемы преобразования уровней сигналов. В чем их отличия и какие могут быть проблемы? Я купил оба модуля (благо стоят недорого) для изучения и возможности сравнить показания хотя бы между собой.Покупка7f64ab.png

Модуль CY-302

Применялся в приведенных выше обзорах, габариты платы вдвое меньше у CY-30, деталей напаяно меньше.3bc881.jpg Схема модуля Входное напряжение 5В понижается линейным стабилизатором с маркировкой 662К (datasheet) до 3.3В для питания датчика. Линии данных SDA и SCL просто подтянуты к 3.3В резисторами 4.7К. Преобразователь уровня по сути отсутствует. Безопасно ли подключать к ним выводы 5В микроконтроллера рассмотрим ниже.

Модуль CY-30

Больше габаритами, больше радиодеталей. Схема модуля Все то же самое, плюс преобразование уровней сигналов SDA и SCL. Для линии SDA преобразование двунаправленное, на полевом транзисторе и двух резисторах, для линии SCL — однонаправленное, на диоде и резисторе. А нужен ли этот дополнительный обвес? Вон же работает у людей и без него!

Шина I2C

Про стандарт шины можно почитать:robocraft.ru/blog/communication/780.htmleasyelectronics.ru/interface-bus-iic-i2c.htmlru.wikipedia.org/wiki/I%C2%B2Cwww.gaw.ru/html.cgi/txt/interface/iic/index.htm Протокола обмена касаться не будем (для этого есть библиотеки), а рассмотрим более простой и важный для здоровья железок уровень физического подключения. Основы: — к шине подключаются устройства с выходом в режиме «с открытым коллектором» с образованием схемы «монтажное И», т.е. устройства могут: — слушать шину в режиме входа с высоким входным сопротивлением, — в режиме выхода притягивать шину к «земле», выдавая логический «0». — в уровень логической «1» шина возвращается сама при помощи подтягивающих резисторов, когда ни одно устройство не выдает «0»; — данные передаются в обе стороны по линии SDA; — синхроимпульсы по линии SCL выдаются только Мастером, а Slave-устройства эту линию только слушают. Это стандартно, а реально некоторые устройства (пример — датчик влажности SHT21) и эту линию используют как двунаправленную, для информирования другой стороны о своем состоянии. Отсюда следуют два важных следствия: 1. В схеме обязательно должны быть резисторы подтягивающие линии данных к «+» питания. 2. ЗАПРЕЩЕНА установка выхода в «1» (pinMode(OUTPUT), digitalWrite(HIGH) в Arduino; DDR=1, PORT=1 в AVR). Если другое устройство в это время «прижмет» линию к «земле», то будет КЗ и оба устройства выгорят! В случае питания устройств от одного напряжения местоположение подтягивающих резисторов значения не имеет — могут быть например на плате Arduino, на модуле датчика, или вообще — встроенные в микроконтроллер подтягивающие резисторы порта. А вот когда одно устройство питается от 5В, а другое от 3.3В, то без соответствующей развязки подтягивать шину к +5В уже нельзя — может выжечь ногу датчика, а то и 3.3В стабилизатор. Но если подтянуть шину на низкой стороне, к +3.3В, то запрет выдачи «1» идет нам на пользу — более высокое напряжение на нее уже никто не выдаст, а 3.3В даже 5В устройство воспримет как логическую «1» и все заработает и без преобразования уровней. Так сделано на «мелком» модуле CY-302. Однако, дополнительные схемы преобразования уровней дают преимущества: — повышается скорость и надежность передачи данных; — некоторые схемы попутно защищают от последствий ошибок при монтаже и программировании: не пропускают высокое напряжение на низкую сторону. А ведь на некоторых платах Arduino напаяны резисторы подтяжки SDA и SCL к +5В, а в некоторых версиях библиотеки Wire.h включаются встроенные в МК подтяжки на те же +5В. Не проследили этот момент — и прощай датчик! Про схемы преобразования уровней можно почитать:we.easyelectronics.ru/Shematech/soglasovanie-logicheskih-urovney-5v-i-33v-ustroystv.htmlplayground.arduino.cc/Main/I2CBi-directionalLevelShifterlearn.sparkfun.com/tutorials/using-the-logic-level-converter Таким образом, «мелкий» модуль CY-302 лучше применять в готовом устройстве, где гарантируется, что: — нет резисторов подтяжки на +5В; — в МК заранее загружена программа, в которой (а) не включаются встроенные подтяжки и (б) на выходы не подается «1». «Крупный» модуль CY-30 лучше применять с ардуинкой и при отладке на макетке: — в МК может запущена программа предыдущего проекта, где на эти выводы подключается подтяжка, а то и выдается логическая «1»; — резисторы подтяжки на +5В могли остаться на макетной плате от другого проекта; — разработчик (например ребенок) не в курсе, как устроена его плата Arduino и библиотека работы с I2C. В этих случаях встроенные преобразователи уровня спасут датчик. И хотя преобразователь на одном полевике не способен защитить от КЗ, но и в этом случает выручит то, что датчик выставляет «0» и передает данные только получив свой адрес. А подключение с выводу со статическими +5В для этого модуля безопасно.

Люксметр

Разобравшись с матчастью, приступаем к конструированию устройства. Требования к нему: 1. В качестве корпуса — небольшая распаечная коробка 75*75*20мм с «пеньком» самореза посередине. 2. Питание от литиевого аккумулятора BL-4C старого телефона Nokia. 3. Встроенная зарядка от micro-USB. 4. Кнопка включения и переключения режимов. 5. Отсутствие выключателя питания — коммутация питания транзисторами и использование Sleep режима микроконтроллера. 6. Два режима работы с разной настройкой датчика: a) медленные замеры с высоким разрешением и отображение только освещенности; б) замеры с максимальной частотой и расчет Min/Max/Avg значений и величины пульсации. Ставить целый дисплей в устройство, отображающее только 1 число показалось излишним и решил применить лежащую в загашнике матрицу семисегментных индикаторов FYQ-2541AS-11 (datasheet) с красным свечением и общими катодами. Индикатор оказался странным (отдельный знак «-» оказался справа, да еще электрически соединен с точкой над ним, у старшего разряда нет десятичной точки, а точки наверху не светятся), но нам подойдет. Выбираем микроконтроллер. У имеющихся ATtiny85 слишком мало ног, а добавлять отдельный драйвер для индикатора не хотелось. Arduino Pro Mini надо дорабатывать — удалить стабилизатор питания и светодиод, чтобы не разряжали аккумулятор при спящем МК. Отдельный чип ATmega328P — подходит идеально. Тактировать его будем на 1МГц от встроенной RC цепочки — высокая скорость не нужна (только лишний расход энергии), стабильность времени не важна. Схема получается весьма простая: Библиотечный элемент индикатора для Eagle нарисовал сам. Также сделал элемент для ATmega328P с ардуинскими обозначениями ног, вдруг решу в Arduino IDE программировать. Схема (кроме датчика) питается напрямую от литиевого акумулятора. Стабилизировать напряжение нет никакой нужды, лишний расход деталей и энергии. В процессе разряда 4.2-3.0В только слегка меняется яркость индикатора. Можно было запитать всю схему от 3.3В, но стабилизатор на модуле датчика не потянет по току, а дополнительный нафиг не нужен. Кстати, проводил эксперименты — ATmega328P стабильно работал и при 1.5В, светодиоды гасли, а МК молотил как ни в чем ни бывало. Для зарядки аккумулятора взят «народный» модуль на TP4056. Датчик подключается через двунаправленные преобразователи уровня на транзисторах Q6, Q7. Можно было не делать, но пусть будут — вдруг решу поменять датчик и они понадобятся. Для работы преобразователей нужно питание 3.3В, оно добыто на выводах резисторов 472 модуля (со стороны датчика) и проводом сквозь дырку Addr прокинуто на плату устройства. Транзистор Q8 вырубает питание датчика. Матрица анодами через токоограничивающие резисторы подключается к порту D микроконтроллера (D0-D7 ардуины). Сегменты A-G всех разрядов уже соединены внутри с расчетом на динамическую индикацию, к ним же подключаем точки, как пятый «разряд». Общие катоды (разряды) через транзисторы Q1-Q5 замыкаются на землю по сигналу с порта B (D8-D12 ардуины). Подключать напрямую к МК (как делают некоторые ардуинщики) не рискнул — 175мА даже импульсного тока для одной ноги МК многовато. Кнопка подключена также к порту D (D2 ардуины), поскольку это одна из двух ног, которая может генерировать прерывание и будить МК из спячки. Ток и ограничивающие резисторы рассчитывал так: Подходящая яркость на 4.2В достигается при 5мА с резистором 500 Ом. При динамической индикации на 5 разрядов (ШИМ 1:5) для сохранения той же яркости ток надо увеличить в 5 раз — значит резисторы 100 Ом. Однако, при импульсном питании свечение светодиодов кажется ярче, чем при постоянном и берем резисторы на 130 Ом. Программирование производится через гребенку ICSP программатором USBasp (можно использовать Arduino как программатор). Мучиться с макеткой и клубком проводков при удобстве ЛУТа неохота. Разводим в Eagle плату под размер корпуса. Используем выводные резисторы для возможности провести дороги между ног. Но из-за навороченного подключения индикатора сделать одностороннюю плату без десятка перемычек все равно не вышло.ПлатаВерх: Низ: Для ЛУТ (600dpi):yadi.sk/i/ErKI8iW9zNxgEНапаиваем детали. Датчик решил разместить под 90 градусов к основной плате, чтобы можно было его направлять на источник как фонарик и не засвечивать индикатор.Низ Программировать решил в AVR Studio 4.19. Во-первых, было лениво изучать чего ардуинщики наворочали в библиотеках, а во-вторых, тормозной ардуинский digitalWrite мало пригоден для организации быстрой динамической индикации. Чтение кнопки и динамическая индикация на экране повешены на прерывания INT0 и 1мс таймера, чтение датчика и выбор чего показывать — в основном цикле. Удивило, что в стандартных библиотеках AVR не оказалось либы для I2C (в МК есть аппаратная поддержка, но ее изучим в другой раз) и использовал первую попавшуюся, с софтовым ногодрыгом. Ну и пусть себе дрыгает и delay’ит, больше то в главном цикле ничего и не делается, все остальное работает на прерываниях. Для общения с самим BH1750 с нужными 2 режимами никаких библиотек (а они есть, и с поддержкой всех режимов датчика) решил не использовать, чего уж там — 2 функции по 3 строки. Прошивка (исходники и hex):yadi.sk/d/2pWcDk2VzNzGf Фьюзы используются дефолтные для ATmega328P: 62 D9 В работе: Короткое нажатие кнопки переключает режим (только освещенность или Max/Avg/Min/Pulse). Что именно сейчас отображается говорят точки слева и точки/минус справа (похоже на %). Если люксов больше 9999 — вместо младшего разряда отображается тоже точки/минус справа. В основном режиме точность 1лк, время замера 120мс, период опроса 200мс. В режиме Max/Avg/Min/Pulse точность 4лк, время замера 16мс, период опроса 20мс. Но режим достаточно бестолковый — пульсации с частотой выше 50Гц (а по науке даже 25Гц) датчик заметить не в состоянии. Рекомендуемые на замену TSL2561 (12мс) и MAX44009 (6,5мс) не сильно то ушли от BH1750FVI и смысла менять датчик не вижу.Подсмотрел работу I2C шины: При долгом (>3c) нажатие кнопки, разряде аккумулятора ниже 3В, после 5 минут работы устройство обесточивает датчик, гасит экран и засыпает. Перед засыпанием и в течение нескольких секунд после пробуждения отображает напряжение аккумулятора. В состоянии сна МК мультиметр в режиме 2000мкА показывает потребление тока 0 мкА. За месяц напряжение на аккумуляторе не изменилось. Второй имеющийся модуль, GY-30, подключил к ардуине и загрузил простейший скетч для BH1750FVI. Расположенные рядом датчики показывали различающиеся в пределах 5% значения. Приборчиком доволен, теперь можно сравнивать лампочки.

ДОПОЛНЕНО 23.01.2017:

Задумал на досуге попроверять эффективность работы УЗ увлажнителя. Но гигрометра (кроме встроенного в сам увлажнитель) в хозяйстве не было. Поначалу хотел собрать на макетке из ардуинки и датчика DHT22, но взгляд упал на самодельный люксметр и решил сделать этот полезный показометр еще полезнее. Для подключения датчика влажности и температуры DHT22 достаточно питания и одной свободной ноги МК — три проводка и датчик подключен: Далее начинаем дорабатывать программу, и, как всегда, утыкаемся в ряд трудностей, про преодоление которых и хочу рассказать. Было доработано: 1. В знакогенератор добавлены символы «h» и «t» для отображения режима, LEDScreenPrint() обучен выводить отрицательные значения. 2. Добавлена библиотека DHT.h работы с датчиком влажности. 3. Добавлен (третий) режим работы, в который попадаем коротким нажатием кнопки и в котором поочередно отображаются влажность и температура. И если с п.1 и 3 никаких вопросов не возникло, то с библиотекой пришлось повозиться. Главный момент — общение с датчиком DHT22 происходит всего по одному проводу, нет отдельной линии синхронизации, а значит надежность чтения данных сильно зависит от протокола обмена и способности МК отмерять необходимые интервалы времени. А у нас МК работает на 1МГц от внутреннего RC-генератора, а значит тактовая частота не точная, да еще заметно плавает. Лезем в даташит на датчик и видим, что минимальный интервал, который надо замерить — 26мкс, а перед каждым битовым импульсом всегда следует пауза в 50мкс. Сам протокол дает возможность перед приемом каждого бита «подстроить» часы по длине паузы и нестабильность тактовой частоты уже не опасна. Накачал несколько разных библиотек, но ни одна не подходила по всем параметрам: 1) в одних МК отмеряет отрезки времени при помощи delay, а затем смотрит что там на входе — непригодно при нестабильной частоте и невозможно синхронизироваться по самому сигналу. 2) в других, например от Adafruit Industries, наоборот — МК непрерывно следит за входом засекая время между фронтами. Но автоподстройки по длительности паузы нет и здесь, а длина импульса сравнивается с некоторой предопределенной уставкой. Потому было решено доработать наиболее подходящий вариант — от Adafruit, всего то пара строчек дополнительного кода (сравниваем длину битового импульса не с уставкой, а с длиной предыдущей паузы) и все заработает и при сильно нестабильной частоте МК. Однако хватит ли вообще быстродействия в 1 МГц? Arduino то тактируется минимум на 8 МГц (3.3В версия). Для этого надо проанализировать код библиотеки. Замер интервала между фронтами и упаковка принятого бита занимают порядка 15 команд ассемблера, причем часть из них выполняются за 2-3 такта. А такт у нас 1мкс и значит замер 26мкс уже на пределе возможностей. Вывод — для надежной работы надо увеличивать частоту МК. Но напаивать кварц и конденсаторы не придется. Благо даже у встроенного генератора можно увеличить частоту до 8 МГц простой перепрошивкой фьюзов (сбросив бит CKDIV8). Дополнительно надо поправить задание F_CPU=8000000UL в свойствах проекта и увеличить на 8 предделитель таймера, чтобы время не ускорилось. В итоге, влажность и температура прочитались без проблем, освещенность читается как и раньше, а последствия разгона вылезли глюком там, где совсем не ожидал — перестало читаться напряжение питания, точнее стало выдавать в 2.5 раза меньше нормального. Замер напряжения питания без лишних деталей и расхода выводов был сделан с использованием функции vccRead из вот этой статьи. Вроде все просто, в Arduino с 16МГц кварцем — работает, с внутренним генератором на 1 МГц — работает, а на 8 МГц — работать перестало. Лезем в даташит на ATmega328 и изучаем работу с АЦП в разделе тактирования. Там английским по белому написано, что максимальная рабочая частота АЦП (с разрешением 10 бит) — 200 КГц. В функции vccRead делитель тактовой частоты для АЦП не задается. В Arduino его видимо определял фреймворк, а я его задать забыл вообще, а по умолчанию он равен /2. Т.е. раньше у меня АЦП работал на 500 КГц, и однако успешно работал! И на 4 МГц продолжил работать, но уже не так успешно. Для исправления добавляем в vccRead в инициализацию АЦП задание битов ADPS2, ADPS1, ADPS0 выставляющее предделитель /64, т.е. тактирование АЦП на 125 КГц и все заработало как надо. Версия прошивки с поддержкой DHT22 (исходники и hex):yadi.sk/d/zCT31Kn03AVEhB Фьюзы: E2 D9

Модуль GY-302 c датчиком BH1750

Arduino

На этот раз подключим цифровой 16-битный датчик освещённости BH1750 (люксометр), реализованный на модуле GY-302, к Arduino.

Нам понадобится:

  • Arduino UNO или иная совместимая плата;
  • модуль GY-302 с цифровым датчиком освещённости BH1750;
  • соединительные провода (вот хороший набор);
  • персональный компьютер со средой разработки Arduino IDE.

1Схема подключения датчика BH1750 к Arduino

Рассмотрим модуль GY-302 с сенсором BH1750. Сенсор BH1750 представляет собой цифровой 16-битный цифровой датчик освещённости, что задаёт диапазон его измерений: от 1 до 65535 люкс. Согласно техническому описанию, датчик BH1750 чувствителен к видимому свету и практически не подвержен влиянию инфракрасного излучения, т.е. реагирует примерно на тот же спектральный диапазон, что и человеческий глаз. Вследствие этого такие сенсоры получили широкое распространение в современной электронной аппаратуре – мобильных устройствах, фото- и видеокамерах, в системах «умный дом» и многих других.

Подключение модуля производится по двухпроводному интерфейсу I2C, а питание осуществляется от +5 В. Интерфейс I2C в платах Arduino реализован на аналоговых пинах A4 и A5, которые отвечают за SDA (шина данных) и SCL (шина тактирования), соответственно. Вывод ADDR модуля GY-302 можно оставить не подключённым или соединить с землёй.

Схема подключения модуля GY-302 с датчиком BH1750 к Arduino

2 Библиотека и скетчдля датчика BH1750

Не будем углубляться в тонкости реализации интерфейса взаимодействия датчика BH1750 с Arduino, а воспользуемся готовой библиотекой для BH1750. Скачанный архив распакуем в директорию со средой разработки Arduino IDE/libraries/.

Напишем вот такой скетч и загрузим его в Arduino.

В скетче мы каждые 100 мсек считываем с датчика BH1750 показания освещённости в люксах и выводим эти данные в последовательный порт.

3Сенсор BH1750 и Arduino в работе

Подключим датчик освещённости BH1750 к Arduino по приведённой выше схеме. Подключим Ардуино к компьютеру. Запустим среду разработки Arduino IDE и откроем монитор последовательного порта сочетанием клавиш Ctrl+Shift+M или через меню Инструменты. В мониторе последовательного порта побегут значения освещённости с нашего датчика BH1750.

Модуль GY-302 с датчиком BH1750 подключён к Arduino

Направьте датчик на источник света, потом закройте его от света, и вы увидите, как меняются показания.

4Взаимодействие с сенсором BH1750 в деталях

Давайте попробуем взаимодействовать с датчиком BH1750 без использования специальных библиотек. Для этого нам понадобится техническое описание на него, которое можно скачать по ссылке под статьёй.

Для управления датчиком мы должны по его I2C адресу записать код команды. Под управлением понимается изменение режима работы, изменение чувствительности, сброс и т.д. Команды можно передавать только по одной. Для чтения мы должны запросить из датчика 2 байта. Датчик хранит всегда значение в виде 16-битного числа, но его интерпретация зависит от текущей чувствительности.

Последовательность обмена с датчиком BH1750

На следующем рисунке представлен список команд, необходимых для работы с датчиком BH1750:

Команды управления датчиком BH1750

Как мы знаем, управление и обмен данными с датчиком BH1750 происходит по протоколу I2C. Мне нравится использовать для быстрых тестов общения с устройствами I2C и SPI отладочную плату с микросхемой FT2232H. Подключим SCL датчика к SCL микросхемы FT2232H, SDA датчика – к SDA и SDO микросхемы. Питание 5В возьмём с Arduino Nano, а все земли объединим.

Модуль с датчиком BH1750 управляется микросхемой FTDI

Теперь запустим программу SPI via FTDI и попробуем прочитать значения, хранящиеся в регистрах сенсора.

Чтение единичного показания датчика BH1750 с помощью FT2232H
Непрерывное считывание показаний датчика BH1750 с помощью FT2232H

Download attachments:

  • Скачать datasheet на BH1750(159 Downloads)

Last modified onПонедельник, 09 Сентябрь 2019 19:00 Read 19265 times

Содержание

  • Обзор
  • Технические характеристики модуля
  • Подключение
  • Пример использования
  • Часто задаваемые вопросы FAQ

Измерение освещенности  является важным параметром при создании приложений домашней автоматики и Интернета вещей. Освещенность измеряют в люксах (lx). Люкс равен освещённости поверхности площадью 1 м2 при световом потоке падающего на неё излучения, равном 1 лм. Самым распространенным датчиком измерения освещенности у любителей Arduino является фоторезистор аналоговый датчик, меняющий свое сопротивление в зависимости от интенсивности света, однако точность его невысока и значение от выдает не в люксах. В отличие от него, модуль GY302 на базе чипа BH1750 (рисунок 1), представляет собой высокоточный цифровой датчик интенсивности света, выдающий значение как раз в люксах.

datchik-intensivnosti-sveta-GY-302.jpg

Рисунок 1. Модуль GY-302 на базе чипа BH1750

Технические характеристики GY-302 (BH1750)

  • Напряжение питания — 5 В;
  • Интерфейс: I2C;
  • Чип: BH1750FVI;
  • АЦП: 16 бит;
  • Точность: 1 люкс;
  • Чувствительность: 65536 градаций;
  • Калибровка: не требуется;
  • Размеры: 19 х 13 х 2 мм;
  • Вес: 5 г.

Подключение к Arduino

Модуль имеет 5 выводов (рис. 2):

  • VCC — питание 5 В;
  • GND — земля;
  • SDA — данные I2C;
  • SCL—  синхронизация I2C;
  • ADDR — выбор адреса для протокола I2C.

Vyvody-modulya-GY-302.jpg

Рисунок 2. Выводы модуля GY-302

Разберемся с возможными адресами датчика BH1750. Есть два варианта подключения датчика BH1750 к шине I2C (рис. 3).

Podklyuchenie-datchika-BH1750-Arduino-1024x506.jpg

Рисунок 3. Подключение датчика BH1750 к Arduino

Для получения адресов загрузим на Arduino скетч из листинга 1 (сканирование устройств, которые подключены к плате Arduino по шине I2C). Листинг 1

#include "Wire.h"  void setup() {     Wire.begin();     Serial.begin(9600);  // запуск последовательного порта  }    void loop() {  int devices;  byte err, add;       Serial.println("Start scan I2C bus...");     devices = 0;     Serial.print("  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");     for(add = 0; addr<= 127; addr++ ) {        if((addr% 0x10) == 0) {           Serial.println();           if(addr< 16)           Serial.print('0');           Serial.print(addr, 16);           Serial.print(" ");        }     Wire.beginTransmission(addr);err = Wire.endTransmission();     if (err == 0) {        if (addr           Serial.print("0");        Serial.print(addr, HEX);        devices++;     }     else {        Serial.print("--");     }     Serial.print(" ");     delay(1);       }     Serial.println();     if (nDevices == 0)        Serial.println("No I2C devices foundn");       delay(2500);  }

Скетч сканирует шину I2C и выводит в последовательный порт Arduino таблицу с адресами подключенных устройств (рисунок 4).

Skaner-I2C-ustrojstv.png

Рисунок 4. Сканер I2C устройств

Как видим, модуль BH1750 может иметь, в зависимости от уровня сигнала на входе ADDR два адреса (0x23 и 0x5C). Это значит, что к одной плате Arduino можно подсоединить одновременно два датчика BH1750.

Пример использования

Рассмотрим пример подключения датчика BH1750 к плате Arduino и вывода показаний на экран дисплея Nokia 5110. Нам понадобятся следующие детали:

  • плата Arduino Uno
  • датчик BH1750
  • дисплей Nokia 5110
  • макетная плата
  • провода

Соберем схему соединений согласно рис. 5.

Skhema-podsoedineniya-Arduino-datchika-BH1750-displeya-Nokia-5110-1024x784.jpg

Рисунок 5. Схема подсоединения к Arduino датчика BH1750 и дисплея Nokia 5110

Для работы с Arduino написано несколько  библиотек. Будем использовать одну из них – BH1750FVI (https://github.com/enjoyneering/BH1750FVI). Данная библиотека поддерживает все режимы датчика BH1750, позволяет производить измерения освещенности с несколькими параметрами чувствительности (0.45 – 3.68) и разрешающей способности (0.5 – 4 lx), а также в режиме энергосбережения. К библиотеке прилагается пример (BH1750FVI_Demo) вывода в последовательный порт Arduino данных с датчика BH1750 при различных режимах измерения (см. рис. 6).

Primer-vyvoda-dannyh-datchika-BH1750.png

Рисунок 6. Пример вывода данных с датчика BH1750 в последовательный порт Arduino при различных режимах измерения

Текущие значения освещенности будем выводить на дисплей Nokia 5110. Нам понадобятся Arduino библиотеки Adafruit_GFX и Adafruit_PCD8544. Данные с датчика BH1750 будем получать со следующими настройками:

  • чувствительность;
  • точность 0.5 lx.

Периодичность измерения 5 секунд. Создадим в Arduino IDE новый скетч, занесем в него код из листинга 2 и загрузим скетч на на плату Arduino. Листинг 2

// подключение библиотек для nokia 5110  #include <adanclude wire="" i2c="">  // подклюѸе библиотеки для bh1750  #include <bh1750fvi>    // Nokia 5110   SCLK  // pin 12 - DIN  // pin 11 - D/C  // pin 10 - CS  // pin 8 - RST  Adafruit_PCD8544 Nokia5110 = Adafruit_PCD8544(13, 12, 11, 10, 8);  // bh1750  BH1750FVI myBH1750;  // для периода опроса датчика  unsigned long millis1=0;    void setup()  {     // запуск последовательного порта     Serial.begin(9600);     // инициализация дисплея     Nokia5110.begin();     // установить контраст фона экрана     Nokia5110.setContrast(60);     Nokia5110.clearDisplay();     Nokia5110.setTextSize(1);     Nokia5110.setTextColor(BLACK);     // начальный экран     Nokia5110.setCursor(10,5);     Nokia5110.print("3d-diy.ru");     Nokia5110.setCursor(30,15);     Nokia5110.print("BH1750");     Nokia5110.display();     // запуск bh1750     myBH1750.begin();     // пауза для заставки     delay(2000);  }    void loop() {     // раз в 5 секунд     if(millis()-millis1>=5000) {        Serial.println(F("Sensitivity - 1.0, Continuous Mode (default settings)"));        myBH1750.setSensitivity(1);        Serial.print(F("Light level: "));        Serial.print(myBH1750.readLightLevel());        Serial.println(F(" +-0.5 lx"));        Serial.println(F(""));        // вывод на дисплей        Nokia5110.clearDisplay();        Nokia5110.setCursor(10,5);        Nokia5110.print("3d-diy.ru");        Nokia5110.setCursor(15,15);        Nokia5110.print("Light level: ");        Nokia5110.setCursor(35,25);        Nokia5110.print(myBH1750.readLightLevel());        Nokia5110.setCursor(20,35);        Nokia5110.print(" +-0.5 lx");        Nokia5110.display();        millis1=millis();     }  }</bh1750fvi></adanclude>

Вывод данных в монитор последовательного порта Arduino (рис. 7).

Vyvod-dannyh-datchika-BH1750-monitor-posledovatelnogo-porta.png

Рисунок 7. Вывод данных с датчика BH1750 в монитор последовательного порта.

Часто задаваемые вопросы

  • Проверьте правильность подключения датчика BH1750 к плате Arduino.

2. Данные не выводятся на экран дисплея

  • Проверьте правильность подключения дисплея Nokia 5110 к плате Arduino.

.  Используемые источники:

  • https://mysku.ru/blog/aliexpress/47183.html
  • https://soltau.ru/index.php/en/arduino/item/344-kak-podklyuchit-datchik-osveshchjonnosti-bh1750-k-arduino
  • https://3d-diy.ru/wiki/arduino-datchiki/datchik-intensivnosti-sveta-gy-302-bh1750/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации