Общие сведения:
Trema модуль - Датчик освещенности, люксметр, I2C-flash - является цифровым датчиком способным возвращать значение освещённости в люксах и коэффициент пульсаций света в процентах, а так же определять близость препятствий.
Модуль относится к серии «Flash», а значит к одной шине I2C можно подключить более 100 модулей, так как их адрес на шине I2C (по умолчанию 0x09), хранящийся в энергонезависимой памяти, можно менять программно.
Модуль можно использовать в любых проектах где требуется определять освещённость.
Видео:
Спецификация:
- Напряжение питания: 3,3 В или 5 В (постоянного тока).
- Потребляемый ток: до 5 мА.
- Диапазон измерений освещённости: от 0 до 8191 лк.
- Диапазон измерений пульсаций света: от 0 до 100%.
- Диапазон обнаружения близости препятствий: от 0 до 1023.
- Интерфейс: I2C.
- Скорость шины I2C: 100 кбит/с.
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
- Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
- Рабочая температура: от -20 до +70 °С.
- Габариты: 30 х 30 мм.
- Вес: 4 г.
Все модули линейки "Trema" выполнены в одном формате
Подключение:
По умолчанию все модули FLASH-I2C имеют установленный адрес 0х09.
— Перед подключением 1 модуля к шине I2C настоятельно рекомендуется изменить адрес модуля.
— При подключении 2 и более FLASH-I2C модулей к шине необходимо в обязательном порядке предварительно изменить адрес каждого модуля, после чего уже подключать их к шине.
Более подробно о том, как это сделать, а так же о многом другом, что касается работы FLASH-I2C модулей, вы можете прочесть в этой статье.
Модуль подключается к шине I2C.
Для удобства подключения, предлагаем воспользоваться Trema+Expander Hat.
Модуль удобно подключать 2 способами, в зависимости от ситуации:
Способ - 1: Используя провода и Raspberry Pi
Используя провода «Мама — Мама», подключаем напрямую к Raspberry Pi, согласно следующей таблице:
Вывод модуля | Вывод Raspberry |
---|---|
Vcc | 3.3V |
GND | GND |
SDA | GPIO 23 |
SCL | GPIO 24 |
В этом случае необходимо питать логическую часть модуля от 3,3 В Raspberry
Способ - 2: Используя Trema+Expander Hat
Подключаем к Trema+Expander Hat.
Питание:
Входное напряжение питания модуля 3,3В или 5В постоянного тока (поддерживаются оба напряжения питания), подаётся на выводы Vcc и GND.
Подробнее о модуле:
Модуль построен на базе датчика APDS-9930, микроконтроллера STM32F030F4 и снабжен собственным стабилизатором напряжения. Модуль самостоятельно обрабатывает сигналы поступающие с его датчика, обрабатывает их и возвращает запрошенные результаты.
Модуль позволяет:
- Менять свой адрес на шине I2C.
- Получать уровень освещённости.
- Получать коэффициент пульсаций света.
- Получать близость препятствий.
- Задавать коэффициент сглаживания показаний освещённости и приближения.
- Реагировать на изменение освещённости с заданным порогом чувствительности.
Примеры:
Специально для работы с Trema модулем - Датчик температуры и влажности, I2C-flash, нами разработана библиотека pyiArduinoI2Cdsl которая позволяет реализовать все функции модуля.
Для работы с модулем необходимо включить шину I2C.
Для подключения библиотеки необходимо сначала её установить. Сделать это можно в менеджере модулей в Thonny или в терминале Raspberry, в виртуальной среде, командой:
pip install pyiArduinoI2Cdsl
Подробнее об установке библиотек можно узнать в этой статье.
Смена адреса модуля на шине I2C:
# Подключаем библиотеку для работы с датчиком температуры и влажности from pyiArduinoI2Cdsl import * import sys # Объявляем объект module для работы с функциями и методами библиотеки pyiArduinoI2Cdsl. # Если при объявлении объекта указать адрес, например, pyiArduinoI2Cdsl(address = 0x0B), # то пример будет работать с тем модулем, адрес которого был указан. module = pyiArduinoI2Cdsl(auto = NO_BEGIN, bus = "/dev/i2c-3") # Если сценарию не были переданы аргументы if len(sys.argv) < 2: # Назначаем модулю адрес (0x07 < адрес < 0x7F). newAddress = 0x09 # Иначе else: # Новый адрес - первый аргумент newAddress = int(sys.argv[1]) # Если датчик найден if module.begin(): print("Найден датчик %#.2x" % module.getAddress()) # Если адрес удалось изменить if module.changeAddress(newAddress): print("Адрес изменён на %#.2x" % module.getAddress()) else: print("Адрес не изменён!") else: print("Датчик не найден!")
Для работы данного примера, на шине I2C должен быть только один датчик освещённости.
Данный скетч демонстрирует не только возможность смены адреса на
указанный в переменной newAddress
, но и обнаружение, и
вывод текущего адреса модуля на шине I2C.
Чтение всех значений датчика:
from pyiArduinoI2Cdsl import * from time import sleep # Объявляем объект dsl для работы с функциями и методами # библиотеки pyiArduinoI2Cdsl. # Если при объявлении объекта указать адрес, например, dsl(0x0B), # то пример будет работать с тем модулем, адрес которого был указан. dsl = pyiArduinoI2Cdsl(bus = "/dev/i2c-3") while True: # Получаем освещённость с датчика lux = dsl.getLux() # Получаем коэффициент пульсаций pulse = dsl.getPulsation() # Получаем близость препятствий prox = dsl.getProximity() # Выводим показания в stdout print("Освещённость = " + str(lux) + " лк.\t" + "Мерцание = " + str(pulse) + "%\t" + "Близость = " + str(prox) ) sleep(.5)
После загрузки данного примера, в stdout будут появляться все данные, которые способен вернуть модуль: освещённость, коэффициент пульсаций и близость.
Чтение изменения освещённости:
# Подключаем библиотеку для работы с датчиком # освещённости I2C-flash (Digital Sensor Light). from pyiArduinoI2Cdsl import * # Объявляем объект dsl для работы с функциями и методами # библиотеки pyiArduinoI2Cdsl. # Если при объявлении объекта указать адрес, например, pyiArduinoI2Cdsl(address = 0x0B), # то пример будет работать с тем модулем, адрес которого был указан. dsl = pyiArduinoI2Cdsl(bus = "/dev/i2c-3") # Указываем фиксировать изменение освещённости более чем на 10 лк. dsl.setLuxChange(10) while True: # Если освещённость изменилась более чем на значение # указанное в функции setLuxСhanged(), то ... if dsl.getLuxChanged(): # Выводим текущую освещённость, от 0 до 8191 лк. print("Освещённость = " + str(dsl.getLux()) + " лк.")
После загрузки данного примера, в stdout будут появляться показания текущей освещённости, но только если она меняется. Если Вам требуется получать освещённость вне зависимости от того изменилась она или нет, то воспользуйтесь предыдущим примером, выводя только показания освещённости.
Описание функций библиотеки:
В данном разделе описаны функции библиотеки pyiArduinoI2Cdsl для работы с Trema модулем - Датчик освещенности, люксметр, I2C-flash.
Подключение библиотеки:
- Если адрес модуля известен (в примере используется адрес 0x09):
from pyiArduinoI2Cdsl import * # Подключаем библиотеку для работы с модулем. dsl = pyiArduinoI2Cdsl(bus = "/dev/i2c-3", address = 0x09) # Создаём объект dsl для работы с функциями и методами библиотеки pyiArduinoI2Cdsl, указывая шину и адрес модуля на шине I2C.
- Если адрес модуля неизвестен (адрес будет найден автоматически):
from pyiArduinoI2Cdsl import * # Подключаем библиотеку для работы с модулем. dsl = pyiArduinoI2Cdsl(bus = "/dev/i2c-3") # Создаём объект dsl для работы с функциями и методами библиотеки pyiArduinoI2Cdsl, указывая шину I2C.
При создании объекта без указания адреса, на шине должен находиться только один модуль.
Функция begin();
- Назначение: Инициализация работы с модулем.
- Синтаксис: begin();
- Параметры: Нет.
- Возвращаемое значение: результат инициализации (True или False).
- Примечание: По результату инициализации можно определить наличие модуля на шине, автоматически выполняется в конструкторе класса, для предотвращения автоматического выполнения можно передать в конструктор класса второе значение, отличное от 0 или константу NO_BEGIN. Например dsl = pyiArduinoI2Cdsl(auto = NO_BEGIN).
- Пример:
if dsl.begin(): print("Модуль найден и инициирован!" ) else: print("Модуль не найден на шине I2C" )
Функция reset()
- Назначение: Перезагрузка модуля.
- Синтаксис: reset()
- Параметры: Нет.
- Возвращаемое значение: результат перезагрузки (True или False).
- Пример:
if dsl.reset(): print("Модуль перезагружен") else: print("Модуль не перезагружен")
Функция changeAddress()
- Назначение: Смена адреса модуля на шине I2C.
- Синтаксис: changeAddress( АДРЕС );
- Параметры:
- АДРЕС - новый адрес модуля на шине I2C (целое число от 0x08 до 0x7E)
- Возвращаемое значение: результат смены адреса (True или False).
- Примечание: Текущий адрес модуля можно узнать функцией getAddress().
- Пример:
if dsl.changeAddress(0x12): print("Адрес модуля изменён на 0x12") else: print("Не удалось изменить адрес")
Функция getAddress()
- Назначение: Запрос текущего адреса модуля на шине I2C.
- Синтаксис: getAddress()
- Параметры: Нет.
- Возвращаемое значение: АДРЕС - текущий адрес модуля на шине I2C (от 0x08 до 0x7E)
- Примечание: Функция может понадобиться если адрес модуля не указан при создании объекта, а обнаружен библиотекой.
- Пример:
print("Адрес модуля на шине I2C = %#.2X" % dsl.getAddress())
Функция getVersion()
- Назначение: Запрос версии прошивки модуля.
- Синтаксис: getVersion()
- Параметры: Нет
- Возвращаемое значение: ВЕРСИЯ - номер версии прошивки от 0 до 255.
- Пример:
print("Версия прошивки модуля =", dsl.getVersion())
Функция getLux()
- Назначение: Запрос уровня освещённости в люксах.
- Синтаксис: getLux();
- Параметры: Нет.
- Возвращаемое значение: уровень освещённости от 0 до 8191 лк.
- Примечание:
- При увеличении реальной освещённости более 8191 лк, возвращаемые функцией значения будут резко снижаться.
Пример:
print( "Освещённость =", dsl.getLux(), "лк.")
Функция getPulsation()
- Назначение: Запрос коэффициента пульсаций света.
- Синтаксис: getPulsation()
- Параметры: Нет.
- Возвращаемое значение: коэффициент пульсаций света от 0 до 100%.
- Примечание:
- Коэффициент пульсаций света определяется модулем в процентах, как разность максимальной и минимальной освещённости среди последних 20 измерений.
Пример:
print("Свет пульсирует на ", dsl.getPulsation(), "%")
Функция getProximity()
- Назначение: Запрос уровня близости препятствий.
- Синтаксис: getProximity();
- Параметры: Нет.
- Возвращаемое значение: uint16_t - значение близости от 0 (нет препятствий) до 1023.
- Примечание:
- Значение возвращаемое данной функцией позволяет определить степень близости препятствия, а не расстояние до него.
Пример:
i = dsl.getProximity() if i > 1000: print("Модуль перекрыт") elif i > 512: # примерно 1 ... 5 см. print("Препятствие очень близко") elif i > 100: # примерно 5 ... 10 см. print("Препятствие близко") elif i > 0: # примерно 10 ... 20 см. print("Препятствие далеко") else: print("Препятствий нет")
Функция getLuxChanged()
- Назначение: Запрос подтверждения изменения освещённости.
- Синтаксис: getLuxChanged()
- Параметр: Нет.
- Возвращаемое значение: подтверждение изменения освещённости (True или False).
- Примечание:
- Функция возвращает положительный результат
True
, если с момента последнего положительного результата, освещённость изменилась на значение указанное функциейsetLuxChange()
.
- Функция возвращает положительный результат
Функция setLuxChange()
- Назначение: Установка порога чувствительности фиксации изменения освещённости.
- Синтаксис: setLuxChange( ПОРОГ )
- Параметры: ПОРОГ - значение от 1 до 255 лк.
- Возвращаемое значение: результат применения новых настроек (True или False).
- Примечание:
- Данная функция определяет, как сильно должна измениться
освещённость, чтоб функция
getLuxChanged()
вернулаTrue
.
- Данная функция определяет, как сильно должна измениться
освещённость, чтоб функция
- Пример:
# Указываем реагировать на изменения в 10 лк. dsl.setLuxChanged(10) while True: # Если освещённость изменилась, то ... if dsl.getLuxChanged(): # Выводим текущую освещённость. print("Освещённость = ", dsl.getLux(), " лк.")
Функция setAveraging();
- Назначение: Установка коэффициента усреднения показаний освещённости и близости.
- Синтаксис: setAveraging( УСРЕДНЕНИЕ );
- Параметр:
- УСРЕДНЕНИЕ - значение от 0 (не усреднять) до 255 (максимальное усреднение).
- Возвращаемое значение: результат сохранения настроек (True или False).
- Примечание:
- Чем выше значение усреднения, тем плавнее будут меняться показания освещённости и близости. Слишком высокое усреднение приведёт к большой инерционности показаний, а слишком маленькое усреднение приведёт к «скачкам» показаний. Значение по умолчанию 63 (25% от максимального значения).
- Пример:
dsl.setAveraging(50)
Функция changeBus()
- Назначение: Установка шины I2C
- Синтаксис: changeBus( ПУТЬ К ФАЙЛУ ШИНЫ )
- Параметр:
- ПУТЬ К ФАЙЛУ ШИНЫ - строка
- Возвращаемые значения: Нет.
- Примечание:
- Пример:
# Меняем шину dsl.changeBus("/dev/i2c-3")
Обсуждение