ESP8266 NodeMCU с датчиком освещённости BH1750

BH1750 — это 16-битный датчик освещённости (ambient light sensor). В этом руководстве вы узнаете, как использовать датчик освещённости BH1750 с платой ESP8266 NodeMCU в Arduino IDE. Датчик взаимодействует с микроконтроллером по протоколу I2C.

ESP8266 NodeMCU с датчиком освещённости BH1750 Arduino IDE

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

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

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

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

Датчик может поставляться на различных модулях (breakout board). Смотрите изображения ниже. Оба изображения представляют датчик BH1750.

Модули датчика освещённости BH1750

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

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

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

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

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

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

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

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

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

  • Малая погрешность измерений (+/- 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.

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

Вы можете подключить датчик BH1750 к ESP8266, используя стандартные выводы I2C:

BH1750

ESP8266

SCL

GPIO 5 (D1)

SDA

GPIO 4 (D2)

GPIO 5 и GPIO 4 — это стандартные выводы I2C ESP8266. Вы можете использовать другие выводы, если правильно укажете их в коде.

BH1750: чтение освещённости с ESP8266

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

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

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

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

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

Подключите датчик BH1750 к выводам I2C ESP8266. Вы можете следовать приведённой ниже схеме подключения.

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

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

BH1750

ESP8266

VCC

3.3V

GND

GND

SCL

GPIO 5 (D1)

SDA (Data)

GPIO 4 (D2)

ADD*

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

Если вывод ADD не подключён, мы выбираем I2C-адрес 0x23. Подключите его к 3.3 В, чтобы вместо этого выбрать адрес 0x5C.

Подготовка Arduino IDE

Мы будем программировать плату ESP8266 с помощью Arduino IDE. Поэтому убедитесь, что у вас установлен пакет плат ESP8266. Следуйте этому руководству:

Установка библиотеки 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 и выберите используемую плату ESP8266. Перейдите в Tools > Port и выберите COM-порт, к которому подключена ваша плата. Наконец, нажмите кнопку загрузки.

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

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

ESP8266 NodeMCU с датчиком освещённости BH1750 демонстрация Serial Monitor

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

Используемая нами библиотека для датчика 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 с ESP8266. Датчик очень прост в использовании. Он использует протокол связи I2C, что упрощает подключение, а библиотека предоставляет методы для удобного получения показаний.

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

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