RGB светодиод , i2c (Metro-модуль) - Datasheet

Модуль Metro - RGB светодиод.

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

Ознакомиться с пользовательским описанием модуля и примерами работы с библиотекой iarduino_Metro можно на странице Wiki - RGB Светодиод (Metro-модуль).

Назначение:

Модуль Metro - RGB светодиод - является цветным светодиодом с подключением по шине I2С.

К одной шине I2C можно подключить более 100 модулей.

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

Описание:

Модуль построен на базе микроконтроллера STM32F030F4 и снабжен собственный стабилизатором напряжения. Модуль управляет яркостью каждого канала цвета (красный, зелёный, синий) при помощи сигналов ШИМ. Смешиваясь, указанные цвета могут создать любой цвет и оттенок с заданной яркостью. Яркость цветов задаётся через регистры модуля. Доступ к регистрам модуля осуществляется по шине I2C.

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

  • Изменить адрес данного модуля, обнаружить наличие следующего модуля и изменить адрес следующего модуля.
  • Включить указанный цвет с указанной яркостью и на указанное время.
  • Задать мигание указанным цветом с указанной яркостью, длительностью свечения и паузой между свечениями.
  • Включить функцию автоматического перелива цвета.

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

У модуля имеются две колодки выводов: IN - штыревой разъем (вход модуля) и OUT гнездовой разъем (выход для подключения входа следующего модуля Metro). На каждой колодке имеется по пять выводов:

  • SCL - вход/выход линии тактирования шины I2C.
  • SDA - вход/выход линии данных шины I2C.
  • 5V - вход питания.
  • GND - общий вывод питания.
  • ADR (на колодке IN) - вход установки адреса данного модуля.
  • ADR (на колодке OUT) - вывод (вход/выход) обнаружения следующего модуля и установки его адреса.

Выводы SCL, SDA, 5V и GND внутрисхемно соединены с одноимёнными выводами колодок IN и OUT, и предназначены для передачи данных по шине I2C. Выводы SCL и SDA внутрисхемно НЕ подтянуты в модуле до уровня логической 1.

Вход ADR на колодке IN используется для сброса/записи адреса модуля на шине I2C. Данный вход внутрисхемно прижат к GND через резистор номиналом в 1 кОм. Если на вход ADR подать уровень логической 1, то адрес модуля сбросится в значение по умолчанию 0x09, но этот адрес не сохранится во FLASH памяти модуля, а значит после отключения питания, установится прежний адрес. Если при наличии логической 1 на входе ADR, записать адрес в регистр «ADDRESS» с установленным битом «IF_PIN_ADDRESS» то данный адрес станет новым адресом модуля на шине I2C и сохранится во FLASH памяти модуля, а значит сохранится и после отключения питания.

Вывод ADR на колодке OUT является двунаправленным выводом и используется для обнаружения наличия следующего модуля Metro, а также сброса/записи адреса следующего модуля. Данный вывод внутрисхемно подтянут до уровня 3,3 В через резистор в 100 кОм, что позволяет определить наличие следующего модуля Metro. Если вывод сконфигурирован как вход и на нём уровень логической 1 (3,3 В) - значит следующих модулей нет, а если на нём уровень логического 0 (GND) - значит следующий модуль есть. Если вывод сконфигурирован как выход, то установив на нём уровень логической 1 можно сбросить/записать адрес следующего модуля.

Конфигурация, чтение и установка уровней выводов ADR осуществляется через регистры модуля.

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

  • Напряжение питания: 5 В (постоянного тока)
  • Потребляемый ток: до 20 мА.
  • Угол свечения: 120°.
  • Световой поток: до 7 лм.
  • Длина волны: «R» 625-630 нм, «G» 525-530 нм, «B» 465-470 нм.
  • Разрядность ШИМ: 8 бит (для каждого цвета).
  • Интерфейс: I2C.
  • Скорость шины I2C: 100 кбит/с.
  • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
  • Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
  • Уровень логической 1 на выводах ADR: 3,3 В (толерантны к 5 В).
  • Рабочая температура: от -40 до +65 °C.
  • Габариты: 35,56 х 25,40 мм (1400 x 1000 mil).
  • Вес: 4 г.

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

Сброс адреса (без сохранения):

Если физически подать уровень логической 1 на вход модуля ADR, то адрес модуля сбросится в значение по умолчанию 0x09, но этот адрес не сохранится во FLASH памяти, а значит после отключения питания, установится прежний адрес модуля.

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

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

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

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

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

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

Обнаружение следующего модуля:

Модули Metro подключаются друг к другу (вход к выходу) как вагоны метро.

Вход ADR колодки IN внутрисхемно прижат к GND через резистор 1 кОм, значит если данный вход ни к чему не подключён, то на нем присутствует уровень логического 0.

Вывод ADR колодки OUT внутрисхемно подтянут к 3,3 В через резистор 100 кОм, значит если данный вывод сконфигурирован как вход и ни к чему не подключен, то на нем присутствует уровень логической 1.

Следовательно, если вывод ADR колодки OUT сконфигурирован как вход и на нём присутствует уровень логической 1, значит колодка OUT свободна, а если присутствует уровень логического 0, значит к колодке OUT подключена колодка IN следующего модуля.

