Телефонуйте » (+38) 096 227 41 41

Пристрій цифрового датчика освітленості 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

Новини

  • SDR в IoT

    iotSDR пропонує платформу розробок для IoT-радіо та мережевих доменів. На платі два передавачі Microchip AT86RF215, для вводу-виводу модему на Xilinx ZYNQ SoC, приймач GNSS MAX2769 для GPS, Galileo, BieDou та Glonass. Плата сумісна з ПЗ GNURadio SDR. Дозволяє розробити протоколи фізичного рівня LoRa, SigFox, WightLess, Bluetooth, BLE, 802.15.4, ZigBee тощо для IoT, або шлюз IoT через TheThingsNetwork, LPWAN або Google Thread. Пам'ять EEPROM: 1x AT24MAC602 , flash-пам'ять: 1x QSPI 128 Мб, RAM: 256 MБ DDR3,слот для Micro SD карти, входи/виходи: 2x 8-бітних інтерфейси PL, інтерфейс 8-бітного PS, Gigabit Ethernet, USB 2.0 (USB3310), USB 2.0 (CP2104), 2x SMA RF-роз'єми для приймача діапазонів IoT, 2x SMA RF-роз'єми для приймача 2,4 ГГц , RF-роз'єм приймач GNSS, FPGA-роз'єм JTAG для програмування. Розміри плати: 76,2 мм x 101,6 мм.

     

    in Новини

Записатися на курс