Энкодер, потенциометр, i2c - Datasheet

Трема модуль - Энкодер, потенциометр, I2C-flash.

Техническое описание: Данная страница содержит подробное техническое описание Trema модуля - энкодер, потенциометр, I2C-flash и раскрывает работу с модулем через его регистры.

Ознакомиться с пользовательским описанием модуля и примерами работы с библиотекой iarduino_I2C_Encoder можно на странице Wiki - Энкодер, потенциометр, I2C-flash (Trema-модуль).

Назначение:

Trema модуль - Энкодер, потенциометр, I2C-flash - является устройством ввода данных с подключением по шине I2С. У модуля есть программируемый выход, значительно расширяющий его возможности.

Управление модулем осуществляется по шине I2C. К одной шине I2C можно подключить более 100 модулей. Адрес модуля на шине I2C (по умолчанию 0x09) назначается программно и хранится в его энергонезависимой памяти.

Модуль можно использовать в любых проектах где требуется тактовая кнопка, потенциометр или энкодер, а так же в тех проектах где требуется диммирование устройств без участия других микроконтроллеров.

Описание:

Модуль построен на базе микроконтроллера STM32F030F4 и снабжен собственным стабилизатором напряжения. Модуль считывает состояние энкодера (и его тактовой кнопки), сохраняя данные в своих регистрах. Доступ к регистрам модуля осуществляется по шине I2C. Отличием данного модуля является наличие вывода, который можно запрограммировать для работы в качестве выхода без дальнейшего подключения модуля к шине I2C (без подключения к внешнему микроконтроллеру). Вывод модуля может работать как выход кнопки энкодера, как выход кнопочного переключателя (триггер), как выход с ШИМ (для управления моторами, светодиодами) и как аналоговый выход (ЦАП) с напряжением от 0 до 3,3 В. Режим работы выхода сохраняется и после отключения питания. Значит вывод можно однократно запрограммировать и использовать модуль в проектах без подключения к шине I2C.

С помощью регистров модуля можно выполнять следующие действия:

  • Изменить адрес данного модуля на шине I2C. При изменении адреса, можно указать, что новый адрес должен сохраниться в flash память модуля, а значит адрес сохранится и после отключения питания.
  • Узнать количество тактов поворота энкодера совершённые в одну и другую сторону с момента последнего чтения данной информации (полный оборот энкодера состоит из 20 тактов).
  • Получить значение счётчика определяющее текущее положение энкодера. Каждый такт поворота энкодера приращает или уменьшает значение счётчика (зависит от направления поворота энкодера), пока не будет достигнуто заданное количество полных оборотов. Наличие данного счётчика позволяет работать с модулем как с потенциометром.
  • Сбросить счётчик текущего положения энкодера в 0.
  • Задать количество полных оборотов энкодера для счетчика положения. По достижении указанного количества полных оборотов, значение счётчика перестаёт изменяться, пока энкодер не начнут поворачивать в противоположную сторону.
  • Задать режим работы счётчика положения энкодера, со знаком или без. Счетчик может вести счёт от 0 до максимального количества полных оборотов, или от 0 до ± максимального количества полных оборотов (зависит от направления поворота энкодера).
  • Определить: события кнопки энкодера - нажимается / отпускается, состояния кнопки энкодера - нажата / отпущена, факт смены состояния кнопки и удержания кнопки дольше 0.5, 1 и 2 секунд, прочитать бит-триггер который меняет свое состояние с каждым новым нажатием на кнопку.
  • Узнать время прошедшее с момента установки текущего состояния кнопки нажата / отпущена.
  • Запрограммировать вывод модуля на работу в качестве выхода кнопки энкодера, кнопочного переключателя (триггер), как выход с ШИМ, как аналоговый выход (ЦАП), или отключить выход модуля. Заданный режим работы вывода модуля сохраняется и после отключения питания.
  • Задать количество полных оборотов энкодера за которое уровень ШИМ или ЦАП на выходе модуля будет изменяться от 0% до 100%. Заданное количество полных оборотов сохраняется и после отключения питания.
  • Задать частоту ШИМ от 1 до 12'000 Гц, частота сохраняется и после отключения питания.

Выводы модуля:

У модуля имеются две колодки выводов: разъём I2C (GND, Vcc, SDA, SCL) и разъём D/A (GND, Vcc, Signal).

  • SCL - вход/выход линии тактирования шины I2C.
  • SDA - вход/выход линии данных шины I2C.
  • Vcc - вход питания 3,3 или 5 В.
  • GND - общий вывод питания.
  • Signal - программируемый выход модуля.

Вывод «Vcc» колодки «I2C» электрически соединён с выводом «Vcc» колодки «D/A», равно как и вывод «GND» колодки «I2C» соединён с выводом «GND» колодки «D/A». Это позволяет подать питание на колодку «I2C», а питание для устройства которым управляет модуль взять с колодки «D/A» (Digital/Analog).

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

  • Напряжение питания: 3,3 В или 5 В (постоянного тока).
  • Потребляемый ток: до 15 мА (без нагрузки на программируемом выходе).
  • Интерфейс: I2C.
  • Скорость шины I2C: 100 кбит/с.
  • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
  • Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
  • Уровень логической 1 на выходе Signal: 3,3 В.
  • Аналоговый уровень на выходе Signal: от 0 до 3,3 В.
  • Разрешение ШИМ: 8 бит.
  • Разрешение ЦАП: 8 бит (ШИМ + RC-фильтр).
  • Частота ШИМ: устанавливается программно от 1 до 12000 Гц (по умолчанию 1,5 кГц).
  • Рабочая температура: от -20 до +70 °С.
  • Габариты: 30 х 30 мм.
  • Вес: 12 г.

Установка адреса:

Trema модуль - Энкодер, потенциометр, I2C-flash относится к серии «Flash» модулей. Все модули данной серии позволяют назначать себе адрес для шины I2C, как временно (новый адрес действует пока есть питание), так и постоянно (новый адрес сохраняется в энергонезависимую память и действует даже после отключения питания). По умолчанию все модули серии «Flash» поставляются с адресом 0x09.

Допускается указывать адреса в диапазоне: 7 < адрес < 127.

Установка адреса (без сохранения):

Если в регистр 0x06 «ADDRESS» записать значение из 7 бит адреса и младшим битом «SAVE_FLASH» равным 0, то указанный адрес станет адресом модуля на шине I2C, но он не сохранится во FLASH памяти, а значит после отключения питания, установится прежний адрес модуля.

Установка адреса (с сохранением):

Для установки адреса с его сохранением в FLASH память модуля необходимо выполнить два действия:

  • Установить бит «SAVE_ADR_EN» в регистре 0x01 «BITS_0» (при этом адрес модуля останется прежним).
  • Записать в регистр 0x06 «ADDRESS» значение из 7 бит адреса и младшим битом «SAVE_FLASH» равным 1.
  • Если не выполнить первое действие (не установить бит «SAVE_ADR_EN»), то новый адрес будет проигнорирован и у модуля останется старый адрес.
  • ВАЖНО: запись адреса занимает не менее 30 мс. После сохранения адреса бит «SAVE_ADR_EN» в регистре 0x01 «BITS_0» самостоятельно сбросится в 0.

Регистры:

Карта регистров модуля:

адрес76543210
0x00 FLG_RESET FLG_SELF_TEST - - - - - -
0x01 SET_RESET SET_SELF_TEST - - - - SAVE_ADR_EN -
0x02
0x03
RESERVED
0x04 MODEL[7-0]
0x05 VERSION[7-0]
0x06 ADDRESS[6-0] SAVE_FLASH
0x07 CHIP_ID[7-0]
0x08
0x09
FREQUENCY[7-0]
FREQUENCY[15-8]
0x0A
---
0x0F
RESERVED
0x10 PUSHED RELEASED PRESSED TRIGGER HOLD_05 HOLD_10 HOLD_20 CHANGED
0x11 KEY_TIME[7-0]
0x12 PIN_MAX_TURN[3-0] PIN_MODE[3-0]
0x13 RES_SIGN_EN RES_RESET RES_MAX_TURN[5-0]
0x14 RES_COUNTER[7-0]
0x15 RES_SIGN RES_COUNTER[14-8]
0x16 ENC_COUNTER_LEFT[7-0]
0x17 ENC_COUNTER_RIGHT[7-0]

