MicroPython: Датчик освещённости BH1750 с ESP32/ESP8266

BH1750 — это 16-битный датчик освещённости. В этом руководстве вы узнаете, как использовать датчик освещённости BH1750 с платами ESP32 и ESP8266, программируемыми с помощью прошивки MicroPython. Вы научитесь подключать датчик к платам ESP, устанавливать необходимые библиотеки и получать показания освещённости в люксах (стандартная единица измерения освещённости).

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

Используете Arduino IDE? Следуйте другим руководствам:

Предварительные требования

Для выполнения этого руководства вам нужна прошивка MicroPython, установленная на вашу плату ESP32 или ESP8266. Вам также понадобится IDE для написания и загрузки кода на плату. Мы рекомендуем использовать Thonny IDE или uPyCraft IDE:

Подробнее о MicroPython: Программирование MicroPython с ESP32 и ESP8266

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

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

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

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

Датчик может поставляться в различных вариантах модулей. Посмотрите фотографии ниже. Оба изображения представляют датчик BH1750.

Модули датчика освещённости 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

Распиновка датчика освещённости 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

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

Схема подключения — ESP8266 NodeMCU с 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)
Библиотека BH1750 для MicroPython в Thonny IDE

2) Перейдите в File > Save as…

Thonny IDE ESP32 ESP8266 MicroPython сохранение файла библиотеки

3) Выберите сохранение на «MicroPython device»:

Thonny IDE сохранение на устройство MicroPython

4) Назовите файл bh1750.py и нажмите кнопку OK:

Сохранение bh1750.py на ESP32 ESP8266

Вот и всё. Библиотека загружена на вашу плату. Чтобы убедиться, что загрузка прошла успешно, перейдите в File > Save as… и выберите устройство MicroPython. Ваш файл должен быть в списке:

Файл BH1750 сохранён на платах ESP32 и ESP8266

После загрузки библиотеки на вашу плату вы можете использовать функции библиотеки в вашем коде, импортировав библиотеку.

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)

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

Константа

Описание

CONT_LOWRES

Непрерывный, низкое разрешение (4 лк), время измерения ~24 мс, датчик остаётся включённым после считывания.

CONT_HIRES_1

Непрерывный, высокое разрешение (1 лк), время измерения ~180 мс, датчик остаётся включённым после считывания.

CONT_HIRES_2

Непрерывный, очень высокое разрешение (0.5 лк), время измерения ~180 мс, датчик остаётся включённым после считывания.

ONCE_HIRES_1

Однократный, низкое разрешение (4 лк), время измерения ~24 мс, датчик отключается после считывания.

ONCE_HIRES_2

Однократный, высокое разрешение (1 лк), время измерения ~180 мс, датчик отключается после считывания.

ONCE_LOWRES

Однократный, очень высокое разрешение (0.5 лк), время измерения ~180 мс, датчик отключается после считывания.

Наконец, мы выводим показания в Shell:

print("Luminance: {:.2f} lux".format(lux))

Тестирование кода

Запустите предыдущий код на вашей плате ESP32 или ESP8266.

Тестирование кода в Thonny IDE

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

BH1750 получение значений освещённости в Thonny IDE ESP32 и ESP8266

Закройте датчик или направьте на него свет, чтобы увидеть изменение значений.

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

Заключение

В этом руководстве мы рассмотрели, как использовать датчик освещённости BH1750 с платами ESP32 и ESP8266, программируемыми с помощью MicroPython.

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

Надеемся, что это руководство было вам полезно.

У нас есть руководства по другим датчикам с ESP32/ESP8266 на MicroPython, которые могут вас заинтересовать: