Arduino с датчиком освещенности BH1750

BH1750 — это 16-битный датчик освещенности. В этом руководстве вы узнаете, как использовать датчик освещенности BH1750 с платой Arduino. Датчик взаимодействует с микроконтроллером по протоколу I2C.

Плата Arduino с датчиком освещенности BH1750 Arduino IDE

Вы узнаете, как подключить датчик к плате Arduino, установить необходимые библиотеки и использовать простой скетч для отображения показаний датчика в Serial Monitor.

В этом руководстве рассматриваются следующие темы:

Знакомство с датчиком освещенности BH1750

BH1750 — это 16-битный датчик освещенности, который взаимодействует по протоколу I2C. Он выдает результаты измерений освещенности в люксах (lux — единица измерения освещенности в системе СИ). Датчик может измерять минимум 1 люкс и максимум 65535 люкс.

Датчик может поставляться на различных платах расширения. Смотрите фотографии ниже. На обоих изображениях представлен датчик BH1750.

Платы расширения датчика освещенности BH1750

Характеристики BH1750

Вот список характеристик датчика BH1750. Для получения дополнительной информации ознакомьтесь с даташитом датчика BH1750.

  • Интерфейс шины I2C

  • Спектральная чувствительность приближена к восприятию человеческого глаза

  • Встроенный преобразователь освещенности в цифровой сигнал

  • Диапазон: 1 – 65535 люкс

  • Низкое потребление тока благодаря функции отключения питания

  • Функция подавления шума от освещения 50 Гц / 60 Гц

  • Возможность выбора двух различных I2C slave-адресов

  • Малая погрешность измерений (+/- 20%)

  • Очень малое влияние инфракрасного излучения

  • Поддержка режима непрерывных измерений

  • Поддержка режима однократного измерения

Режимы измерения

Датчик поддерживает два различных режима измерения: режим непрерывного измерения и режим однократного измерения. Каждый режим поддерживает три различных режима разрешения.

Режим низкого разрешения

Точность 4 люкс

Время измерения 16 мс

Режим высокого разрешения

Точность 1 люкс

Время измерения 120 мс

Режим высокого разрешения 2

Точность 0,5 люкс

Время измерения 120 мс

В режиме непрерывного измерения датчик постоянно измеряет значения освещенности. В режиме однократного измерения датчик измеряет значение освещенности один раз, после чего переходит в режим отключения питания.

Применение

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

BH1750 — это датчик освещенности, поэтому его можно использовать в самых разных проектах. Например:

  • для определения, день сейчас или ночь;

  • для регулировки или включения/выключения яркости светодиодов в зависимости от окружающего освещения;

  • для регулировки яркости ЖК-дисплеев и экранов;

  • для определения, горит ли светодиод;

Распиновка BH1750

Распиновка датчика освещенности BH1750

Вот распиновка BH1750:

VCC

Питание датчика (3,3 В или 5 В)

GND

Общий GND

SCL

Вывод SCL для I2C-связи

SDA (Data)

Вывод SDA для I2C-связи

ADD*

Выбор адреса

Вывод ADD используется для установки I2C-адреса датчика. Если напряжение на этом выводе меньше 0,7VCC (вывод оставлен свободным или подключен к GND), I2C-адрес будет 0x23. Но если напряжение выше 0,7xVCC (вывод подключен к VCC), адрес будет 0x5C. Кратко:

  • Вывод ADD свободный или подключен к GND → адрес: 0x23

  • Вывод ADD подключен к VCC → адрес: 0x5C

Интерфейс I2C датчика BH1750

Датчик освещенности BH1750 поддерживает интерфейс I2C.

Arduino с датчиком освещенности BH1750

Вы можете подключить датчик BH1750 к Arduino, используя стандартные выводы I2C (это выводы для Arduino UNO, если вы используете другую модель, проверьте её выводы I2C):

BH1750

Arduino

SCL

A5

SDA

A4

BH1750: чтение освещенности с Arduino

Теперь, когда вы лучше знакомы с датчиком BH1750, давайте его протестируем. В этом разделе мы создадим простой проект, который считывает освещенность и отображает её в Serial Monitor Arduino IDE.

Необходимые компоненты

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете воспользоваться ссылками выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

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

Подключите датчик BH1750 к выводам I2C Arduino. Вы можете использовать следующую схему подключения.

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

Вы также можете воспользоваться следующей таблицей:

BH1750

Arduino

VCC

5V

GND

GND

SCL

A5

SDA (Data)

A4

ADD*

Не подключать

Не подключая вывод ADD, мы выбираем I2C-адрес 0x23. Подключите его к 3,3 В, чтобы выбрать адрес 0x5C.

Установка библиотеки BH1750

