ESP8266 NodeMCU с датчиком освещённости BH1750
BH1750 — это 16-битный датчик освещённости (ambient light sensor). В этом руководстве вы узнаете, как использовать датчик освещённости BH1750 с платой ESP8266 NodeMCU в Arduino IDE. Датчик взаимодействует с микроконтроллером по протоколу I2C.
Вы узнаете, как подключить датчик к плате ESP8266 NodeMCU, установить необходимые библиотеки и использовать простой скетч для отображения показаний датчика в Serial Monitor.
В этом руководстве рассматриваются следующие темы:
Знакомство с датчиком освещённости BH1750
BH1750 — это 16-битный датчик освещённости, который обменивается данными по протоколу I2C. Он выдаёт показания освещённости в люксах (lux, производная единица СИ для измерения освещённости). Датчик может измерять минимум 1 люкс и максимум 65535 люкс.
Датчик может поставляться на различных модулях (breakout board). Смотрите изображения ниже. Оба изображения представляют датчик BH1750.
Характеристики BH1750
Ниже приведён список характеристик датчика BH1750. Для получения дополнительной информации ознакомьтесь с даташитом датчика BH1750.
Интерфейс шины I2C
Спектральная чувствительность приблизительно соответствует восприятию человеческого глаза
Встроенный преобразователь освещённости в цифровой сигнал
Диапазон: 1 – 65535 люкс
Низкое потребление тока благодаря функции отключения питания
Подавление шумов от освещения 50 Гц / 60 Гц
Возможность выбора 2 различных I2C адресов
Малая погрешность измерений (+/- 20%)
Очень малое влияние инфракрасного излучения
Поддержка режима непрерывного измерения
Поддержка режима однократного измерения
Режимы измерения
Датчик поддерживает два различных режима измерения: режим непрерывного измерения и режим однократного измерения. Каждый режим поддерживает три различных разрешения.
Режим низкого разрешения |
Точность 4 люкса |
Время измерения 16 мс |
Режим высокого разрешения |
Точность 1 люкс |
Время измерения 120 мс |
Режим высокого разрешения 2 |
Точность 0.5 люкса |
Время измерения 120 мс |
В режиме непрерывного измерения датчик непрерывно измеряет значения освещённости. В режиме однократного измерения датчик измеряет значение освещённости один раз, а затем переходит в режим пониженного энергопотребления.
Применение
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.
Вы можете подключить датчик 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.
Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
ESP8266 (читайте Лучшие платы разработки ESP8266)
Макетная плата (опционально)
Соединительные провода (опционально)
Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения — ESP8266 с BH1750
Подключите датчик BH1750 к выводам I2C ESP8266. Вы можете следовать приведённой ниже схеме подключения.
Вы также можете использовать следующую таблицу:
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. Этот код просто считывает уровень освещённости в люксах и отображает значения в 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.
Другие полезные функции
Используемая нами библиотека для датчика 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, которые могут вас заинтересовать: