КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

LED Матрица 8x8, i2c (Metro-модуль) - Datasheet

Модуль Metro - LED матрица 8x8.

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

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

Аналоги: Аналогом модуля Metro LED Матрица 8x8 является Trema модуль LED матрица 8x8 I2C-flash который построен на том же чипе, имеет те же регистры и принцип работы, но выполнен в другом формфакторе, использует только выводы шины I2C и работает с другой библиотекой.

Назначение:

Модуль Metro - LED матрица 8x8 - является цифровой монохромной светодиодной матрицей с подключением по шине I2С.

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

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

Описание:

Модуль построен на базе микроконтроллера STM32F030K6 и снабжен собственным стабилизатором напряжения. Модуль отрисовывает изображение последовательно включая по одному светодиоду матрицы с частотой 100 кадров/сек. При такой частоте глаз не замечает мерцаний светодиодов и видит всё изображение матрицы целиком. Для вывода символов в памяти модуля имеется таблица изображений символов в кодировке CP866 (поддерживает Кириллицу). Изображение любого символа таблицы можно заменить на собственное. Так же модуль имеет буфер в 512 символов для хранения текста бегущей строки. Управление дисплеем и запись данных для вывода осуществляется через регистры модуля. Доступ к регистрам модуля осуществляется по шине I2C.

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

  • Изменить адрес данного модуля, обнаружить наличие следующего модуля и изменить адрес следующего модуля.
  • Изменить частоту отрисовки матрицы от 10 до 255 кадров/сек.
  • Установить яркость матрицы от 0 (0%) до 255 (100%).
  • Установить поворот изображений матрицы на 0°, 90°, 180° и 270°.
  • Записать/прочитать изображение матрицы в виде массива (8 регистров по 8 бит).
  • Залить/стереть изображение матрицы.
  • Вывести символ по его коду в кодировке CP866 (в т.ч. Кириллический).
  • Изменить изображение любого символа в памяти модуля.
  • Стереть/записать текст для бегущей строки (до 512 символов).
  • Запустить автопрокрутку бегущей строки с указанием скорости, режима и направления сдвига.
  • Выполнять одиночные сдвиги бегущей строки на один шаг или на указанную позицию.
  • Включить функцию анимации появления/исчезания изображений матрицы.

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

У модуля имеются две колодки выводов: 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 осуществляется через регистры модуля.

Примечание: У Trema-модуля (аналог Metro), вместо колодок IN и OUT, есть только колодка I2C.

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

  • Напряжение питания: 5 В (постоянного тока)
  • Потребляемый ток: до 35 мА.
  • Тип матрицы: монохромная.
  • Разрешение матрицы: 8x8.
  • Количество светодиодов: 64.
  • Цвет свечения: красный.
  • Развёртка: задаётся от 10 до 255 кадров/сек (по умолчанию 100).
  • Шаг регулировки яркости: 1/255.
  • Буфер для хранения бегущей строки: до 512 символов.
  • Скорость бегущей строки: задаётся от 0,06 до 15 секунд на символ.
  • Таблица символов: CP866 (поддерживает Кириллицу).
  • Интерфейс: 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).
  • Вес: 7 г.

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

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

Если физически подать уровень логической 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, то указанный адрес проигнорируется и у модуля останется прежний адрес.

Установка адреса для Trema-модуля (аналог модуля Metro):

Так как у Trema-модуля нет выводов ADR, то сбросить адрес Trema-модуля нельзя, а установка адреса осуществляется только через регистры модуля.

  • Установка адреса (без сохранения) осуществляется так же как и для модуля Metro.
  • Установка адреса (с сохранением) осуществляется так же, в два действия, как и для модуля Metro, но первое действие осуществляется только установкой бита в регистре «BITS_0» (в отличии от модуля Metro, где первое действие можно осуществить, либо установкой бита, либо подачей уровня логической 1 на вход ADR).

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

Модули 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 - FLG_GET_NAME RAND_ADR FLG_I2C_UP GET_PIN_ADDRES GET_PIN_OUTPUT
0x01 SET_RESET SET_SELF_TEST - SET_GET_NAME RESERVED SET_I2C_UP 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 BRIGHTNESS[7-0]
0x0A
---
0x0F
RESERVED
0x10 TURN[1-0] FILL_SCR CLEAR_SCR CLEAR_STR STEP_MOD STEP_ROUTE ENABLE
0x11
0x12
0x13
0x14
0x15
0x16
0x17
0x18
ROW_1[7-0]
ROW_2[7-0]
ROW_3[7-0]
ROW_4[7-0]
ROW_5[7-0]
ROW_6[7-0]
ROW_7[7-0]
ROW_8[7-0]
0x19 SAVE_AS[7-0]
0x1A SYMBOL_INPUT[7-0]
0x1B TEXT_INPUT[7-0]
0x1C
STEP_LEN[7-0]
0x1D STEP_ONE STEP_LEN[14-8]
0x1E TIME_STEP[7-0]
0x1F TIME_PAUSE[7-0]
0x20 TIME_START[7-0]
0x21 TIME_STOP[7-0]
0x22 FUNCTIONS[7-0]

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

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

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

  • FLG_RESET - Флаг указывает на факт выполнения успешной перезагрузки модуля. Флаг самостоятельно сбрасывается после чтения регистра 0x00 «FLAGS_0».
  • FLG_SELF_TEST - Флаг указывает на результат выполнения самотестирования модуля (0-провал, 1-успех). Не поддерживается данным модулем.
  • FLG_GET_NAME - Если флаг установлен, значит модуль поддерживает вывод своего названия установкой бита «SET_GET_NAME» в регистре 0x01 «BITS_0».
  • RAND_ADR - Если флаг установлен, значит модуль поддерживает генерацию случайного адреса для шины I2C регистрами 0x64 «RANDOM_NUM», «RANDOM_ADR», «BUN_ADR».
  • FLG_I2C_UP - Если флаг установлен, значит модуль позволяет управлять подтяжкой линий шины I2C при помощи бита «SET_I2C_UP» регистра 0x01 «BITS_0».
  • GET_PIN_ADDRES - Бит повторяет логический уровень считанный со входа ADR колодки IN модуля.
  • GET_PIN_OUTPUT - Бит повторяет логический уровень считанный с вывода ADR колодки OUT модуля.
  • Примечание: У Trema-модуля (аналог Metro) отсутствуют флаги «GET_PIN_ADDRES» и «GET_PIN_OUTPUT», так как у этого модуля нет выводов ADR.

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

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

  • SET_RESET - Бит запускает программную перезагрузку модуля. О завершении перезагрузки свидетельствует установка флага «FLG_RESET» регистра 0x00 «FLAGS_0».
  • SET_SELF_TEST - Бит запускает самотестирование модуля. При успешном завершении самотестирования устанавливается флаг «FLG_SELF_TEST » регистра 0x00 «FLAGS_0». Не поддерживается данным модулем.
  • SET_GET_NAME - Бит указывает использовать регистр 0x04 «MODEL» для посимвольного вывода названия модуля. Бит сбрасывается автоматически через 300 мс после его установки. Если флаг «FLG_GET_NAME» регистра 0x00 «FLAGS_0» сброшен, значит модуль не поддерживает посимвольный вывод своего названия.
  • RESERVED - Третий бит регистра «BITS_0» который не используется у модулей Metro, но у Trema-модулей (аналог Metro) этот бит носит название «BLOCK_ADR», он блокирует смену и сохранение адреса для шины I2C. Бит устанавливается автоматически при попытке записи данных в регистры предназначенные только для чтения. Это защищает чип от ненамеренной смены адреса шумами на шине I2C.
  • SET_I2C_UP - Бит управляет внутрисхемной подтяжкой линий шины I2C. Значение бита сохраняется в FLASH память модуля. Установка бита в «1» приведёт к подтяжке линий SDA и SCL до уровня 3,3 В. На линии I2C допускается устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В или 5 В, вне зависимости от состояния текущего бита. Если флаг «FLG_I2C_UP» регистра 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».
  • Примечание: У Trema-модуля (аналог Metro) отсутствует бит «SET_PIN_OUTPUT», так как у этого модуля нет выхода ADR, а бит «SET_PIN_ADDRES» имеет другое название - «SAVE_ADR_EN».

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

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

  • MODEL[7-0] - Для модуля Metro - LED матрица 8x8 - идентификатор равен значению 0x08.
  • Если установлен флаг «FLG_GET_NAME» регистра 0x00 «FLAGS_0» значит модуль поддерживает посимвольный вывод своего названия.
  • Установка бита «SET_GET_NAME» регистра 0x01 «BITS_0» включает режим посимвольного вывода названия модуля. При этом в регистре 0x04 «MODEL» появится первый символ названия модуля. В процессе чтения регистра 0x04 «MODEL» он будет возвращать очередной символ названия, вплоть до символа конца строки имеющего код 0x00. Далее цикл повторится.
  • Сброс бита «SET_GET_NAME» регистра 0x01 «BITS_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] будет установлен временно (до отключения питания, или сброса/записи нового адреса). Если флаг «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] не будет установлен ни временно, ни постоянно.
  • Примечание: У Trema-модуля (аналог Metro) флаг «IF_PIN_ADDRES» имеет другое название - «SAVE_FLASH».

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

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

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

Примечание: У Trema-модуля (аналог Metro), регистр «CHIP_ID» содержит значение 0x3C.

Регистр 0x08 «FREQUENCY» - содержит частоту развертки матрицы:

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

  • FREQUENCY[7-0] - Частота развертки матрицы в диапазоне от 10 до 255 кадров/сек. Значение по умолчанию 100 кадров в секунду.

Регистр 0x09 «BRIGHTNESS» - содержит яркость матрицы:

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

  • BRIGHTNESS[7-0] - Яркость всех светодиодов матрицы в диапазоне от 0 (0%) до 255 (100%). Значение по умолчанию 192 (75%).

Регистр 0x10 «REG_DATA» - содержит флаги управления матрицей и бегущей строкой:

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

  • TURN[1-0] - Биты поворота изображения. Доступные значения от 0 (0b00) до 3 (0b11) поворачивают изображение матрицы по часовой стрелке на TURN[1-0] * 90°.
  • FILL_SCR - Флаг заливки дисплея. Установка флага приведёт к установке всех битов регистров «ROW_1»...«ROW_8» и как следствие включению всех светодиодов матрицы. Флаг сбрасывается самостоятельно после выполнения заливки.
  • CLEAR_SCR - Флаг очистки дисплея. Установка флага приведёт к сбросу всех битов регистров «ROW_1»...«ROW_8» и как следствие выключению всех светодиодов матрицы. Флаг сбрасывается самостоятельно после выполнения очистки.
  • CLEAR_STR - Флаг очистки бегущей строки. Установка флага приведёт к очистке буфера хранения текста бегущей строки. Флаг сбрасывается самостоятельно после выполнения очистки.
  • STEP_MOD - Флаг режима посимвольного сдвига бегущей строки. Установка флага приведёт к тому, что текст бегущей строки будет сдвигаться не попиксельно (влево или вправо), а отображаться посимвольно (буква за буквой). Сброс флага установит нормальный (попиксельный) режим сдвига бегущей строки.
  • STEP_ROUTE - Флаг обратного направления сдвига бегущей строки. Установка флага приведёт к тому, что бегущая строка будет сдвигаться слева на право (обратно чтению). Сброс флага установит нормальное направление сдвига бегущей строки (справа на лево).
  • ENABLE - Флаг разрешения работы светодиодов. Сброс флага выключает все светодиоды, но не очищает регистры «ROW_1»...«ROW_8», не останавливает выполнение функций и не останавливает бегущую строку.

Регистры 0x11-0x18 «ROW_1»-«ROW_8» - содержат изображение матрицы:

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

  • ROW_1[7-0] - Состояние пикселей первой строки матрицы (верхней). Каждый бит регистра соответствует состоянию светодиода матрицы (старший слева, младший справа).
  • ROW_2[7-0] ... ROW_7[7-0] - Состояние пикселей 2...7 строк матрицы. Каждый бит регистра соответствует состоянию светодиода матрицы (старший слева, младший справа).
  • ROW_8[7-0] - Состояние пикселей восьмой строки матрицы (нижней). Каждый бит регистра соответствует состоянию светодиода матрицы (старший слева, младший справа).
  • Изображение матрицы можно как записывать, так и читать.

Регистр 0x19 «SAVE_AS» - позволяет заменить изображение символа в таблице символов:

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

  • SAVE_AS[7-0] - Запись в регистр любого значения (кода символа от 1 до 255) приведёт к перезаписи изображения данного символа на текущее изображение с матрицы. Регистр самостоятельно сбрасывается в 0 по окончании сохранения данных матрицы в таблицу изображений символов. Внесённые изменения хранятся до отключения питания.
    Например, если вывести в матрицу любое изображение через регистры 0x11-0x18 «ROW_1»-«ROW_8», а потом записать число 74 (код символа «J») в регистр 0x19 «SAVE_AS», то в дальнейшем символ «J» (при выводе бегущей строки, или символа) будет выглядеть как изображение которое было выведено в матрицу.
    Если вместо кода символа в регистр 0x19 «SAVE_AS» записать 0, то значения регистров «ROW_1», «ROW_2» и «ROW_3» (три верхние строки изображения) будут расценены как ширина символов («ROW_1»), межсимвольный интервал («ROW_2») и отступ символа от левого края дисплея («ROW_3»).

Регистр 0x1A «SYMBOL_INPUT» - позволяет вывести символ в матрицу по его коду:

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

  • SYMBOL_INPUT[7-0] - Запись в регистр любого значения (кода символа от 1 до 255) приведёт к выводу изображения этого символа (из таблицы изображений символов) в матрицу. Регистр самостоятельно сбрасывается в 0 по окончании вывода символа.
    Если вместо кода символа в регистр 0x1A «SYMBOL_INPUT» записать 0, то изменятся только три верхние строки экрана в которых побитово отразятся числа: в первой строке - ширина символов, во второй строке - межсимвольный интервал и в третьей - отступ символа от левого края дисплея. Те же числа будут доступны в регистрах «ROW_1», «ROW_2» и «ROW_3».

Регистр 0x1B «TEXT_INPUT» - позволяет дописать текст бегущей строки:

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

  • TEXT_INPUT[7-0] - Текст бегущей строки формируется посимвольно, путём последовательного ввода кодов символов в данный регистр. Регистр самостоятельно сбрасывается в 0 по окончании добавления символа к тексту бегущей строки. Если требуется создать новую строку, а не дополнить имеющуюся, то перед вводом символов необходимо очистить буфер хранения текста бегущей строки путём установки флага «CLEAR_STR» регистра 0x10 «REG_DATA».

Регистры 0x1C-0x1D «STEP_LEN» - устанавливают бегущую строку в указанную позицию:

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

  • STEP_LEN[7-0] - Младший байт позиции строки (доступен в регистре 0x1C).
  • STEP_LEN[14-8] - Старший байт позиции строки (доступен в регистре 0x1D).
    Запись любого значения приводит к установке бегущей строки в указанную позицию. Регистры самостоятельно сбрасываются в 0 по окончании установки. Строка устанавливается в указанную позицию от левого или правого края текста (зависит от флага «STEP_ROUTE» в регистре 0x10 «REG_DATA») позиция указывается в пикселях или символах (зависит от флага «STEP_MOD» в регистре 0x10 «REG_DATA»).
  • STEP_ONE - Флаг сдвига бегущей строки на один шаг (доступен в регистре 0x1D). Установка флага приводит к сдвигу бегущей строки на один шаг (как STEP_LEN[14-0]++). Если флаг установлен, то значение «STEP_LEN» игнорируется. Флаг самостоятельно сбрасывается вместе с регистром «STEP_LEN» после сдвига строки.

    Регистр 0x1E «TIME_STEP» - устанавливает автопрокрутку бегущей строки:

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

    • TIME_STEP[7-0] - Время затрачиваемое на один шаг автопрокрутки бегущей строки в сотых долях секунд от 0 (0,00 сек) до 255 (2,55 сек). Запись не нулевого значения включает автопрокрутку, которая работает как STEP_LEN[14-0]++ каждые TIME_STEP[7-0] сотых долей секунд. Запись 0 - отключает автопрокрутку. Если регистр «TIME_PAUSE» сброшен, то значение регистра «TIME_STEP» самостоятельно сбрасывается после завершения прокрутки всей строки.
      Примечание: при автопрокрутке, к шагу нулевой позиции и шагу последней позиции бегущей строки добавляется время простоя из регистров 0x20 «TIME_START» и 0x21 «TIME_STOP».

    Регистр 0x1F «TIME_PAUSE» - содержит время паузы до повторной автопрокрутки всей строки:

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

    • TIME_PAUSE[7-0] - Время паузы до повторной автопрокрутки всей бегущей строки в десятых долях секунд от 0 (0,0 сек) до 255 (25.5 сек). Если в регистре записано не нулевое значение, то по окончании автопрокрутки регистр «TIME_STEP» не сбрасывается, а выжидается указанная пауза и автопрокрутка возобновляется с 0 позиции. Запись 0 приводит к тому, что по окончании автопрокрутки всей бегущей строки регистр «TIME_STEP» сбрасывается, пауза не выжидается и повторная автопрокрутка не производится.

    Регистр 0x20 «TIME_START» - содержит время простоя автопрокрутки на первом символе текста:

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

    • TIME_START[7-0] - Время простоя автопрокрутки на первом символе текста в сотых долях секунд от 0 (0,00 сек) до 255 (2,55 сек). По умолчанию 100 (1,00 сек).

    Регистр 0x21 «TIME_STOP» - содержит время простоя автопрокрутки на последнем символе:

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

    • TIME_STOP[7-0] - Время простоя автопрокрутки на последнем символе текста в сотых долях секунд от 0 (0,00 сек) до 255 (2,55 сек). По умолчанию 100 (1,00 сек).

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

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

    • FUNCTIONS[7-0] - Появление и исчезание изображений, символов и бегущей строки можно анимировать записав в данный регистр номер функции анимации. Запись 0 приводит к завершению выполнения любой функции анимации. Все функции (кроме 0x01 и 0x02) самостоятельно сбрасывают регистр «FUNCTIONS» в 0 после завершения своей анимации.
      • 0x01 - Предварительная очистка дисплея. Данные находящиеся в регистрах 0x11-0x18 «ROW_1»-«ROW_8» не будут отображаться в матрице пока действует эта функция. В данном режиме можно загружать новые изображения, менять запускать и останавливать строку прокрутки, всё это будет работать, но дисплей будет чист. Функция действует бессрочно, пока в регистр «FUNCTIONS» не будет записано другое значение.
        Примечание: данную функцию удобно использовать перед функциями появления изображений из пустого фона.
      • 0x02 - Предварительная закраска дисплея. Данные находящиеся в регистрах 0x11-0x18 «ROW_1»-«ROW_8» не будут отображаться в матрице пока действует эта функция. В данном режиме можно загружать новые изображения, менять запускать и останавливать строку прокрутки, всё это будет работать, но дисплей будет полностью закрашен. Функция действует бессрочно, пока в регистр «FUNCTIONS» не будет записано другое значение.
        Примечание: данную функцию удобно использовать перед функциями появления изображений из закрашенного фона.
      • 0x03 - Появление изображения рябью из пустого фона. Все светодиоды потухают, после чего на дисплее попиксельно (хаотично) проявляется изображение (или бегущая строка) которые были установлены до выполнения этой функции.
      • 0x04 - Исчезновение изображения рябью в пустой фон. Изображение дисплея (или бегущая строка) попиксельно (хаотично) исчезает пока не останется пустой фон.
        Примечание: после выполнения данной функции все биты регистров 0x11-0x18 «ROW_1»-«ROW_8» будут сброшены (выключены все светодиоды), а в регистр 0x1E «TIME_STEP» будет записан 0 (если была включена автопрокрутка, то она будет остановлена).
      • 0x05 - Появление изображения рябью из закрашенного фона. Все светодиоды включаются, после чего на дисплее попиксельно (хаотично) проявляется изображение (или бегущая строка) которые были установлены до выполнения этой функции.
      • 0x06 - Исчезновение изображения рябью в закрашенный фон. Изображение дисплея (или бегущая строка) попиксельно (хаотично) закрашивается пока не закрасится весь дисплей.
        Примечание: после выполнения данной функции все биты регистров 0x11-0x18 «ROW_1»-«ROW_8» будут установлены (включены все светодиоды), а в регистр 0x1E «TIME_STEP» будет записан 0 (если была включена автопрокрутка, то она будет остановлена).
      • 0x07-0x0A - Появление/Исчезновение сверху-вниз:
        Действия данных функций аналогичны функциям 0x03-0x06, но исчезновение/появление изображения (или бегущей строки) происходит не рябью, а сверху-вниз.
        • 0x07 - Появление изображения сверху-вниз из пустого фона.
        • 0x08 - Исчезновение изображения сверху-вниз в пустой фон.
        • 0x09 - Появление изображения сверху-вниз из закрашенного фона.
        • 0x0A - Исчезновение изображения сверху-вниз в закрашенный фон.
      • 0x0B-0x0E - Появление/Исчезновение снизу-вверх:
        Действия данных функций аналогичны функциям 0x03-0x06, но исчезновение/появление изображения (или бегущей строки) происходит не рябью, а снизу-вверх.
        • 0x0B - Появление изображения снизу-вверх из пустого фона.
        • 0x0C - Исчезновение изображения снизу-вверх в пустой фон.
        • 0x0D - Появление изображения снизу-вверх из закрашенного фона.
        • 0x0E - Исчезновение изображения снизу-вверх в закрашенный фон

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

    • Для работы светодиодов матрицы, флаг «ENABLE» регистра 0x10 «REG_DATA» должен быть установлен в 1.
    • Изображение матрицы повторяет значения битов в регистрах 0x11-0x18 «ROW_1»-«ROW_8», где каждый бит каждого регистра отвечает за включение одного из светодиодов матрицы.
    • Можно установить или сбросить сразу все биты регистров 0x11-0x18 «ROW_1»-«ROW_8» установкой флагов «FILL_SCR» или «CLEAR_SCR» в регистре 0x10 «REG_DATA», тем самым залить или очистить всю матрицу.
    • Изображение можно повернуть на 0°, 90°, 180° или 270° записав соответствующее значение в биты «TURN[1-0]» регистра 0x10 «REG_DATA».
    • Яркость свечения всех светодиодов зависит от значения в регистре 0x09 «BRIGHTNESS».
    • В матрицу можно вывести изображение любого символа введя его код в регистр 0x1A «SYMBOL_INPUT». Изображение символов хранится в таблице изображений символов.
    • Таблицу изображений символов можно редактировать. Для этого нужно ввести изображение в регистры 0x11-0x18 «ROW_1»-«ROW_8» и записать в регистр 0x19 «SAVE_AS» код символа изображение которого требуется заменить на хранящееся в регистрах 0x11-0x18 «ROW_1»-«ROW_8».
    • Матрица может отображать бегущую строку, текст которой записывается посимвольно через регистр 0x1B «TEXT_INPUT». Если требуется записать новый текст, а не дописать имеющийся, то перед вводом кодов символов в регистр 0x1B «TEXT_INPUT» необходимо очистить текст бегущей строки установив флаг «CLEAR_STR» в регистре 0x10 «REG_DATA» и дождаться его самостоятельного сброса.
    • Режим и направление сдвига бегущей строки устанавливается битами «STEP_MOD» и «STEP_ROUTE» регистра 0x10 «REG_DATA».
    • Бегущую строку можно установить в указанную позицию, задав её значение в регистрах 0x1C-0x1D «STEP_LEN», или сдвинуть на один шаг установив бит «STEP_ONE» в регистре 0x1D «STEP_LEN».
    • Для бегущей строки можно включить режим автопрокрутки задав время регистров 0x1E - 0x21 («TIME_STEP», «TIME_PAUSE», «TIME_START» и «TIME_STOP»).
    • Бегущую строку можно вывести на нескольких дисплеях. Для этого в каждый дисплей нужно ввести один и тот же текст бегущей строки. Текст должен начинаться с нескольких символов пробелов. Далее установить позицию строки для каждого дисплея с разницей в 8 пикселей: для крайнего левого дисплея в 0, следующего в 8, следующего в 16, следующего в 24 и т.д. После чего выполнять управляемую прокрутку строки. Для этого нужно сдвинуть строку всех дисплеев на один шаг (установив бит «STEP_ONE» у всех дисплеев), выждать некоторое время и повторить сдвиг строки на всех дисплеях, и т.д. пока вся строка не пройдёт по всем дисплеям. После чего повторить весь процесс с задания изначальной позиции.
    • Появление и исчезновение изображений символов или бегущей строки можно анимировать указав номер функции анимации в регистре 0x22 «FUNCTIONS». Обратите внимание на то, что функции анимации исчезновения изображений меняют значение регистров 0x11-0x18 «ROW_1»-«ROW_8» и останавливают автопрокрутку бегущей строки.

    Регистры 100+:

    У младших версий модулей линейки «FLASH-I2C» нет блока регистров «100+», так же этого блока нет у модулей линейки «Metro», о его наличии свидетельствует установленный флаг «RAND_ADR» в регистре 0x00 «FLAGS_0».

    Блок регистров «100+» с адресами от 0x64 (100)10 до 0x75 (117)10 не участвует в работе модуля, он предназначен только для обнаружения модулей с одинаковыми адресами и назначения этим модулям разных адресов, не отключая их от шины I2C.

    Карта регистров 100+:

    адрес76543210
    0x64
    0x66
    RANDOM_NUM[7-0]
    RANDOM_NUM[15-8]
    0x66 RANDOM_ADR[7-0]
    0x67 BUN_ADR_0F BUN_ADR_0E BUN_ADR_0D BUN_ADR_0C BUN_ADR_0B BUN_ADR_0A BUN_ADR_09 BUN_ADR_08
    0x68 BUN_ADR_17 BUN_ADR_16 BUN_ADR_15 BUN_ADR_14 BUN_ADR_13 BUN_ADR_12 BUN_ADR_11 BUN_ADR_10
    0x69 BUN_ADR_1F BUN_ADR_1E BUN_ADR_1D BUN_ADR_1C BUN_ADR_1B BUN_ADR_1A BUN_ADR_19 BUN_ADR_18
    0x6A BUN_ADR_27 BUN_ADR_26 BUN_ADR_25 BUN_ADR_24 BUN_ADR_23 BUN_ADR_22 BUN_ADR_21 BUN_ADR_20
    0x6B BUN_ADR_2F BUN_ADR_2E BUN_ADR_2D BUN_ADR_2C BUN_ADR_2B BUN_ADR_2A BUN_ADR_29 BUN_ADR_28
    0x6C BUN_ADR_37 BUN_ADR_36 BUN_ADR_35 BUN_ADR_34 BUN_ADR_33 BUN_ADR_32 BUN_ADR_31 BUN_ADR_30
    0x6D BUN_ADR_3F BUN_ADR_3E BUN_ADR_3D BUN_ADR_3C BUN_ADR_3B BUN_ADR_3A BUN_ADR_39 BUN_ADR_38
    0x6E BUN_ADR_47 BUN_ADR_46 BUN_ADR_45 BUN_ADR_44 BUN_ADR_43 BUN_ADR_42 BUN_ADR_41 BUN_ADR_40
    0x6F BUN_ADR_4F BUN_ADR_4E BUN_ADR_4D BUN_ADR_4C BUN_ADR_4B BUN_ADR_4A BUN_ADR_49 BUN_ADR_48
    0x70 BUN_ADR_57 BUN_ADR_56 BUN_ADR_55 BUN_ADR_54 BUN_ADR_53 BUN_ADR_52 BUN_ADR_51 BUN_ADR_50
    0x71 BUN_ADR_5F BUN_ADR_5E BUN_ADR_5D BUN_ADR_5C BUN_ADR_5B BUN_ADR_5A BUN_ADR_59 BUN_ADR_58
    0x72 BUN_ADR_67 BUN_ADR_66 BUN_ADR_65 BUN_ADR_64 BUN_ADR_63 BUN_ADR_62 BUN_ADR_61 BUN_ADR_60
    0x73 BUN_ADR_6F BUN_ADR_6E BUN_ADR_6D BUN_ADR_6C BUN_ADR_6B BUN_ADR_6A BUN_ADR_69 BUN_ADR_68
    0x74 BUN_ADR_77 BUN_ADR_76 BUN_ADR_75 BUN_ADR_74 BUN_ADR_73 BUN_ADR_72 BUN_ADR_71 BUN_ADR_70
    0x75 BUN_ADR_7F BUN_ADR_7E BUN_ADR_7D BUN_ADR_7C BUN_ADR_7B BUN_ADR_7A BUN_ADR_79 BUN_ADR_78

    Регистры 0x64-0x65 «RANDOM_NUM» - содержат случайное число:

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

    • RANDOM_NUM[15-0] - Содержит двухбайтное случайное число позволяющее определить наличие нескольких устройств с одинаковым адресом.
    • Значение из регистров читается одним пакетом (младший и старший байт). После чтения старшего байта, модуль на 5мс перейдёт в режим «молчания». В этом режиме модуль будет отправлять NACK мастеру после получения номера регистра в любых запросах.
    • Если прочитать регистры 0x64-0x65 «RANDOM_NUM» дважды, с промежутком между чтениями менее 5мс, то первый раз мы получим два байта случайного числа, а второй раз модуль откажет в чтении, так как отправит NACK. Но это только в том случае, если адрес модуля уникален.
    • Если адрес принадлежит нескольким устройствам, то и отвечать на запрос чтения будут несколько устройств. При первом чтении регистров 0x64-0x65 «RANDOM_NUM», биты случайного числа у разных модулей не совпадут, в результате чего один модуль передаст оба байта случайного числа и перейдёт в режим «молчания», а другой модуль (или модули) зафиксирует потерю арбитража и не передаст старший байт, следовательно, и не перейдёт в режим «молчания». Значит при повторном чтении регистров, мы опять получим два байта случайного числа от того модуля который не перешёл в режим «молчания», что будет свидетельствовать о наличии нескольких устройств на одном адресе.

    Регистр 0x66 «RANDOM_ADR» - случайный адрес:

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

    • RANDOM_ADR[7-0] - Позволяет задавать модулю случайный временный адрес, подтверждать временный адрес и получать информацию о состоянии временного адреса.
    • Запись 0x0F - Назначить модулю случайный временный адрес на 50 мс.
      В регистре 0x06 «ADDRESS» останется значение постоянного адреса.
    • Запись 0xF0 - Подтвердить назначенный временный адрес до отключения питания.
      В регистре 0x06 «ADDRESS» появится назначенный временный адрес.
    • Чтение 0x55 - Назначен временный случайный адрес на 50 мс.
    • Чтение 0xFF - Назначенный временный адрес подтверждён до отключения питания.
    • Чтение 0x00 - Временный адрес не назначался или отменён по истечении 50 мс.
    • Если на шине несколько устройств имеют одинаковый адрес, то запись значения 0x0F в регистр 0x66 «RANDOM_ADR» этих устройств, приведёт к тому, что каждый модуль сам себе назначит временный случайный адрес на 50 мс. За указанное время следует найти все новые временные адреса устройств и подтвердить их отправив в регистр 0x66 «RANDOM_ADR» значение 0xF0.
    • Примечание: Случайный адрес модуль выбирает сам из диапазона от 0x08 до 0x7E включительно, кроме адресов запрещённых регистрами 0x67-0x75 «BUN_ADR».

    Регистры 0x67-0x75 «BUN_ADR» - запрещают назначать адреса:

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

    • BUN_ADR_08 - Бит запрещает назначать адрес 0x08 регистром 0x66 «RANDOM_ADR».
    • BUN_ADR_09 - Бит запрещает назначать адрес 0x09 регистром 0x66 «RANDOM_ADR».
    • ...
    • BUN_ADR_7D - Бит запрещает назначать адрес 0x7D регистром 0x66 «RANDOM_ADR».
    • BUN_ADR_7E - Бит запрещает назначать адрес 0x7E регистром 0x66 «RANDOM_ADR».
    • Если бит регистров 0x67-0x75 «BUN_ADR» установлен, то модуль не назначит себе случайный временный адрес соответствующий установленному биту.
    • Если на шине есть несколько устройств с одинаковым адресом, то отправка команды 0x0F в регистр 0x66 «RANDOM_ADR» этих устройств, приведёт к тому, что каждый модуль сам себе назначит временный случайный адрес на 50 мс. Но вновь назначенный адрес может совпасть с адресом другого модуля на шине I2C, особенно если их много. По этому перед назначением случайного временного адреса рекомендуется записать в регистры 0x67-0x75 «BUN_ADR» все найденные на шине I2C уникальные адреса.

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

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

      Пример вывода изображения на дисплей:

      Следующий скетч демонстрирует пример вывода изображения стрелки и её вращения. В начале скетча был определён массив IMAGE с изображением стрелки направленной вверх. В коде setup данный массив был записан в регистры «REG_ROW_1» - «REG_ROW_8». А в коде loop с промежутками в 200 миллисекунд отправляется байт данных в регистр «REG_DATA» у которого постоянно увеличивается значение битов «TURN» отвечающих за поворот изображения.

      #include <Wire.h>                                // Подключаем библиотеку Wire для работы с шиной I2C.
      const int ADDRESS    =  0x09;                    // Определяем адрес модуля Metro - датчик температуры и влажности.
      const int REG_DATA   =  0x10;                    // Определяем адрес регистра REG_DATA.
      const int REG_ROW_1  =  0x11;                    // Определяем адрес регистра ROW_1.
      byte      IMAGE[8]   = {0b00000000,              // Определяем массив из 8 байт.
                              0b00011000,              // где каждый байт массива это строка изображения,
                              0b00111100,              // а каждый бит байта управляет одним светодиодом.
                              0b01111110,              // 
                              0b00011000,              // Если бит установлен то светодиод включён.
                              0b00011000,              // 
                              0b00011000,              // В данном примере массив содержит изображение стрелки направленной вверх.
                              0b00000000};             //
      void setup(){                                    //
          Wire.setClock(100000L);                      // Устанавливаем скорость передачи данных по шине I2C.
          Wire.begin();                                // Инициируем работу c шиной I2C в качестве мастера.
          delay(500);                                  //
          Wire.beginTransmission(ADDRESS);             // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
          Wire.write(REG_ROW_1);                       // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра ROW_1.
          Wire.write(IMAGE, 8 );                       // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это 8 байт массива IMAGE.
          Wire.endTransmission();                      // Выполняем инициированную ранее передачу данных.
      }                                                //
                                                       //
      void loop(){                                     // В коде loop выполняем поворот изображения меняя значения битов TURN регистра REG_DATA.
          Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b00000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b00000001. TURN=0, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1.
          Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b01000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b01000001. TURN=1, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1.
          Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b10000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b10000001. TURN=2, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1.
          Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b11000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b11000001. TURN=3, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1.
      }

      Габариты:

      Ссылки:




      Обсуждение

      Гарантии и возврат Используя сайт Вы соглашаетесь с условями