MicroPython: Датчик освещённости BH1750 с ESP32/ESP8266
BH1750 — это 16-битный датчик освещённости. В этом руководстве вы узнаете, как использовать датчик освещённости BH1750 с платами ESP32 и ESP8266, программируемыми с помощью прошивки MicroPython. Вы научитесь подключать датчик к платам ESP, устанавливать необходимые библиотеки и получать показания освещённости в люксах (стандартная единица измерения освещённости).
Используете Arduino IDE? Следуйте другим руководствам:
Предварительные требования
Для выполнения этого руководства вам нужна прошивка MicroPython, установленная на вашу плату ESP32 или ESP8266. Вам также понадобится IDE для написания и загрузки кода на плату. Мы рекомендуем использовать Thonny IDE или uPyCraft IDE:
Thonny IDE:
uPyCraft IDE:
Подробнее о MicroPython: Программирование MicroPython с ESP32 и ESP8266
Необходимые компоненты
Для выполнения этого руководства вам потребуются следующие компоненты:
Макетная плата (опционально)
Соединительные провода (опционально)
Знакомство с датчиком освещённости BH1750
BH1750 — это 16-битный датчик освещённости, который взаимодействует по протоколу I2C. Он выдаёт показания освещённости в люксах (производная единица СИ для освещённости). Датчик может измерять минимум 1 люкс и максимум 65535 люкс.
Датчик может поставляться в различных вариантах модулей. Посмотрите фотографии ниже. Оба изображения представляют датчик BH1750.
Характеристики BH1750
Вот список характеристик датчика BH1750. Для получения дополнительной информации ознакомьтесь с даташитом BH1750.
Интерфейс шины I2C
Спектральная чувствительность приблизительно соответствует восприятию человеческого глаза
Преобразователь освещённости в цифровой сигнал
Диапазон: 1 – 65535 люкс
Низкое энергопотребление благодаря функции отключения питания
Функция подавления помех от освещения 50 Гц / 60 Гц
Возможность выбора 2 различных I2C slave-адресов
Малая погрешность измерения (+/- 20%)
Очень малое влияние инфракрасного излучения
Поддержка режима непрерывного измерения
Поддержка режима однократного измерения
Режимы измерения
Датчик поддерживает два различных режима измерения: режим непрерывного измерения и режим однократного измерения. Каждый режим поддерживает три различных разрешения.
Режим |
Точность |
Время измерения |
|---|---|---|
Низкое разрешение (Low Resolution Mode) |
4 люкс |
16 мс |
Высокое разрешение (High Resolution Mode) |
1 люкс |
120 мс |
Высокое разрешение 2 (High Resolution Mode 2) |
0.5 люкс |
120 мс |
В режиме непрерывного измерения датчик постоянно измеряет значения окружающей освещённости. В режиме однократного измерения датчик измеряет значение окружающей освещённости один раз, а затем переходит в режим отключения питания.
Применения
BH1750 — это датчик окружающей освещённости, который может использоваться в широком спектре проектов. Например:
определение дня и ночи;
регулировка или включение/выключение яркости светодиодов в зависимости от окружающего освещения;
регулировка яркости ЖК-дисплеев и экранов;
определение, горит ли светодиод;
и многое другое.
Распиновка BH1750
Описание контактов BH1750:
Контакт |
Описание |
|---|---|
VCC |
Питание датчика (3.3В или 5В) |
GND |
Общая земля |
SCL |
Линия тактового сигнала для I2C |
SDA (Data) |
Линия данных для I2C |
ADD * |
Выбор адреса |
Пин ADD используется для установки I2C-адреса датчика. Если напряжение на этом пине ниже 0.7VCC (пин не подключён или подключён к GND), I2C-адрес будет 0x23. Если напряжение выше 0.7xVCC (пин подключён к VCC), адрес будет 0x5C. Кратко:
Пин ADD не подключён или подключён к GND → адрес: 0x23
Пин ADD подключён к VCC → адрес: 0x5C
Подключение BH1750 к ESP32 или ESP8266
Датчик освещённости BH1750 поддерживает интерфейс I2C. Вы можете подключить датчик BH1750 к ESP32/ESP8266, используя стандартные пины I2C:
BH1750 |
ESP32 |
ESP8266 |
|---|---|---|
VCC |
3.3V |
3.3V |
GND |
GND |
GND |
SCL |
GPIO 22 |
GPIO 5 (D1) |
SDA (Data) |
GPIO 21 |
GPIO 4 (D2) |
ADD * |
Не подключать |
Не подключать |
Не подключая пин ADD, мы выбираем I2C-адрес 0x23. Подключите его к 3.3V, чтобы выбрать адрес 0x5C.
Вы также можете использовать следующие схемы подключения в качестве справки.
Схема подключения — ESP32 с BH1750
Схема подключения — ESP8266 NodeMCU с BH1750
Библиотека BH1750 для MicroPython
Для чтения данных с датчика BH1750 мы будем использовать внешнюю библиотеку, которая не входит в стандартную библиотеку MicroPython.
Откройте следующую ссылку и скопируйте код библиотеки в Thonny IDE:
Следуйте следующим шагам для загрузки библиотеки на вашу плату ESP32 или ESP8266:
1) Скопируйте код библиотеки в новый файл. Код библиотеки bh1750.py можно найти здесь.
# forked from: https://github.com/PinkInk/upylib/tree/master/bh1750
"""
Micropython BH1750 ambient light sensor driver.
"""
from utime import sleep_ms
class BH1750():
"""Micropython BH1750 ambient light sensor driver."""
PWR_OFF = 0x00
PWR_ON = 0x01
RESET = 0x07
# modes
CONT_LOWRES = 0x13
CONT_HIRES_1 = 0x10
CONT_HIRES_2 = 0x11
ONCE_HIRES_1 = 0x20
ONCE_HIRES_2 = 0x21
ONCE_LOWRES = 0x23
# default addr=0x23 if addr pin floating or pulled to ground
# addr=0x5c if addr pin pulled high
def __init__(self, bus, addr=0x23):
self.bus = bus
self.addr = addr
self.off()
self.reset()
def off(self):
"""Turn sensor off."""
self.set_mode(self.PWR_OFF)
def on(self):
"""Turn sensor on."""
self.set_mode(self.PWR_ON)
def reset(self):
"""Reset sensor, turn on first if required."""
self.on()
self.set_mode(self.RESET)
def set_mode(self, mode):
"""Set sensor mode."""
self.mode = mode
self.bus.writeto(self.addr, bytes([self.mode]))
def luminance(self, mode):
"""Sample luminance (in lux), using specified sensor mode."""
# continuous modes
if mode & 0x10 and mode != self.mode:
self.set_mode(mode)
# one shot modes
if mode & 0x20:
self.set_mode(mode)
# earlier measurements return previous reading
sleep_ms(24 if mode in (0x13, 0x23) else 180)
data = self.bus.readfrom(self.addr, 2)
factor = 2.0 if mode in (0x11, 0x21) else 1.0
return (data[0]<<8 | data[1]) / (1.2 * factor)
2) Перейдите в File > Save as…
3) Выберите сохранение на «MicroPython device»:
4) Назовите файл bh1750.py и нажмите кнопку OK:
Вот и всё. Библиотека загружена на вашу плату. Чтобы убедиться, что загрузка прошла успешно, перейдите в File > Save as… и выберите устройство MicroPython. Ваш файл должен быть в списке:
После загрузки библиотеки на вашу плату вы можете использовать функции библиотеки в вашем коде, импортировав библиотеку.
ESP32/ESP8266 — BH1750 Освещённость (люкс) — Код
После загрузки библиотеки создайте новый файл и вставьте следующий код. Он считывает освещённость в люксах и выводит показания в Shell каждые две секунды.
# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details at https://RandomNerdTutorials.com/micropython-bh1750-esp32-esp8266/
from machine import Pin, SoftI2C
from bh1750 import BH1750
import time
# Initialize I2C communication (ESP32)
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=400000)
# Initialize I2C communication (ESP8266)
#i2c = SoftI2C(scl=Pin(5), sda=Pin(4), freq=400000)
# Create BH1750 object
light_sensor = BH1750(bus=i2c, addr=0x23)
try:
# Read lux every 2 seconds
while True:
lux = light_sensor.luminance(BH1750.CONT_HIRES_1)
print("Luminance: {:.2f} lux".format(lux))
time.sleep(2)
except Exception as e:
# Handle any exceptions during sensor reading
print("An error occurred:", e)
Как работает код
Нам нужно импортировать классы Pin и SoftI2C из модуля machine.
from machine import Pin, SoftI2C
from bh1750 import BH1750
import time
В данном случае этой библиотеке требуется SoftI2C вместо I2C. В MicroPython SoftI2C означает программный I2C, а I2C — аппаратный I2C.
Аппаратный I2C использует специальные аппаратные модули, оптимизированные для I2C-связи. Программный I2C, напротив, использует программно определённые GPIO-пины для эмуляции I2C-связи.
Мы инициализируем I2C-связь на GPIO 21 и 22 на ESP32 или на GPIO 4 и 5 на ESP8266. Убедитесь, что раскомментировали пины для используемой платы.
# Initialize I2C communication (ESP32)
#i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=400000)
# Initialize I2C communication (ESP8266)
i2c = SoftI2C(scl=Pin(5), sda=Pin(4), freq=400000)
Затем создайте экземпляр BH1750 с именем light_sensor на шине I2C, определённой ранее. Мы используем I2C-адрес 0x23. Если у вас другой адрес, измените его в следующей строке.
light_sensor = BH1750(bus=i2c, addr=0x23)
Для получения значений освещённости просто используйте метод luminance() объекта BH1750 и передайте режим измерения в качестве аргумента.
lux = light_sensor.luminance(BH1750.CONT_HIRES_1)
Библиотека предоставляет список режимов измерения, которые вы можете использовать. См. таблицу ниже.
Константа |
Описание |
|---|---|
|
Непрерывный, низкое разрешение (4 лк), время измерения ~24 мс, датчик остаётся включённым после считывания. |
|
Непрерывный, высокое разрешение (1 лк), время измерения ~180 мс, датчик остаётся включённым после считывания. |
|
Непрерывный, очень высокое разрешение (0.5 лк), время измерения ~180 мс, датчик остаётся включённым после считывания. |
|
Однократный, низкое разрешение (4 лк), время измерения ~24 мс, датчик отключается после считывания. |
|
Однократный, высокое разрешение (1 лк), время измерения ~180 мс, датчик отключается после считывания. |
|
Однократный, очень высокое разрешение (0.5 лк), время измерения ~180 мс, датчик отключается после считывания. |
Наконец, мы выводим показания в Shell:
print("Luminance: {:.2f} lux".format(lux))
Тестирование кода
Запустите предыдущий код на вашей плате ESP32 или ESP8266.
Вы должны получать новые значения освещённости в люксах каждые две секунды.
Закройте датчик или направьте на него свет, чтобы увидеть изменение значений.
Заключение
В этом руководстве мы рассмотрели, как использовать датчик освещённости BH1750 с платами ESP32 и ESP8266, программируемыми с помощью MicroPython.
Датчик BH1750 может быть полезен в широком спектре проектов для определения дня и ночи, регулировки яркости светодиодов в зависимости от окружающего освещения, определения состояния светодиода и многого другого.
Надеемся, что это руководство было вам полезно.
У нас есть руководства по другим датчикам с ESP32/ESP8266 на MicroPython, которые могут вас заинтересовать:
MicroPython: ESP32/ESP8266 с датчиком температуры и влажности DHT11/DHT22
MicroPython: BME280 с ESP32 и ESP8266 (давление, температура, влажность)
MicroPython: BME680 с ESP32 и ESP8266 (температура, влажность, давление, газ)
MicroPython: HC-SR04 ультразвуковой датчик с ESP32 и ESP8266 (измерение расстояния)
MicroPython: RCWL-0516 микроволновый радарный датчик — обнаружение движения с ESP32/ESP8266