Регистры с адресами 0x02, 0x03, 0x0A - 0x0F зарезервированы, их биты сброшены в 0. Попытка записи данных в эти регистры будет проигнорирована модулем.

Регистр 0x00 «FLAGS_0» - содержит флаги чтения состояния модуля:

Регистр только для чтения.

  • FLG_RESET - Флаг указывает на факт выполнения успешной перезагрузки модуля. Флаг самостоятельно сбрасывается после чтения регистра 0x00 «FLAGS_0».
  • FLG_SELF_TEST - Флаг указывает на результат выполнения самотестирования модуля (0-провал, 1-успех). Не поддерживается данным модулем.

Регистр 0x01 «BITS_0» - содержит биты установки состояния модуля:

Регистр для записи и чтения.

  • SET_RESET - Бит запускает программную перезагрузку модуля. О завершении перезагрузки свидетельствует установка флага «FLG_RESET» регистра 0x00 «FLAGS_0».
  • SET_SELF_TEST - Бит запускает самотестирование модуля. При успешном завершении самотестирования устанавливается флаг «FLG_SELF_TEST » регистра 0x00 «FLAGS_0». Не поддерживается данным модулем.
  • SAVE_ADR_EN - Бит разрешает записать новый адрес модуля для шины I2C в FLASH память. Бит самостоятельно сбрасывается после сохранения адреса во FLASH память. Запись адреса выполняется следующим образом: нужно установить бит «SAVE_ADR_EN», после чего записать новый адрес в регистр 0x06 «ADDRESS» с установленным битом «SAVE_FLASH».

Регистр 0x04 «MODEL» - содержит идентификатор типа модуля:

Регистр только для чтения.

  • MODEL[7-0] - Для Trema энкодера, потенциометра, I2C-flash - идентификатор равен 0x09.

Регистр 0x05 «VERSION» - содержит версию прошивки модуля:

Регистр только для чтения.

  • VERSION[7-0] - Версия прошивки (от 0x01 до 0xFF).

Регистр 0x06 «ADDRESS» - отвечает за чтение/установку адреса модуля на шине I2C:

Регистр для чтения и записи.

  • ADDRESS[6-0] - 7 бит адреса модуля на шине I2C. При чтении возвращается текущий адрес модуля, при записи устанавливается указанный адрес модулю. Допускается указывать адреса в диапазоне: 7 < адрес < 127.
  • SAVE_FLASH - Флаг записи адреса в FLASH память модуля.
    Флаг имеет значение только при записи данных в регистр.
    Если флаг сброшен, то адрес в битах ADDRESS[6-0] будет установлен временно (до отключения питания, или сброса/записи нового адреса). Если флаг установлен, то адрес в битах ADDRESS[6-0] будет сохранён в FLASH память модуля (останется и после отключения питания), но только если в бите «SAVE_ADR_EN» регистра 0x01 «BITS_0» установлена логическая 1. Если флаг «SAVE_FLASH» установлен, а бит «SAVE_ADR_EN» сброшен, то адрес в битах ADDRESS[6-0] не будет установлен ни временно, ни постоянно.

Регистр 0x07 «CHIP_ID» - содержит идентификатор общий для всех модулей серии «Flash»:

Регистр только для чтения.

У всех модулей серии «Flash» в регистре «CHIP_ID» содержится значение 0x3C. Если требуется отличить модули серии «Flash» на шине I2C от сторонних модулей, то достаточно прочитать значение регистров 0x06 «ADDRESS» и 0x07 «CHIP_ID» всех модулей на шине I2C. Если 7 старших битов регистра 0x06 «ADDRESS» хранят адрес совпадающий с адресом модуля, а в регистре 0x07 «CHIP_ID» хранится значение 0x3C, то можно с большой долей вероятности утверждать, что данный модуль является модулем серии «Flash».

Регистры 0x08-0x09 «FREQUENCY» - содержат частоту ШИМ:

Регистр только для записи.