За конфигурацию вывода ADR колодки OUT отвечает бит «SET_PIN_OUTPUT» регистра 0x01 «BITS_0», а считать логический уровень с этого входа можно через флаг «GET_PIN_OUTPUT» регистра 0x00 «FLAGS_0».

Значит для обнаружения модуля нужно сбросить бит «SET_PIN_OUTPUT» в регистре 0x01 «BITS_0» и считать бит «GET_PIN_OUTPUT» из регистра 0x00 «FLAGS_0». Если считана 1 значит колодка OUT свободна (следующих модулей нет), а если считан 0, значит к колодке OUT подключен следующий модуль.

Регистры:

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

адрес76 5 4 3 2 10
0x00 FLG_RESET FLG_SELF_TEST - - - - GET_PIN_ADDRES GET_PIN_OUTPUT
0x01 SET_RESET SET_SELF_TEST - - - - SET_PIN_ADDRES SET_PIN_OUTPUT
0x02
0x03
RESERVED
0x04 MODEL[7-0]
0x05 VERSION[7-0]
0x06 ADDRESS[6-0] IF_PIN_ADDRES
0x07 CHIP_ID[7-0]
0x08 FREQUENCY[7-0]
0x09
---
0x0F
RESERVED
0x10 - - - - - - BLINK START
0x11
0x12
0x13
RED[7-0]
GREEN[7-0]
BLUE[7-0]
0x14 TIME_ON[7-0]
0x15 TIME_OFF[7-0]
0x16 START_BLINK_SUM[7-0]
0x17 FUNCTIONS[7-0]

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

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

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

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

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

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

  • SET_RESET - Бит запускает программную перезагрузку модуля. О завершении перезагрузки свидетельствует установка флага «FLG_RESET» регистра 0x00 «FLAGS_0».
  • SET_SELF_TEST - Бит запускает самотестирование модуля. При успешном завершении самотестирования устанавливается флаг «FLG_SELF_TEST » регистра 0x00 «FLAGS_0». Не поддерживается данным модулем.
  • SET_PIN_ADDRES - Бит является альтернативой входа ADR колодки IN. Установка бита в 1 расценивается как наличие логической 1 на входе ADR колодки IN, но не устанавливает этот уровень физически на входе, что позволяет установить и сохранить адрес модуля во FLASH память не используя вход ADR. Бит самостоятельно сбрасывается после сохранения адреса во FLASH память. Установка бита в 1 не сбрасывает адрес модуля в значение по умолчанию (0x09), как это делает физическая «1» на входе ADR колодки IN.
  • SET_PIN_OUTPUT - Бит конфигурации вывода ADR колодки OUT. Установка бита в 1 сконфигурирует вывод ADR колодки OUT модуля в режим выхода и установит на нём уровень логической 1. Сброс бита в 0 сконфигурирует вывод ADR колодки OUT в режим входа, логический уровень которого можно считать через бит «GET_PIN_OUTPUT» регистра 0x00 «FLAGS_0».

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

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

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

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

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

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

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

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

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

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

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

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

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

  • FREQUENCY[7-0] - Частота ШИМ для всех каналов цвета в диапазоне от 10 Гц до 255 Гц. Значение по умолчанию 60 Гц.

Регистр 0x10 «REG_DATA» - содержит флаги включения и мигания светодиода:

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

  • START - Флаг включения света. Установка флага приведёт к началу отсчёта времени «TIME_ON» + «TIME_OFF» по истечении которого флаг сбросится. Принудительный сброс флага приведёт прекращению отсчёта времени «TIME_ON» + «TIME_OFF» и выключению света.
    Примечание: Светодиод светится пока идёт отсчёт времени «TIME_ON» и выключается на время «TIME_OFF».
  • BLINK - Флаг повтора. Если флаг установлен, то по окончании времени «TIME_ON» + «TIME_OFF» флаг «START» не сбросится и комбинация «TIME_ON» + «TIME_OFF» будет повторяться.

Регистр 0x11 «RED» - содержит яркость красного цвета:

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

  • RED[7-0] - Яркость красного цвета. Значение от 0 (0%) до 255 (100%), в соответствии с которым устанавливается коэффициент заполнения ШИМ для канала красного цвета.

Регистр 0x12 «GREEN» - содержит яркость зелёного цвета:

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

  • GREEN[7-0] - Яркость зелёного цвета. Значение от 0 (0%) до 255 (100%), в соответствии с которым устанавливается коэффициент заполнения ШИМ для канала зелёного цвета.

Регистр 0x13 «BLUE» - содержит яркость синего цвета:

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

  • BLUE[7-0] - Яркость синего цвета. Значение от 0 (0%) до 255 (100%), в соответствии с которым устанавливается коэффициент заполнения ШИМ для канала синего цвета.

Регистр 0x14 «TIME_ON» - содержит время свечения светодиода:

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

  • TIME_ON[7-0] - Время свечения светодиода в десятых долях секунд от 0 (0 сек.) до 255 (25,5 сек.).

Регистр 0x15 «TIME_OFF» - содержит время отсутствия свечения:

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

  • TIME_OFF[7-0] - Время отсутствия свечения в десятых долях секунд от 0 (0 сек.) до 255 (25,5 сек.).

    Регистр 0x16 «START_BLINK_SUM» - содержит количество повторов:

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

    • START_BLINK_SUM[7-0] - Количество повторов. Запись ненулевого значения установит флаг «START» и сбросит флаг «BLINK», но модуль будет вести себя так, как будто флаг «BLINK» установлен. Значение регистра будет уменьшаться с каждым циклом «TIME_ON» + «TIME_OFF», пока не достигнет 0, тогда флаг «START» будет сброшен.

    Регистр 0x17 «FUNCTIONS» - содержит номер функции автоперелива цвета:

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

    • FUNCTIONS[7-0] - Запись не нулевого значения запускает функцию автоперелива цвета. Во время выполнения функции флаги регистра 0x10 «REG_DATA» игнорируются. Номера и количество функций автоперелива цвета зависят от версии прошивки модуля.
      Функции автоперелива выполняются до тех пор, пока регистр 0x17 «FUNCTIONS» не будет сброшен в 0. После сброса регистра необходимо выдержать паузу не менее 10 мс.

    Примеры значений регистров:

    • Перед включением светодиода (или во время его свечения) необходимо задать цвет записав яркость красного, зелёного и синего цвета в регистры 0x11 «RED», 0x12 «GREEN» и 0x13 «BLUE».
    • Для включения света на неопределённое время, устанавливаются следующие значения: TIME_ON>0, TIME_OFF=0, START=1, BLINK=1.
      Для выключения света нужно сбросить флаги «START» и «BLINK».
    • Для включения света на указанное время, устанавливаются следующие значения: TIME_ON=время, TIME_OFF=0, START=1, BLINK=0.
      Свет выключится сам по истечении времени указанного в «TIME_ON».
    • Для мигания светодиода в течении неопределённого времени, устанавливаются следующие значения: TIME_ON=время свечения, TIME_OFF=время паузы между свечениями, START=1, BLINK=1.
      Для завершения мигания нужно сбросить флаги «START» и «BLINK».
    • Для мигания светодиодом указанное количество раз, устанавливаются следующие значения: TIME_ON=время свечения, TIME_OFF=пауза между свечениями, START_BLINK_SUM=количество миганий.
      После указанного количества миганий флаг «START» будет сброшен и светодиод перестанет мигать.
    • Для запуска функции автоперелива цвета необходимо записать её номер в регистр «FUNCTIONS».
      Для отключения функции автоперелива цвета необходимо записать 0 в регистр «MELODY» и выдержать паузу не менее 10 мс.

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

    Каждый регистр модуля хранит 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. В противном случае потребуется отключить питание при уже подключённом модуле.

      Пример мигания жёлтым цветом три раза:

      Следующий скетч демонстрирует пример мигания светодиодом. В коде setup устанавливаются: цвет (R=255, G=255, B=0), время свечения (0,1 сек) и пауза между свечениями (0,2 сек). А в коде loop с промежутками в 2 секунды отправляется значение 0x03 в регистр «START_BLINK_SUM», означающее мигнуть 3 раза.

      #include <Wire.h>                                // Подключаем библиотеку Wire для работы с шиной I2C.
      const int ADDRESS     = 0x09;                    // Определяем адрес модуля Metro - датчик температуры и влажности.
      const int REG_RED     = 0x11;                    // Определяем адрес регистра RED.
      const int BLINK_SUM   = 0x16;                    // Определяем адрес регистра START_BLINK_SUM.
      byte      DATA[5]     = {                        // Определяем массив из 5 байт данных для записи в регистры модуля.
                              0xFF,                    // Яркость красного цвета (максимальная).
                              0xFF,                    // Яркость зелёного цвета (максимальная).
                              0x00,                    // Яркость синего   цвета (минимальная ).
                              0x01,                    // Время свечения 100 мс = 0.1 сек = 1 десятая доля секунды = 0x01.
                              0x02,                    // Время паузы    200 мс = 0.2 сек = 2 десятых доли секунды = 0x02.
                              };                       //
      void setup(){                                    //
          Wire.setClock(100000L);                      // Устанавливаем скорость передачи данных по шине I2C.
          Wire.begin();                                // Инициируем работу c шиной I2C в качестве мастера.
          delay(500);                                  //
          Wire.beginTransmission(ADDRESS);             // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
          Wire.write(REG_RED);                         // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра REG_RED.
          Wire.write(DATA, 5 );                        // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это 5 байт массива DATA.
          Wire.endTransmission();                      // Выполняем инициированную ранее передачу данных.
      }                                                //
                                                       //
      void loop(){                                     //
          Wire.beginTransmission(ADDRESS);             // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
          Wire.write(BLINK_SUM);                       // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра START_BLINK_SUM.
          Wire.write(3);                               // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение которое будет записано в регистр.
          Wire.endTransmission();                      // Выполняем инициированную ранее передачу данных.
          delay(2000);                                 //
      }                                                //

      Габариты:

      Ссылки:

      Обсуждение