Raspberry Pi Pico: датчик освещенности BH1750 (MicroPython)

Узнайте, как использовать датчик освещенности BH1750 с Raspberry Pi Pico, программируемым на MicroPython, для получения измерений окружающего освещения. Мы покажем, как подключить датчик, установить необходимые библиотеки и получить показания датчика в единицах LUX — стандартизированной единице измерения освещенности.

Raspberry Pi Pico с датчиком освещенности BH1750 MicroPython

Впервые работаете с Raspberry Pi Pico? Прочитайте следующее руководство: Начало работы с Raspberry Pi Pico (и Pico W).

Содержание:

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

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

Прежде чем приступить к этому руководству, убедитесь, что выполнены следующие предварительные требования.

Прошивка MicroPython

Для выполнения этого руководства вам необходима прошивка MicroPython, установленная на вашу плату Raspberry Pi Pico. Также вам понадобится IDE для написания и загрузки кода на плату.

Логотип MicroPython

Рекомендуемой IDE для MicroPython на Raspberry Pi Pico является Thonny IDE. Следуйте следующему руководству, чтобы узнать, как установить Thonny IDE, прошить MicroPython и загрузить код на плату.

Кроме того, если вы предпочитаете программировать в VS Code, вы можете начать со следующего руководства:

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

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

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

  • Raspberry Pi Pico или Pico W

  • Макетная плата (опционально)

  • Соединительные провода (опционально)

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

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

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

BH1750 два различных модуля

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

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

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

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

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

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

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

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

  • Малая вариация измерений (+/- 20%)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Применение

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

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

  • для определения, является ли время суток днем или ночью;

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

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

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

Подключение BH1750 к Raspberry Pi Pico

Датчик BH1750 использует протокол связи I2C для взаимодействия с микроконтроллерами. Ознакомьтесь с его распиновкой в таблице ниже.

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

Вот распиновка BH1750, она одинакова для обоих модулей:

VCC

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

GND

GND

SCL

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

SDA/DAT

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

ADDR

Выбор адреса

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

  • Вывод ADDR не подключен или соединен с GND -> адрес: 0x23

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

Мы подключим датчик к Raspberry Pi Pico на GPIO 4 (SDA) и GPIO 5 (SCL).

BH1750

Raspberry Pi Pico

VCC

3V3(OUT)

GND

GND

SCL

GPIO 5

SDA

GPIO 4

ADDR*

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

Если не подключать вывод ADDR, мы выбираем I2C-адрес 0x23. Тем не менее, всегда лучше запустить I2C-сканер, чтобы убедиться:

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

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

Raspberry Pi Pico и Pico W BH1750 схема подключения

Библиотека BH1750 для MicroPython

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

Откройте следующую ссылку и скопируйте код библиотеки в Thonny IDE:

Выполните следующие шаги, чтобы загрузить библиотеку на вашу плату Pico:

1) Скопируйте код библиотеки в новый файл. Код библиотеки bh1750.py можно найти здесь.

# Micropython BH1750 ambient light sensor driver: https://github.com/PinkInk/upylib/tree/master/bh1750

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 MicroPython сохранить файл библиотеки на устройство

3) Выберите сохранение на «Raspberry Pi Pico»:

Сохранение файлов на Raspberry Pi Pico в Thonny IDE

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

Сохранение bh1750.py на Raspberry Pi Pico

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

Файл BH1750 сохранен на плате Raspberry Pi Pico

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

Raspberry Pi Pico – BH1750 Освещенность (Lux) – Код

После загрузки библиотеки на Raspberry Pi Pico создайте новый файл и вставьте следующий код. Он считывает освещенность в люксах и выводит показания в Shell каждые две секунды.

# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-bh1750-micropython/

from machine import Pin, SoftI2C
from bh1750 import BH1750
import time

# Initialize I2C communication
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 5 и 4 — выводах I2C, к которым подключен датчик.

# Initialize I2C communication
i2c = SoftI2C(scl=Pin(5), sda=Pin(4), freq=400000)

Затем создаем экземпляр BH1750 с именем light_sensor на шине I2C, определенной ранее.

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))

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

Запустите предыдущий код на вашей плате Raspberry Pi Pico. Вы должны получать новые значения освещенности в люксах каждые две секунды.

MicroPython получение значений освещенности от датчика BH1750 с Raspberry Pi Pico

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

Raspberry Pi Pico с датчиком освещенности BH1750

Заключение

В этом руководстве вы узнали, как использовать датчик освещенности BH1750 с Raspberry Pi Pico для получения измерений окружающего освещения в единицах LUX.

У нас есть аналогичное руководство для других плат:

  • ESP32 с датчиком освещенности BH1750 (Arduino IDE)

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

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

У нас также есть руководства для других датчиков с Raspberry Pi Pico, которые могут вас заинтересовать:

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