Пристрій цифрового датчика освітленості BH1750FVI використовує інтерфейс I2C, що дозволяє йому бути підключений до Raspberry Pi (RPi) тільки за допомогою чотирьох дротів.
Модуль дозволяє швидке і дешеве вимірювання рівня освітленості і цей рівень освітленості можна прочитати з нього у вигляді цифрового числа у зв'язку з вбудованим 16-бітним перетворювачем аналогового сигналу в цифровий. Сам пристрій зазвичай використовується в мобільних телефонах, LCD-телевізорах і цифрових камерах.
Модуль має розміри лише 32х16 мм. На друкованій платі можна припаяти роз’єм на п'ять контактів, що дозволяє підключити модуль до плати RPi.
Всі технічні деталі дає BH1750 Ambient Light Sensor IC datasheet, деякі з яких використовуються в наведеному нижче прикладі сценарію на Python.
Налаштування інтерфейсу I2C
Для того, щоб використовувати даний модуль, необхідно включити інтерфейс I2C на RPi, бо він не включений за замовчуванням. Це досить простий процес і описується в статті про включення інтерфейсу I2C на Raspberry Pi.
Підключення устаткування
Наступна таблиця показує, як можна підключити контакти друкованої плати модуля до роз’єму GPIO RPi (P1). Будь ласка, зверніться до керівництва про використанняGPIO для отримання подробиць.
Вище наведена таблиця підключення модуля. Якщо ви підключаєтеся п'ять контактів модуля безпосередньо до RPi, то необхідно мати лише п'ять провідників типу «мама-мама».
Вище показана схема використання користувальницької частини, створена з Fritzing для для даного модуля. Інші модулі можуть мати різне розташування контактів, тому переконайтеся, що ви підключаєте до RPi правильні виводи.
За допомогою команди "i2cdetect" пристрій, підключений і з поданим на RPi живленням, повинен показати пристрій з адресою 0x23.
Приклад коду Python
Простий сценарій Python для читання з модуля рівня освітленості:
#!/usr/bin/python
import smbus
import time
# Проста функція для перетворення 2 бай даних
# в десяткове число
def convertToNumber(data):
return ((data[1] + (256 * data[0])) / 1.2)
# Визначаємо деякі константи з datasheet
DEVICE = 0x23 # Адреса I2C-пристрою
POWER_DOWN = 0x00 # Немая активного стану
POWER_ON = 0x01 # Вмикання
RESET = 0x07 # Обнулення значення регістру даних
# Старт вимірювання при дозволі 4lx. Типовий час 16мс.
CONTINUOUS_LOW_RES_MODE = 0x13
# Старт вимірювання при дозволі 1lx. Типовий час 120мс
CONTINUOUS_HIGH_RES_MODE_1 = 0x10
# Старт вимірювання при дозволі 0.5lx. Типовий час 120мс
CONTINUOUS_HIGH_RES_MODE_2 = 0x11
# Старт вимірювання при дозволі 1lx. Типовий час 120мс
# Пристрій автоматично встановлює понижену потужність після вимірювання.
ONE_TIME_HIGH_RES_MODE_1 = 0x20
# Старт вимірювання при дозволі 0.5lx. Типовий час 120мс
# Пристрій автоматично встановлює понижену потужність після вимірювання.
ONE_TIME_HIGH_RES_MODE_2 = 0x21
# Старт вимірювання при дозволі 1lx. Типовий час 120мс
# Пристрій автоматично встановлює понижену потужність після вимірювання.
ONE_TIME_LOW_RES_MODE = 0x23
#bus = smbus.SMBus(0) # Rev 1 RPi використовує 0
bus = smbus.SMBus(1) # Rev 2 RPi використовує 1
while True:
data = bus.read_i2c_block_data(DEVICE,ONE_TIME_HIGH_RES_MODE_1)
print "Light Level : " + str(convertToNumber(data)) + " lx"
time.sleep(0.2)
Якщо хочете завантажити цей сценарій прямо на свій RPi, то використайте наступну команду:
wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/bh1750.py
або це посилання у браузері.
Для того, щоб запустити сценарій, введіть:
sudo python bh1750.py
Результат повинен виглядати приблизно так:
Цикл триває без кінця, знімаючи показання кожні 200 мс, поки ви не натиснете CTRL+C.
Примітки до сценарію:
- Оголошення імпорту імпортує бібліотеки Python, які використовуються в решті частини коду, включаючи smbus, який обробляє інтерфейс I2C.
- Всі I2C пристрої повинні мати адресу. У цьому прикладі автор приєднав вивід ADD до землі, щоб адреса, яка використовується пристроєм, була 0x23. Якщо вивід ADD приєднаний до 3,3В, то адреса буде 0x5C.
- Блок констант наведений в специфікації і визначає різні режими, в яких пристрій може працювати. Автор визначив всі з них, але використав тільки "ONE_TIME_HIGH_RES_MODE_1". Інші режими лише тоді мають якийсь реальний інтерес, якщо вам потрібно зняти показання з високою швидкістю.
- Функція “smbus.SMBus(1)” налаштовує інтерфейс I2C.
- Функція “read_i2c_block_data” використовується для читання 2 байт даних з пристрою за допомогою ONE_TIME_HIGH_RES_MODE_1.
- Функція convertToNumber використовується, щоб перетворити два байти даних в число. Значення 1.2 у розрахунку взяте із специфікації.
Джерело EN: raspberrypi-spy.co.uk