Датчик освещённости GY-302 (BH1750): подключение к Arduino

Цифровой датчик BH1750 измеряет освещённость сразу в люксах. Разбираем выводы модуля GY-302, адреса I2C и пример с выводом на дисплей Nokia 5110.
Чем BH1750 отличается от фоторезистора
Освещённость — один из базовых параметров в домашней автоматике и устройствах Интернета вещей. Измеряется она в люксах: один люкс соответствует освещённости поверхности площадью 1 м² при падающем на неё световом потоке в 1 лм.
В любительских проектах на Arduino свет чаще всего измеряют фоторезистором. Это аналоговый элемент, сопротивление которого зависит от интенсивности света; точность у него невысокая, а результат не привязан к люксам. Модуль GY-302 на чипе BH1750 решает обе проблемы: это высокоточный цифровой датчик, который отдаёт готовое значение в люксах и не требует калибровки.

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

От уровня сигнала на входе ADDR зависит, под каким адресом датчик виден на шине, поэтому вариантов подключения два.

Узнать фактический адрес помогает скетч-сканер I2C на библиотеке Wire. Он перебирает адреса от 0 до 127, для каждого начинает передачу и по результату Wire.endTransmission() определяет, ответило ли устройство. Итог выводится в последовательный порт в виде таблицы, где найденные адреса показаны числами, а пустые ячейки — прочерками.

У BH1750 возможны два адреса: 0x23 и 0x5C. Практический вывод — к одной плате Arduino можно одновременно подключить два таких датчика.
Библиотека BH1750FVI
Для BH1750 существует несколько Arduino-библиотек. В примере используется BH1750FVI. Она поддерживает все режимы работы датчика, позволяет менять чувствительность в пределах 0,45–3,68 и разрешающую способность от 0,5 до 4 лк, а также умеет работать в режиме энергосбережения. В комплекте с библиотекой есть пример BH1750FVI_Demo, который выводит в последовательный порт показания в разных режимах измерения.
Пример: люксметр с дисплеем Nokia 5110
Для самостоятельного измерителя освещённости нужны плата Arduino Uno, датчик BH1750, дисплей Nokia 5110, макетная плата и провода. Помимо Wire и BH1750FVI подключаются библиотеки Adafruit_GFX и Adafruit_PCD8544 для работы с дисплеем.
Дисплей в примере подключён к контактам Arduino так: 13 — SCLK, 12 — DIN, 11 — D/C, 10 — CS, 8 — RST. При запуске скетч инициализирует экран, устанавливает контраст 60, на две секунды показывает заставку и запускает датчик вызовом begin().
В основном цикле измерение выполняется раз в 5 секунд; интервал отсчитывается по millis(), без блокирующих задержек. Перед чтением задаётся чувствительность setSensitivity(1), затем значение получают методом readLightLevel(). Результат с пометкой точности ±0,5 лк отправляется в монитор последовательного порта и выводится на дисплей в строке «Light level».
Перед каждым обновлением экран очищается, после чего текст выводится заново в заданных позициях курсора: сначала заголовок, ниже подпись, само значение освещённости и строка с точностью. Изображение появляется только после вызова display(), поэтому он завершает и заставку, и каждый цикл вывода. Запись момента последнего измерения в переменную в конце блока обеспечивает следующий опрос датчика ровно через заданный интервал.
Если что-то не работает
Когда сканер I2C не находит датчик или данные с него не приходят, проверяют подключение BH1750 к плате. Если показания есть в порте, но не появляются на экране, проверить нужно соединение дисплея Nokia 5110 с Arduino.