Общие сведения:
I2C-flash адаптер для LCD дисплеев 1601/1602/2004 - является преобразователем интерфейсов который обеспечивает обмен данными между двумя шинами: параллельной шиной LCD и шиной I2C. Наличие связи между этими шинами позволяет работать с LCD дисплеем по шине I2C.
- К одной шине LCD можно подключить один LCD дисплей 1601, 1602 или 2004.
- К одной шине I2C можно подключить более 100 адаптеров. Адрес адаптера на шине I2C (по умолчанию 0x27) назначается программно и хранится в его энергонезависимой памяти.
Адаптер применяется для управления LCD дисплеями 1601, 1602 или 2004 по шине I2C, что экономит количество выводов используемых для подключения дисплея. Вместо 8 выводов к которым можно подключить всего 1 дисплей, используется 2 вывода к которым можно подключить более 100 дисплеев.
Видео:
Спецификация:
- Напряжение питания: 3,3 В или 5 В (постоянного тока).
- Потребляемый ток: до 6 мА.
- Интерфейс: I2C.
- Скорость шины I2C: 100 кбит/с.
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x27).
- Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
- Рабочая температура: от -20 до +70 °С.
- Габариты: 41,91 х 17,15 мм (1650 x 675 mil).
- Вес: 6 г.
Подключение:
По умолчанию все модули FLASH-I2C имеют установленный адрес 0х09.
Но данный модуль имеет предустановленный адрес 0x27.
— При подключении 2 и более FLASH-I2C модулей к шине необходимо в обязательном порядке предварительно изменить адрес каждого модуля, после чего уже подключать их к шине.
Более подробно о том, как это сделать, а так же о многом другом, что касается работы FLASH-I2C модулей, вы можете прочесть в этой статье.
В верхней части платы расположена колодка шины LCD для подключения дисплея.
- GND - общий вывод питания.
- Vcc - вывод питания LCD дисплея 3,3 или 5 В (выбирается перемычками на плате).
- VO - (Voltage cOntrast) контрастность экрана.
- RS - (Register Select) линия выбора регистра команд / данных.
- RW - (Read/Write) линия выбора направления передачи.
- E - (Enable) линия тактирования по спаду.
- D0-D7 - (Data) линии данных (адаптер использует только D4-D7).
- A - (Anode) положительный вывод питания подсветки LCD дисплея.
- K - (Cathode) отрицательный вывод питания подсветки LCD дисплея.
По бокам платы расположены разъемы для подключения адаптера к шине I2C. Шина подключается к любому разъему I2C, а второй разъем можно использовать для подключения следующего адаптера, или других устройств.
- SCL - вход/выход линии тактирования шины I2C.
- SDA - вход/выход линии данных шины I2C.
- Vcc - вход питания 3,3 или 5 В.
- GND - общий вывод питания.
По центру платы расположены две перемычки выбора питания LCD дисплея.
- 5V - установка данной перемычки соединит вывод Vcc шины LCD с выводом Vcc шины I2C.
- 3V3 - установка данной перемычки подключит вывод Vcc шины LCD к стабилизатору +3,3 В.
- Не устанавливайте обе перемычки одновременно, это может повредить адаптер и дисплей.
Подключение дисплея к адаптеру:
LCD Дисплей 1601, 1602 или 2004 подключается к колодке LCD адаптера. Распиновка колодки адаптера совпадает с распиновкой колодки дисплея. После подключения дисплея к адаптеру нужно настроить контрастность экрана.
Для настройки контрастности экрана установите переключатель режима работы адаптера в положение «ADR» и подайте питание на шину I2C. Плавно поворачивайте отвёрткой крестовину подстроечного резистора (рядом с которым присутствует надпись «КОНТРАСТ») до появления на экране текста с указанием адреса и яркости. После настройки контрастности экрана установите переключатель режима работы адаптера в положение «ON».
Питание:
Входное напряжение питания адаптера зависит от напряжения питания LCD дисплея.
- Если к адаптеру подключён дисплей требующий питания 5В, то на выводы Vcc и GND колодки I2C подается напряжение 5В постоянного тока, а на плате адаптера замыкается перемычка «5V».
- Если к адаптеру подключён дисплей требующий питания 3,3В, то на выводы Vcc и GND колодки I2C подается напряжение 3,3В или 5В постоянного тока (поддерживаются оба напряжения), а на плате адаптера замыкается перемычка «3V3».
Подробнее о модуле:
Адаптер построен на базе микроконтроллера STM32F030F4, снабжен собственным стабилизатором напряжения, резистором настройки контрастности дисплея и переключателем режима работы: «ON» и «ADR».
- Если переключатель установлен в положение «ON», то адаптер находится в основном режиме работы, при котором осуществляется обмен данными между шинами LCD и I2C, что позволяет работать с LCD дисплеем по шине I2C. Работа с LCD дисплеем выполняется так же, как и при использовании конвертера на базе чипа PCF8574, что делает адаптер полностью совместимым с библиотеками разработанными для I2C LCD дисплеев 1601, 1602 и 2004.
- Если переключатель установлен в положение «ADR», то адаптер работает в режиме адресного доступа к своим регистрам, что позволяет управлять настройками адаптера. В этом режиме нельзя работать с LCD дисплеем, на его экране будет отображаться информация о текущем адресе адаптера на шине I2C и о установленной яркости подсветки дисплея в %. Доступ к регистрам адаптера осуществляется по шине I2C.
Адаптер позволяет настроить такие параметры как:
- Адрес адаптера на шине I2C. При изменении адреса, можно указать, что новый адрес должен сохраниться в flash память модуля, а значит адрес сохранится и после отключения питания.
- Яркость свечения подсветки дисплея. Значение яркости от 0 до 100% автоматически сохраняется в flash память модуля (сохранится после отключения и включения питания).
- Подтяжка линий шины I2C (по умолчанию включена). В случае наличия на шине I2C большого количества модулей с подтяжкой линий SDA и SCL, отключение подтяжки некоторых модулей может существенно улучшить связь с микроконтроллером.
Для настройки параметров адаптера не требуются библиотеки.
Для работы с LCD дисплеями 1601, 1602 и 2004 по шине I2C предлагаем воспользоваться библиотекой LiquidCrystal_I2C_V112.
Подробнее про установку библиотеки читайте в нашей инструкции.
Примеры:
Вывод данных на LCD дисплей:
Для работы с LCD дисплеем нужно установить переключатель работы адаптера в положение «ON» (режим работы с дисплеем). Работа с дисплеем осуществляется так же как и при использовании конвертера на базе чипа PCF8574.
Вывод текста на дисплей:
#include <Wire.h> // Подключаем библиотеку для работы с шиной I2C #include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print("LCD"); // Выводим текст "LCD", начиная с установленной позиции курсора lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print("www.iarduino.ru"); // Выводим текст "www.iarduino.ru", начиная с установленной позиции курсора } // // void loop(){} //
Данный пример выводит на дисплей текст «LCD» и «www.iarduino.ru».
Обратите внимание на параметры указанные при объявлении объекта lcd(0x27,16,2);
в 3 строке скетча.
- Первый параметр
0x27
указывает адрес дисплея на шине I2C. Это значение можно увидеть установив переключатель режима работы адаптера в положение «ADR» (не забудьте вернуть переключатель в положение «ON» для работы с дисплеем). - Второй параметр
16
указывает количество столбцов на экране дисплея (значение 16 для 1602 и 1601, а значение 20 для 2004). - Третий параметр
2
указывает количество строк на экране дисплея (значение 1 для 1601, 2 для 1602 и 4 для 2004).
Другие примеры вывода данных на LCD дисплей:
Для работы с LCD дисплеем нужно установить переключатель работы адаптера в положение «ON» (режим работы с дисплеем). Так как работа с дисплеем осуществляется так же как и при использовании конвертера на базе чипа PCF8574, то все примеры приведённые на странице Wiki - Работа с символьными ЖК дисплеями 1602,2004 I2C, можно использовать без изменений скетча, нужно только изменить адрес 0x27 на адрес Вашего дисплея, если вы меняли его адрес.
Изменение яркости подсветки экрана:
Яркость подсветки является настройкой адаптера, а значит для её установки необходимо установить переключатель режима работы адаптера в положение «ARD», при этом на экране появится текст информирующий о текущем адресе на шине I2C и яркости подсветки в %.
#include <Wire.h> // Подключаем библиотеку Wire для работы с шиной I2C. int VAL_LIGHT = 50; // Определяем значение устанавливаемой яркости в % (0-100). int ADDRESS = 0x27; // Определяем адрес адаптера на шине I2C. // void setup(){ // // Инициируем работу c шиной I2C: // Wire.setClock(100000L); // Устанавливаем скорость передачи данных по шине I2C. Wire.begin(); // Инициируем работу c шиной I2C в качестве мастера. // Устанавливаем яркость: // Wire.beginTransmission(ADDRESS); // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся. Wire.write(0x10); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра REG_LIGHT = 0x10. Wire.write(VAL_LIGHT); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение яркости. Wire.endTransmission(); // Выполняем инициированную ранее передачу данных. } // // void loop(){} //
- Во второй строке скетча (вместо значения
50
) нужно указать требуемую яркость подсветки экрана дисплея в процентах от0
(нет) до100
(максимальная яркость). - В третьей строке скетча (вместо значения
0x27
) нужно указать текущий адрес адаптера на шине I2C (он отображается на экране дисплея).
Скетч сохраняет яркость в flash памяти адаптера, это значит что дисплей будет работать с указанной яркостью даже после отключения и подачи питания, до тех пор пока не будет установлена новая яркость. После применения новой яркости её значение отобразится на экране.
После сохранения требуемой яркости подсветки не забудьте вернуть переключатель в положение «ON» для перевода адаптера в режим работы с LCD дисплеем.
Изменение адреса адаптера на шине I2C:
Адрес адаптера является настройкой адаптера, а значит для его установки необходимо установить переключатель режима работы адаптера в положение «ARD», при этом на экране появится текст информирующий о текущем адресе на шине I2C и яркости подсветки в %.
Адаптер позволяет менять свой адрес на шине I2C как временно, так и постоянно.
- Временный адрес становится адресом адаптера, но не сохраняется в его flash памяти, а значит после отключения питания, у адаптера будет восстановлен прежний адрес.
- Постоянный адрес становится адресом адаптера который сохранится в его flash памяти, а значит постоянный адрес сохранится и после отключения питания.
#include <Wire.h> // Подключаем библиотеку Wire для работы с шиной I2C. int ADDR_NOW = 0x27; // Определяем текущий адрес адаптера на шине I2C. int ADDR_NEW = 0x3F; // Определяем новый адрес адаптера на шине I2C. int SAVE_ADR = true; // Определяем как установить новый адрес: true - постоянно, false - временно. // void setup(){ // byte i; // Объявляем переменную для чтения/записи данных в регистры модуля. // Инициируем работу c шиной I2C: // Wire.setClock(100000L); // Устанавливаем скорость передачи данных по шине I2C. Wire.begin(); // Инициируем работу c шиной I2C в качестве мастера. // Читаем биты состояния модуля: // Wire.beginTransmission(ADDR_NOW); // Инициируем передачу данных по шине I2C к устройству с адресом ADDR_NOW и битом RW=0 (запись). При этом сама передача не начнётся. Wire.write(0x01); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра REG_BITS_0. Wire.endTransmission(false); // Выполняем инициированную ранее передачу данных (параметр false указывает что состояние STOP устанавливать не требуется). Wire.requestFrom(ADDR_NOW, 1); // Читаем из модуля с адресом ADDR_NOW, 1 байт данных в буфер библиотеки Wire. while(Wire.available()) // Проверяем наличие данных в буфере библиотеки Wire. Используя цикл while мы гарантируем полную очистку буфера в следующей строке. i=Wire.read(); // Читаем из буфера библиотеки Wire 1 байт в переменную i. // Определяем как установить адрес: // if(SAVE_ADR){i|=2;}else{i&=~2;} // Устанавливаем или сбрасываем (зависит от флага SAVE_ADR) бит SAVE_ADR_EN в байте переменной i. Wire.beginTransmission(ADDR_NOW); // Инициируем передачу данных по шине I2C к устройству с адресом ADDR_NOW и битом RW=0 (запись). При этом сама передача не начнётся. Wire.write(0x01); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра REG_BITS_0. Wire.write(i); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение переменной i. Wire.endTransmission(); // Выполняем инициированную ранее передачу данных. delay(1); // Устанавливаем задержку в 1 мс. // Устанавливаем новый адрес: // i=(ADDR_NEW<<1)|(SAVE_ADR?1:0); // Помещаем новый адрес ADDR_NEW в переменную i, сдвигаем адрес на 1 бит влево и добавляем младший равный состоянию флага SAVE_ADR. Wire.beginTransmission(ADDR_NOW); // Инициируем передачу данных по шине I2C к устройству с адресом ADDR_NOW и битом RW=0 (запись). При этом сама передача не начнётся. Wire.write(0x06); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра REG_ADDRESS. Wire.write(i); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение переменной i. Wire.endTransmission(); // Выполняем инициированную ранее передачу данных. delay(SAVE_ADR?30:1); // Устанавливаем задержку в 30 мс или 1 мс, зависит от состояния флага SAVE_ADR. } // // void loop(){} //
В данном примере адаптеру можно присвоить как временный, так и постоянный адрес на шине I2C.
- Во второй строке скетча (вместо значения
0x27
) нужно указать текущий адрес адаптера на шине I2C (он отображается на экране дисплея). - В третьей строке скетча (вместо значения
0x3F
) нужно указать новый адрес адаптера на шине I2C (допускаются значения:0x07
< адрес <0x7F
). - В четвертой строке скетча нужно определить, как будет установлен новый адрес адаптера на шине I2C:
true
- постоянно,false
- временно.
Если установлен постоянный адрес, то он появится на экране дисплея, если установлен временный адрес, то на экране дисплея отобразятся два адреса, сначала временный (текущий адрес адаптера), а потом постоянный (адрес который восстановится после отключения питания).
После установки адреса адаптера на шине I2C не забудьте вернуть переключатель в положение «ON» для перевода адаптера в режим работы с LCD дисплеем.
Смена и сортировка адресов на шине I2C:
Изменить адрес любого I2C модуля серии «Flash» можно аппаратно, используя установщик адресов FLASH-I2C. Это модуль подключаемый к шине I2C, на плате которого размещён дисплей и кнопки управления, при помощи которых можно узнать количество любых устройств на шине I2C, и менять адреса модулей Flash-I2C не отключая их от шины, что значительно сократит время сборки ваших проектов. Модуль оснащён разъемом USB через который можно запитать как сам модуль, так и шину I2C, или можно запитать шину I2C без использования разъема USB на плате модуля. Установщик адресов пригодиться в проектах с большим количеством модулей Flash-I2C.
Изменить адрес любого I2C модуля серии «Flash» можно программно, о том как это сделать рассказано в статье Wiki - Программная установка адресов модулей FLASH-I2C. В этой статье рассмотрены примеры с использованием библиотеки iarduino_I2C_Address, которая позволяет получать адреса любых устройств на шине I2C, менять адреса модулей Flash-I2C не отключая их от шины, получать название, номер модели, версию прошивки модулей Flash-I2C, а главное - автоматически сортировать адреса модулей Flash-I2C даже если на шине есть устройства с одинаковыми адресами.
Обращаем внимание, что используя описанные в данном разделе аппаратную или программную реализацию смены и сортировки адреса, переключатель режима работы адаптера должен находиться в положении «ARD», при этом на экране появится текст информирующий о текущем адресе на шине I2C и яркости подсветки в %.
Управление внутренней подтяжкой линий шины I2C:
Внутренняя подтяжка линий шины I2C является настройкой адаптера, а значит для управления ей необходимо установить переключатель режима работы адаптера в положение «ARD», при этом на экране появится текст информирующий о текущем адресе на шине I2C и яркости подсветки в %.
#include <Wire.h> // Подключаем библиотеку Wire для работы с шиной I2C. int Pull_UP = true; // Определяем наличие внутренней подтяжки линий I2C: true/false. int ADDRESS = 0x27; // Определяем текущий адрес адаптера на шине I2C. // void setup(){ // byte i; // Объявляем переменную для чтения/записи данных в регистры модуля. // Инициируем работу c шиной I2C: // Wire.setClock(100000L); // Устанавливаем скорость передачи данных по шине I2C. Wire.begin(); // Инициируем работу c шиной I2C в качестве мастера. // Читаем биты состояния модуля: // Wire.beginTransmission(ADDRESS); // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся. Wire.write(0x01); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра REG_BITS_0. Wire.endTransmission(false); // Выполняем инициированную ранее передачу данных (параметр false указывает что состояние STOP устанавливать не требуется). Wire.requestFrom(ADDRESS, 1); // Читаем из модуля с адресом ADDRESS, 1 байт данных в буфер библиотеки Wire. while(Wire.available()) // Проверяем наличие данных в буфере библиотеки Wire. Используя цикл while мы гарантируем полную очистку буфера в следующей строке. i=Wire.read(); // Читаем из буфера библиотеки Wire 1 байт в переменную i. // Управляем подтяжкой линий I2C: // if(Pull_UP){i|=4;}else{i&=~4;} // Устанавливаем или сбрасываем (зависит от флага Pull_UP) бит SET_I2C_UP в байте переменной i. Wire.beginTransmission(ADDRESS); // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся. Wire.write(0x01); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра REG_BITS_0. Wire.write(i); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение переменной i. Wire.endTransmission(); // Выполняем инициированную ранее передачу данных. delay(1); // Устанавливаем задержку в 1 мс. } // // void loop(){} //
В данном примере можно управлять внутренней подтяжкой линий шины I2C до уровня 3,3 В. На линии I2C допускается устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В и выше, вне зависимости от состояния внутренней подтяжки адаптера.
Во второй строке скетча нужно определить состояние внутренней подтяжки линий шины I2C: true
- включить, false
- отключить.
В третьей строке скетча (вместо значения 0x27
) нужно указать текущий адрес адаптера на шине I2C (он отображается на экране дисплея).
После настройки подтяжек линий шины I2C не забудьте вернуть переключатель в положение «ON» для перевода адаптера в режим работы с LCD дисплеем.
Изменение яркости подсветки в основном режиме работы:
Модуль позволяет изменить яркость подсветки дисплея, оставляя переключатель работы адаптера в положение «ON» (режим работы с дисплеем).
#include <Wire.h> // Подключаем библиотеку для работы с шиной I2C #include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея } // // void loop(){ // lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print("LCD"); // Выводим текст "LCD", начиная с установленной позиции курсора lcd.print("\x0F-100%"); delay(50); // Установить яркость в 100 % (максимум) lcd.print("\x0F-75%" ); delay(50); // Установить яркость в 75 % lcd.print("\x0F-50%" ); delay(50); // Установить яркость в 50 % lcd.print("\x0F-25%" ); delay(50); // Установить яркость в 25 % lcd.print("\x0F-10%" ); delay(50); // Установить яркость в 10 % lcd.print("\x0F-5%" ); delay(50); // Установить яркость в 5 % lcd.print("\x0F-0%" ); delay(50); // Установить яркость в 0 % (минимум) lcd.print("\x0F-5%" ); delay(50); // Установить яркость в 5 % lcd.print("\x0F-10%" ); delay(50); // Установить яркость в 10 % lcd.print("\x0F-25%" ); delay(50); // Установить яркость в 25 % lcd.print("\x0F-50%" ); delay(50); // Установить яркость в 50 % lcd.print("\x0F-75%" ); delay(50); // Установить яркость в 75 % lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print("www.iarduino.ru"); // Выводим текст "www.iarduino.ru", начиная с установленной позиции курсора } //
Данный пример выводит на дисплей текст «LCD», потом устанавливает разные значения яркости и выводит текст «www.iarduino.ru».
- Строка установки яркости имеет вид
\x0F-100%
где вместо 100 указывается число от 0 до 100. - Строка установки яркости не выводится на экран, а только меняет яркость.
- Яркость заданная строкой не сохраняется в энергонезависимую память адаптера.
- Строку установки яркости можно вывести частями или наоборот, соединить со строкой вывода текста, например, если на дисплей отправить строку
Hello W\x0F-50%orld
то на дисплее появится надпись Hello World, а яркость подсветки изменится на 50%. - Первый символ строки указан в 16-тиричном формате
\x0F
(о том как указывать символы их кодами, рассказано на странице Wiki - Работа с символьными ЖК дисплеями), это спецсимвол указывающий адаптеру на начало строки с параметрами яркости. Данный символ можно изменить на любой другой, отправив строку\x0F>S
, где вместо символаS
указываете любой новый символ.
Ссылки:
- I2C-flash адаптер для LCD дисплеев 1601/1602/2004.
- Wiki - I2C-flash адаптер для LCD дисплеев 1601/1602/2004 - Datasheet.
- Wiki - Работа с символьными ЖК дисплеями 1601, 1602,2004.
- Библиотека LiquidCrystal_I2C_V112 для работы с I2C LCD дисплеями 1601/1602/2004.
- Wiki - Установка библиотек в Arduino IDE.
- Wiki - Программная установка адресов модулей FLASH-I2C.
Обсуждение