Значение регистра сохраняется после отключения питания.

  • FREQUENCY[15-0] - Частота ШИМ в диапазоне от 1 до 12'000 Гц. Значение по умолчанию 0x05DC = 1500 Гц. Частота записанная в регистры «FREQUENCY[15-8]», «FREQUENCY[7-0]» применяется после записи старшего байта «FREQUENCY[15-8]».
    Если записать значение < 0x0001 то в регистрах появится 0x0001 и частота будет 1 Гц.
    Если записать значение > 0x2EE0 то в регистрах появится 0x2EE0 и частота будет 12 кГц.

Регистр 0x10 «REG_KEY» - содержит флаги состояний и событий кнопки энкодера:

Регистр только для чтения.

  • PUSHED - Флаг нажатия на кнопку. Устанавливается в момент нажатия на кнопку и остаётся установленным пока не будет прочитан. Флаг сбрасывается самостоятельно после чтении данного регистра.
  • RELEASED - Флаг отпускания кнопки. Устанавливается в момент отпускания кнопки и остаётся установленным пока не будет прочитан. Флаг сбрасывается самостоятельно после чтении данного регистра.
  • PRESSED - Флаг состояния кнопки. Установлен пока кнопка нажата и сброшен если она отпущена.
  • TRIGGER - Флаг триггер. Меняет своё состояние с каждым новым нажатием на кнопку (нажали - установился, нажали - сбросился, нажали - установился, ...).
  • HOLD_05 - Флаг удержания кнопки. Устанавливается если кнопка удерживается дольше 0,5 сек. и сбрасывается при отпускании кнопки.
  • HOLD_10 - Флаг удержания кнопки. Устанавливается если кнопка удерживается дольше 1 сек. и сбрасывается при отпускании кнопки.
  • HOLD_20 - Флаг удержания кнопки. Устанавливается если кнопка удерживается дольше 2 сек. и сбрасывается при отпускании кнопки.
  • CHANGED - Флаг смены состояния кнопки. Устанавливается в момент нажатия или отпускания кнопки и остаётся установленным пока не будет прочитан. Флаг сбрасывается самостоятельно после чтении данного регистра. ( CHANGED = PUSHED | RELEASED ).

Регистр 0x11 «KEY_TIME» - содержит время удержания/простоя кнопки:

Регистр только для чтения.

  • KEY_TIME[7-0] - Время удержания или простоя кнопки в десятых долях секунд от 0 (0 сек.) до 255 (25,5 сек.). Если флаг «PRESSED» регистра 0x10 «REG_KEY» установлен, значит значение KEY_TIME[7-0] хранит время удержания, иначе, время простоя. Если кнопка удерживается/простаивает дольше 25,5 секунд, то значение KEY_TIME[7-0] останавливается на 255.

Регистр 0x12 «PIN_SET» - содержит настройки выхода модуля:

Регистр для чтения и записи.

Значение регистра сохраняется после отключения питания.

  • PIN_MAX_TURN[3-0] - Значение от 1 до 15 определяет количество полных оборотов энкодера за которое ШИМ или АЦП, на выходе модуля, изменятся от 0 до 100%.
  • PIN_MODE[3-0] - Режим работы выхода модуля:
    • 0 - Вывод модуля отключён.
    • 1 - Вывод модуля работает как выход кнопки энкодера.
    • 2 - Вывод модуля работает как выход кнопочного переключателя (триггер).
    • 3 - Вывод модуля работает как выход с ШИМ.
    • 4 - Вывод модуля работает как выход с логарифмическим ШИМ (для светодиодов).
    • F - Вывод модуля работает как аналоговый выход (ЦАП).

Регистр 0x13 «RES_SET» - содержит настройки счётчика положения:

Регистр для чтения и записи.

  • Счётчик положения энкодера, это счётчик который приращает или уменьшает своё значение (зависит от направления поворота), на единицу с каждым тактом поворота энкодера. Один полный оборот энкодера состоит из 20 тактов. Значение счётчика положения доступно в регистрах 0x14-0x15 «RES_COUNTER», по его значению можно вычислить на сколько оборотов и градусов повернут энкодер.
  • RES_SIGN_EN - Бит разрешающий отрицательные значения счётчика положения энкодера. Если бит сброшен, то счётчик положения энкодера «RES_COUNTER» считает в пределах от 0 до значения «PIN_MAX_TURN» * 20. Если бит установлен, то счётчик считает в пределах от 0 до ± того же значения (зависит от направления поворота).
  • RES_RESET - Установка данного бита приведёт к сбросу счётчика положения энкодера в 0. Бит «RES_RESET» сбрасывается автоматически после обнуления счётчика положения.
  • RES_MAX_TURN[3-0] - Количество полных оборотов энкодера, которые будет считать счетчик положения. Данное значение определяет максимальное число счётчика положения, равное значению «PIN_MAX_TURN» * 20. Если счётчик досчитает до указанного значения, то счёт прекратится, пока энкодер не начнёт поворачиваться в противоположную сторону, заставив счетчик уменьшать своё значение.

Регистры 0x14-0x15 «RES_COUNTER» - Счетчик положения энкодера:

Регистры только для чтения.

  • RES_COUNTER[14-0] - Счётчик положения энкодера, это счётчик который приращает или уменьшает своё значение (зависит от направления поворота), на единицу с каждым тактом поворота энкодера. Один полный оборот энкодера состоит из 20 тактов. Наличие данного счётчика позволяет работать с модулем как с потенциометром, так как по значению счётчика можно точно вычислить на сколько оборотов и градусов повернут энкодер.
  • RES_SIGN - Флаг отрицательного знака, устанавливается и сбрасывается самостоятельно. Если флаг установлен, значит значение счётчика положения энкодера является отрицательным. Отрицательные значения возможны только если установлен бит «RES_SIGN_EN» регистра 0x13 «RES_SET».

Регистры 0x16-0x17 «ENC_COUNTER_LEFT» и «ENC_COUNTER_RIGHT» - счётчики тактов поворота энкодера влево и вправо:

Регистры только для чтения.

  • ENC_COUNTER_LEFT[7-0] - Содержит количество тактов энкодера совершённое при его повороте влево (против ч.с.) с момента последнего чтения данного регистра. Значение регистра обнуляется сразу после его чтения.
  • ENC_COUNTER_RIGHT[7-0] - Содержит количество тактов энкодера совершённое при его повороте вправо (по ч.с.) с момента последнего чтения данного регистра. Значение регистра обнуляется сразу после его чтения.
  • Один полный оборот энкодера состоит из 20 тактов. Если поворачивать энкодер и не считывать значения счётчиков тактов, то они досчитают до 255 (12 полных оборотов и 270°) и остановят счёт, пока их значение не будет прочитано.

Доступ к данным регистров:

Каждый регистр модуля хранит 1 байт данных. Так как модуль использует интерфейс передачи данных I2C, то и доступ к данным охарактеризован им.

Обмен данными по шине I2C происходит по одному биту за один такт, после каждых переданных 8 бит (1 байта) принимающее устройство отвечает передающему одним битом: «ACK» в случае успешного приёма, или «NACK» в случае ошибки. Пакет приёма/передачи данных начинается сигналом «START» и завершается сигналом «STOP». Первый байт пакета всегда состоит из 7 бит адреса устройства и одного (младшего) бита R/W.

Сигналы интерфейса передачи данных I2C:

    Для удобства восприятия сигналов они выполнены в следующих цветах:
  • Зелёный - сигналы формируемые мастером.
  • Красный - данные отправляемые мастером.
  • Синий - данные отправляемые модулем Metro.
  • Фиолетовый - данные отправляемые мастером или модулем Metro.
  • «START» - отправляется мастером в начале пакета приема/передачи данных. Сигнал представляет переход уровня линии «SDA» из «1» в «0» при наличии «1» на линии «SCL».
  • «STOP» - отправляется мастером в конце пакета приёма/передачи данных. Сигнал представляет переход уровня линии «SDA» из «0» в «1» при наличии «1» на линии «SCL».
  • БИТ - значение бита считывается с линии «SDA» по фронту импульса на линии «SCL».
  • «ACK» - бит равный 0, отправляется после успешного приёма байта данных.
  • «NACK» - бит равный 1, отправляется после байта данных в случае ошибки.
  • ПЕРВЫЙ БАЙТ - отправляется мастером, состоит из 7 бит адреса и бита «RW».
  • «R/W» - младший бит первого байта данных указывает направление передачи данных пакета, 1 - прием (от модуля к мастеру), 0 - передача (от мастера в модуль).
  • «RESTART» - повторный старт, отправляется мастером внутри пакета. Сигнал представляет из себя «START» отправленный не на свободной шине, а внутри пакета.

ВАЖНО: Все изменения на линии «SDA» должны происходить только при наличии «0» на линии «SCL» за исключением сигналов «START», «STOP» и «RESTART».

    Запись данных в регистры:

    • Отправляем сигнал «START».
    • Отправляем первый байт: 7 бит адреса модуля и бит «R/W» равный 0 (запись).
      Получаем ответ от модуля в виде одного бита «ACK».
    • Отправляем второй байт: адрес регистра в который будет произведена запись.
      Получаем ответ от модуля в виде одного бита «ACK».
    • Отправляем третий байт: данные для записи в регистр.
      Получаем ответ от модуля в виде одного бита «ACK».
    • Далее можно отправить четвёртый байт данных для записи в следующий по порядку регистр и т.д.
    • Отправляем сигнал «STOP».

    Пример записи в один регистр:

    Запись значения 0x2A в регистр 0x06 модуля с адресом 0x09:

                                     // Запись в регистр методами библиотеки Wire.h
    Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
    Wire.write(0x06);                // Записываем в буфер байт адреса регистра.
    Wire.write(0x26);                // Записываем в буфер байт который будет записан в регистр.
    Wire.endTransmission();          // Выполняем передачу адреса и байтов из буфера. Функция возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка.
    

    Пример записи в несколько регистров подряд:

    Запись в модуль с адресом 0x09 нескольких значений начиная с регистра 0x12:
    В регистр 0x12 запишется значение 0x0F, в следующий по порядку регистр (0x13) запишется значение 0x30 и в следующий по порядку регистр (0x14) запишется значение 0xB1.

                                     // Запись в регистры методами библиотеки Wire.h
    byte data[3] = {0x0F,0x30,0xB1}; // Определяем массив с данными для передачи.
    Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
    Wire.write(0x12);                // Записываем в буфер байт адреса первого регистра.
    Wire.write(data, 3);             // Записываем в буфер 3 байта из массива data.
    Wire.endTransmission();          // Выполняем передачу адреса и байт из буфера. Функция возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка.

    Чтение данных из регистров:

    • При чтении пакет делится на 2 части: запись № регистра и чтение его данных.
    • Отправляем сигнал «START».
    • Отправляем первый байт: 7 бит адреса модуля и бит «R/W» равный 0 (запись).
      Получаем ответ от модуля в виде одного бита «ACK».
    • Отправляем второй байт: адрес регистра из которого нужно прочитать данные.
      Получаем ответ от модуля в виде одного бита «ACK».
    • Отправляем сигнал «RESTART».
    • Отправляем первый байт после «RESTART»: 7 бит адреса и бит «R/W» равный 1 (чтение).
      Получаем ответ от модуля в виде одного бита «ACK».
    • Получаем байт данных из регистра модуля.
      Отвечаем битом «ACK» если хотим прочитать следующий регистр, иначе отвечаем «NACK».
    • Отправляем сигнал «STOP».

    Пример чтения одного регистра:

    Чтение из модуля с адресом 0x09 байта данных регистра 0x05:
    (в примере модуль вернул значение 0x01).

                                     // Чтение регистра методами библиотеки Wire.h
    byte data;                       // Объявляем переменную для чтения байта данных.
    Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
    Wire.write(0x05);                // Записываем в буфер байт адреса регистра.
    Wire.endTransmission(false);     // Выполняем передачу без установки состояния STOP.
    Wire.requestFrom(0x09, 1);       // Читаем 1 байт из устройства с адресом 0x09. Функция возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART.
    data=wire.read();                // Сохраняем прочитанный байт в переменную data.

    Пример чтения нескольких регистров подряд:

    Чтение из модуля с адресом 0x09 нескольких регистров начиная с регистра 0x05:
    (в примере модуль вернул значения: 0x01 из рег. 0x05, 0x13 из рег. 0x06, 0xC3 из рег. 0x07).

                                     // Чтение регистров методами библиотеки Wire.h
    byte data[3];                    // Объявляем массив для чтения данных.
    Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
    Wire.write(0x05);                // Записываем в буфер байт адреса регистра.
    Wire.endTransmission(false);     // Выполняем передачу без установки состояния STOP.
    Wire.requestFrom(0x09, 3);       // Читаем 3 байта из устройства с адресом 0x09. Функция возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART.
    int i=0;                         // Определяем счётчик номера прочитанного байта.
    while( Wire.available() ){       // Выполняем цикл while пока есть что читать из буфера.
      if(i<3){                       // Лучше делать такую проверку, чтоб не записать данные за пределы массива data!
        data[i] = wire.read(); i++;  // Читаем очередной байт из буфера в массив data.
      }                              //
    }                                //

    Примечание:

    • Если на линии I2C только один мастер, то сигнал «RESTART» можно заменить на сигналы «STOP» и «START».
    • Рекомендуется не выполнять чтение или запись данных чаще 200 раз в секунду.
      Обратите внимание на сигналы «RESTART» и «STOP» в пакетах чтения данных:
    • Между фронтом и спадом сигнала «RESTART» проходит фронт импульса на линии «SCL», что расценивается как передача бита равного 1.
    • Между сигналом «NACK» и сигналом «STOP» проходит фронт импульса на линии «SCL», что расценивается как передача бита равного 0.
    • Эти биты не сохраняются в модулях и не расцениваются как ошибки.

    Модуль не поддерживает горячее подключение: Подключайте модуль только при отсутствии питания и данных на шине I2C. В противном случае потребуется отключить питание при уже подключённом модуле.

    Пример чтения состояния кнопки:

    Следующий скетч демонстрирует пример вывода состояния кнопки (нажата/отпущена) в монитор последовательного порта.

    #include <Wire.h>                                // Подключаем библиотеку Wire для работы с шиной I2C.
    const int ADDRESS     = 0x09;                    // Определяем адрес модуля Metro - кнопка.
    const int REG_DATA    = 0x10;                    // Определяем адрес регистра REG_DATA.
    const int FLG_PRESSED = 5;                       // Определяем номер бита FLG_PRESSED в регистре REG_DATA.
    byte      DATA;                                  // Объявляем переменную для хранения байта данных считанных с регистра.
                                                     //
    void setup(){                                    //
        Serial.begin(9600);                          // Инициируем связь с монитором последовательного порта на скорости 9600 бит/сек.
        while(!Serial){;}                            // Ждём готовность к работе аппаратной шины UART.
        Wire.setClock(100000L);                      // Устанавливаем скорость передачи данных по шине I2C.
        Wire.begin();                                // Инициируем работу c шиной I2C в качестве мастера.
    }                                                //
                                                     //
    void loop(){                                     //
        Wire.beginTransmission(ADDRESS);             // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
        Wire.write(REG_DATA);                        // Функция write() помещает значение своего аргумента в буфер для передачи.
        Wire.endTransmission(false);                 // Выполняем инициированную ранее передачу данных (параметр false указывает что состояние STOP устанавливать не требуется).
        Wire.requestFrom(ADDRESS, 1);                // Читаем из модуля с адресом ADDRESS, 1 байт данных в буфер библиотеки Wire. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART.
        if   ( Wire.available() ){DATA=Wire.read();} // Если в буфере библиотеки Wire есть данные, то читаем 1 байт в переменную DATA.
        while( Wire.available() ){     Wire.read();} // Если в буфере библиотеки Wire есть еще данные, то читаем их в никуда (чистим буфер).
        if   ( DATA & bit(FLG_PRESSED) ){            // Если в полученном байте DATA установлен бит FLG_PRESSED, значит кнопка нажата.
               Serial.println("Кнопка нажата");      //
        }else{ Serial.println("Кнопка отпущена"); }  //
        delay(1000);                                 //
    }                                                //

    Габариты:

    Все модули линейки "Trema" выполнены в одном формате:

    Ссылки:

    Обсуждение