Raspberry Pi Pico: датчик освещенности BH1750 (MicroPython)
Узнайте, как использовать датчик освещенности BH1750 с Raspberry Pi Pico, программируемым на MicroPython, для получения измерений окружающего освещения. Мы покажем, как подключить датчик, установить необходимые библиотеки и получить показания датчика в единицах LUX — стандартизированной единице измерения освещенности.
Впервые работаете с Raspberry Pi Pico? Прочитайте следующее руководство: Начало работы с Raspberry Pi Pico (и Pico W).
Содержание:
В этом руководстве мы рассмотрим следующие темы:
Предварительные требования
Прежде чем приступить к этому руководству, убедитесь, что выполнены следующие предварительные требования.
Прошивка MicroPython
Для выполнения этого руководства вам необходима прошивка MicroPython, установленная на вашу плату Raspberry Pi Pico. Также вам понадобится IDE для написания и загрузки кода на плату.
Рекомендуемой 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.
Интерфейс шины I2C
Преобразователь освещенности в цифровой сигнал
Диапазон: 1 – 65535 люкс
Низкое энергопотребление благодаря функции выключения питания
Функция подавления шума от освещения 50 Гц / 60 Гц
Возможность выбора 2 различных адресов ведомого устройства I2C
Малая вариация измерений (+/- 20%)
Влияние инфракрасного излучения очень мало
Поддержка режима непрерывных измерений
Поддержка режима однократного измерения
Режимы измерения
Датчик поддерживает два различных режима измерения: режим непрерывного измерения и режим однократного измерения. Каждый режим поддерживает три различных режима разрешения.
Режим низкого разрешения |
Точность 4 люкс |
Время измерения 16 мс |
Режим высокого разрешения |
Точность 1 люкс |
Время измерения 120 мс |
Режим высокого разрешения 2 |
Точность 0.5 люкс |
Время измерения 120 мс |
В режиме непрерывного измерения датчик непрерывно измеряет значения окружающего освещения. В режиме однократного измерения датчик измеряет значение окружающего освещения один раз, а затем переходит в режим выключения питания.
Применение
BH1750 — это датчик освещенности, поэтому его можно использовать в самых разнообразных проектах. Например:
для определения, является ли время суток днем или ночью;
для регулировки или включения/выключения яркости светодиодов в зависимости от окружающего освещения;
для регулировки яркости ЖК-дисплеев и экранов;
для определения, горит ли светодиод;
…
Подключение BH1750 к Raspberry Pi Pico
Датчик BH1750 использует протокол связи I2C для взаимодействия с микроконтроллерами. Ознакомьтесь с его распиновкой в таблице ниже.
Вот распиновка 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-сканер, чтобы убедиться:
Схема подключения
Вы можете использовать следующую схему в качестве справочного материала.
Библиотека 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)
2) Перейдите в File > Save as…
3) Выберите сохранение на «Raspberry Pi Pico»:
4) Назовите файл *bh1750.py* и нажмите кнопку OK:
Вот и всё. Библиотека была загружена на вашу плату. Чтобы убедиться, что она была загружена успешно, перейдите в File > Save as… и выберите устройство 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. Вы должны получать новые значения освещенности в люксах каждые две секунды.
Закройте датчик или направьте на него свет, чтобы увидеть изменение значений.
Заключение
В этом руководстве вы узнали, как использовать датчик освещенности BH1750 с Raspberry Pi Pico для получения измерений окружающего освещения в единицах LUX.
У нас есть аналогичное руководство для других плат:
ESP32 с датчиком освещенности BH1750 (Arduino IDE)
ESP8266 NodeMCU с датчиком освещенности BH1750 (Arduino IDE)
Arduino с датчиком освещенности BH1750
У нас также есть руководства для других датчиков с Raspberry Pi Pico, которые могут вас заинтересовать:
Raspberry Pi Pico: BME280 — Получение температуры, влажности и давления (MicroPython)
Raspberry Pi Pico: DS18B20 — Датчик температуры (MicroPython) — Одиночный и множественный
Raspberry Pi Pico: DHT11/DHT22 — Датчик температуры и влажности (MicroPython)
Надеемся, вы нашли это руководство полезным. Спасибо за чтение.