Существует несколько библиотек для чтения данных с датчика BH1750. Мы будем использовать библиотеку BH1750 от Christopher Laws. Она совместима с ESP32, ESP8266 и Arduino.

Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.

Найдите «BH1750» в поле поиска и установите библиотеку BH1750 от Christopher Laws.

Библиотека BH1750 Arduino IDE

Код — чтение датчика освещенности BH1750

Скопируйте следующий код в Arduino IDE. Этот код просто считывает освещенность в люксах и отображает значения в Serial Monitor. Это пример кода из библиотеки под названием BH1750test (вы можете найти его в File > Examples > BH1750 > BH1750test).

/*
  Example of BH1750 library usage. This example initialises the BH1750 object using the default high resolution continuous mode and then makes a light level reading every second.
*/

#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;

void setup(){
  Serial.begin(9600);

  // Initialize the I2C bus (BH1750 library doesn't do this automatically)
  Wire.begin();
  // On esp8266 you can select SCL and SDA pins using Wire.begin(D4, D3);
  // For Wemos / Lolin D1 Mini Pro and the Ambient Light shield use Wire.begin(D2, D1);

  lightMeter.begin();

  Serial.println(F("BH1750 Test begin"));
}

void loop() {
  float lux = lightMeter.readLightLevel();
  Serial.print("Light: ");
  Serial.print(lux);
  Serial.println(" lx");
  delay(1000);
}

Посмотреть исходный код

Библиотека также предоставляет другие примеры, которые стоит изучить.

Как работает код

Мы начинаем с подключения необходимых библиотек. Библиотека Wire.h для использования протокола связи I2C и библиотека BH1750.h для чтения данных с датчика.

#include <Wire.h>
#include <BH1750.h>

Затем мы создаем объект BH1750 с именем lightMeter.

BH1750 lightMeter;

В функции setup() инициализируем Serial Monitor со скоростью 9600 бод.

Serial.begin(9600);

Инициализируем протокол связи I2C. Это запустит I2C-связь на стандартных выводах I2C микроконтроллера. Если вы хотите использовать другие выводы I2C, передайте их в метод begin() следующим образом: Wire.begin(SDA, SCL).

Wire.begin();

Инициализируем датчик с помощью метода begin() для объекта BH1750 (lightMeter).

lightMeter.begin();

В функции loop() мы создаем переменную с именем lux, которая сохраняет значения освещенности. Чтобы получить значение, достаточно вызвать функцию readLightLevel() для объекта BH1750 (lightMeter).

float lux = lightMeter.readLightLevel();

Наконец, отображаем результат измерения в Serial Monitor.

Serial.print("Light: ");
Serial.print(lux);
Serial.println(" lx");

Вы получаете и выводите новое показание каждую секунду.

delay(1000);

Демонстрация

Теперь вы можете загрузить код на свою плату. Сначала подключите плату к компьютеру. Затем перейдите в Tools > Board и выберите плату Arduino, которую вы используете. Перейдите в Tools > Port и выберите COM-порт, к которому подключена ваша плата. Наконец, нажмите кнопку загрузки.

Кнопка загрузки Arduino 2.0

После успешной загрузки кода откройте Serial Monitor на скорости 9600 бод.

Новые показания освещенности должны отображаться в Serial Monitor.

Плата Arduino с датчиком освещенности BH1750 — демонстрация Serial Monitor Arduino IDE

Другие полезные функции

Библиотека, которую мы используем с датчиком BH1750, предоставляет другие примеры, иллюстрирующие другие полезные функции и возможности. Вы можете посмотреть все примеры библиотеки BH1750 здесь.

Установка режима измерения

По умолчанию библиотека использует режим непрерывного измерения с высоким разрешением, но вы можете изменить его, передав желаемый режим измерения в метод begin() при инициализации датчика. Например:

lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE)

Вот список всех доступных режимов:

  • BH1750_CONTINUOUS_LOW_RES_MODE

  • BH1750_CONTINUOUS_HIGH_RES_MODE (по умолчанию)

  • BH1750_CONTINUOUS_HIGH_RES_MODE_2

  • BH1750_ONE_TIME_LOW_RES_MODE

  • BH1750_ONE_TIME_HIGH_RES_MODE

  • BH1750_ONE_TIME_HIGH_RES_MODE_2

Свойства каждого режима описаны в разделе выше.

Заключение

В этом руководстве вы узнали, как использовать датчик освещенности BH1750 с Arduino Uno. Датчик очень прост в использовании. Он использует протокол связи I2C, что упрощает подключение, а библиотека предоставляет методы для легкого получения показаний.

Мы надеемся, что это руководство было полезным. Напишите в комментариях ниже, в каком проекте вы бы использовали датчик BH1750.

У нас есть руководства по другим датчикам для платы Arduino, которые могут вас заинтересовать: