Подключение датчика освещенности BH1750 к Ардуино

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

Светочувствительность является важнейшим аспектом различных электронных приложений, от энергоэффективного освещения до мониторинга окружающей среды. В этой статье мы рассмотрим принципы работы и возможности датчика 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Контакт для выбора адреса модуля
Распиновка модуля GY-302 (BH1750)
На модуле подписаны контакты

Обратите внимание!


Напряжение питание датчика 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 к Ардуино нано
Датчик BH1750Ардуино Нано
VCC5V
GNDGND
SCLA5
SDAA4
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);
}

Монитор порта после загрузки программы у меня выглядит так:

Значения освещенности, измеренное датчиком BH1750

Пояснение к коду

Код начинается с подключения необходимых библиотек. Библиотека 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:

Подключение LCD1602 и BH1750 к ардуино нано по I2C

И добавим вывод данных на дисплей:

#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);
}
Сравнение значения датчика BH1750 с датчиком освещенности на смартфоне

Загрузки

Где купить

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии