Светочувствительность является важнейшим аспектом различных электронных приложений, от энергоэффективного освещения до мониторинга окружающей среды. В этой статье мы рассмотрим принципы работы и возможности датчика BH1750 (на примере модуля GY-302). Кроме того, мы узнаем, как подключить датчик BH1750 к Arduino Nano для создания устройства измерения освещенности.
Что такое датчик интенсивности света BH1750?
BH1750 — это 16-битный датчик для измерения интенсивности света, который обменивается данными по протоколу I2C. Он выводит измеренное значение освещенности в люксах (единица измерения освещенности Международной системы единиц). Диапазон измерений датчика от 1 до 65535 люкс.
Датчик может выпускаться в различных формах коммутационных плат. На изображении ниже представлены 3 модуля на базе датчика BH1750.
Особенности датчика, согласно технической документации
- I2C интерфейс
- Цифровой преобразователь освещенности
- Диапазон от 1 до 65535 люкс
- Низкий ток потребления благодаря функции отключения питания
- Функция подавления светового шума частотой 50 Гц/60 Гц
- Можно выбрать 2 разных адреса I2C
- Погрешность измерения ±20%
- Очень малое влияние инфракрасного излучения
- Поддержка режима непрерывного измерения
- Поддержка режима однократного измерения
Режимы измерения
Датчик поддерживает два различных режима измерения: режим непрерывного измерения и режим однократного измерения. В свою очередь, каждый режим поддерживает три различных режима разрешения.
Режим измерения | Разрешение | Время измерения |
---|---|---|
Режим низкого разрешения (L-Resolution Mode) | Точность — 4 люкс | 16 мс |
Режим высокого разрешения (H-Resolution Mode) | Точность — 1 люкс | 120 мс |
Режим высокого разрешения 2 (H-resolution Mode2) | Точность — 0.5 люкс | 120 мс |
Характеристики датчика
Ниже приведем некоторые характеристики датчика.
Напряжение питания | от +2.4 В до +3.6 В (максимум +4.5 В) |
Потребляемый ток | ~120 мкА (максимум 190 мкА) |
Рабочая температура | от -40 до 80 ℃ |
Погрешность | ±20% |
Распиновка модуля GY-302
Контакт | Описание |
---|---|
VCC | Питание модуля, +3.3В или +5В |
GND | Земля |
SCL | Последовательная линия синхронизации обеспечивает тактовые импульсы для связи I2C |
SDA | Последовательная линия данных для передачи данных для связи I2C. |
ADDR | Контакт для выбора адреса модуля |
Обратите внимание!
Напряжение питание датчика BH1750 и модуля GY-302 отличается. Модуль можно подключать как к +3.3В, так и к +5В, так как на нем присутствует стабилизатор напряжения 3.3В.
Контакт ADDR используется для установки адреса датчика для шины I2C. Если напряжение на этом выводе меньше 0,7В (вывод остается без подключения или подключен к GND), адрес I2C равен 0x23. А если напряжение выше 0,7xVCC (вывод подключен к VCC), адрес будет 0x5C. Таким образом:
- ADDR подключен к GND — адрес:
0x23
- ADDR подключен к VCC — адрес:
0x5C
Подключение BH1750 к Ардуино
На следующей схеме показано подключение BH1750 к Arduino Nano:
Датчик BH1750 | Ардуино Нано |
---|---|
VCC | 5V |
GND | GND |
SCL | A5 |
SDA | A4 |
ADDR | Не подключен |
Библиотека
Скачать библиотеку BH1750 можно с нашего сайта или перейти на GitHub
Код для считывания значения освещенности и вывода в монитор порта
Этот код просто считывает уровень освещенности в люксах и выводит значение в монитор порта. Это пример кода из библиотеки под названием BH1750test, вы можете найти его в Файл -> Примеры -> BH1750 -> BH1750test.
#include <BH1750.h> #include <Wire.h> BH1750 lightMeter; // Создаем объект класса BH1750 void setup() { Serial.begin(9600); // Инициализация последовательного порта Wire.begin(); // Инициализация I2C lightMeter.begin(); // Инициализация BH1750 } void loop() { /* Получаем значение освещенности */ float lux = lightMeter.readLightLevel(); /* Выводим в порт */ Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); /* Ждем секунду */ delay(1000); }
Монитор порта после загрузки программы у меня выглядит так:
Пояснение к коду
Код начинается с подключения необходимых библиотек. Библиотека Wire.h для использования протокола связи I2C и библиотека BH1750.h для чтения данных с датчика.
#include <BH1750.h> #include <Wire.h>
Затем мы создаем объект BH1750 под названием LightMeter
.
BH1750 lightMeter;
В функции setup()
инициализируем последовательный порт со скоростью 9600 бод.
Serial.begin(9600);
Дальше, инициализируем протокол связи I2C. Он запустит обмен данными I2C на контактах I2C микроконтроллера по умолчанию (А4 и А5). Если вы хотите использовать другие выводы I2C (если контроллер имеет такие выводы), передайте их методу Wire.begin(SDA, SCL)
.
Wire.begin();
Инициализируем датчик, используя метод begin()
объекта BH1750 (lightMeter):
lightMeter.begin();
В функции loop()
мы создаем переменную с именем lux
, которая сохраняет значения освещенности. Чтобы получить значение, мы просто вызываем функцию считывания уровня освещенности readLightLevel()
объекта BH1750 (lightMeter).
float lux = lightMeter.readLightLevel();
И наконец, отправляем результаты измерений на монитор порта:
Serial.print("Light: "); Serial.print(lux); Serial.println(" lx");
И устанавливаем задержку между измерениями в 1 секунду:
delay(1000);
Настройка режима измерения
По умолчанию библиотека использует режим непрерывного измерения с высоким разрешением, но вы можете изменить его, передав нужный режим измерения методу begin()
при инициализации датчика. Например, установим режим непрерывного измерения с точностью 0.5 люкс:
lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE_2);
Список всех доступных режимов:
BH1750::CONTINUOUS_LOW_RES_MODE
— непрерывное измерение, разрешение 4 люксBH1750::CONTINUOUS_HIGH_RES_MODE
— непрерывное измерение, разрешение 1 люксBH1750::CONTINUOUS_HIGH_RES_MODE_2
— непрерывное измерение, разрешение 0.5 люксBH1750::ONE_TIME_LOW_RES_MODE
— однократное измерение, разрешение 4 люксBH1750::ONE_TIME_HIGH_RES_MODE
— однократное измерение, разрешение 1 люксBH1750::ONE_TIME_HIGH_RES_MODE_2
— однократное измерение, разрешение 0.5 люкс
Вывод данных на дисплей 1602 по I2C
Ну и напоследок, добавим вывод данных на дисплей 1602, который подключен по I2C к Ардуино через адаптер PCF8574:
И добавим вывод данных на дисплей:
#include <BH1750.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // Создаем объект для работы с LCD BH1750 lightMeter; // Создаем объект класса BH1750 void setup() { Serial.begin(9600); // Инициализация последовательного порта Wire.begin(); // Инициализация I2C lightMeter.begin(); // Инициализация BH1750 lcd.init(); // Инициализация LCD } void loop() { /* Получаем значение освещенности */ float lux = lightMeter.readLightLevel(); /* Выводим в порт */ Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); /* Выводим на дисплей */ lcd.clear(); lcd.setCursor(0,0); lcd.print(lux); lcd.print(" lux"); /* Ждем секунду */ delay(1000); }