Как подключить LCD дисплей с I2C модулем к Arduino
В статье будем подключать к Ардуино жидкокристаллический дисплей 1602 с I2C модулем FC-113, благодаря чему подключение будет осуществляться всего по 2 проводам данных + 2 проводам питания.
Инструкция по подключению ЖК дисплея к Arduino по интерфейсу I2C
Нам понадобится:
- Arduino UNO или иная совместимая плата;
- ЖК экран 1602 (16 символов, 2 строки);
- I2C адаптер FC-113 или аналогичный;
- соединительные провода (рекомендую вот такой набор);
- макетная плата (breadboard);
- персональный компьютер со средой разработки Arduino IDE.
1Описание FC-113 преобразователя последовательного интерфейса в параллельный
- Модуль FC-113 сделан на базе микросхемы PCF8574T, которая представляет собой 8-битный сдвиговый регистр – «расширитель» входов-выходов для последовательной шины I2C. На рисунке микросхема обозначена DD1.
- R1 – подстроечный резистор для регулировки контрастности ЖК дисплея.
- Джампер J1 используется для включения подсветки дисплея.
- Выводы 1…16 служат для подключения модуля к выводам LCD дисплея.
- Контактные площадки А1…А3 нужны для изменения адреса I2C устройства. Запаивая соответствующие перемычки, можно менять адрес устройства. В таблице приведено соответствие адресов и перемычек: "0" соответствует разрыву цепи, "1" – установленной перемычке. По умолчанию все 3 перемычки разомкнуты и адрес устройства 0x27.
2Схема подключения ЖК дисплея к Arduinoпо протоколу I2C
Подключение модуля к Arduino осуществляется стандартно для шины I2C: вывод SDA модуля подключается к аналоговому порту A4, вывод SCL – к аналоговому порту A5 Ардуино. Питание модуля осуществляется напряжением +5 В от Arduino. Сам модуль соединяется выводами 1…16 с соответствующими выводами 1…16 на ЖК дисплее.
3Библиотека для работы по протоколу I2C
Теперь нужна библиотека для работы с LCD по интерфейсу I2C. Можно воспользоваться, например, вот этой (ссылка в строке "Download Sample code and library").
Скачанный архив LiquidCrystal_I2Cv1-1.rar разархивируем в папку \libraries\, которая находится в директории Arduino IDE.
Библиотека поддерживает набор стандартных функций для LCD экранов:
Функция | Назначение |
---|---|
LiquidCrystal() | создаёт переменную типа LiquidCrystal и принимает параметры подключения дисплея (номера выводов); |
begin() | инициализация LCD дисплея, задание параметров (кол-во строк и символов); |
clear() | очистка экрана и возврат курсора в начальную позицию; |
home() | возврат курсора в начальную позицию; |
setCursor() | установка курсора на заданную позицию; |
write() | выводит символ на ЖК экран; |
print() | выводит текст на ЖК экран; |
cursor() | показывает курсор, т.е. подчёркивание под местом следующего символа; |
noCursor() | прячет курсор; |
blink() | мигание курсора; |
noBlink() | отмена мигания; |
noDisplay() | выключение дисплея с сохранением всей отображаемой информации; |
display() | включение дисплея с сохранением всей отображаемой информации; |
scrollDisplayLeft() | прокрутка содержимого дисплея на 1 позицию влево; |
scrollDisplayRight() | прокрутка содержимого дисплея на 1 позицию вправо; |
autoscroll() | включение автопрокрутки; |
noAutoscroll() | выключение автопрокрутки; |
leftToRight() | задаёт направление текста слева направо; |
rightToLeft() | направление текста справа налево; |
createChar() | создаёт пользовательский символ для LCD-экрана. |
4Скетч для вывода текста на LCD экран по шине I2C
Откроем образец: Файл Образцы LiquidCrystal_I2C CustomChars и немного его переделаем. Выведем сообщение, в конце которого будет находиться мигающий символ. В комментариях к коду прокомментированы все нюансы скетча.
#include <Wire.h> // подключаем библиотеку Wire #include <LiquidCrystal_I2C.h> // подключаем библиотеку ЖКИ #define printByte(args) write(args); // uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; // битовая маска символа «сердце» LiquidCrystal_I2C lcd(0x27, 16, 2); // Задаём адрес 0x27 для LCD дисплея 16x2 void setup() { lcd.init(); // инициализация ЖК дисплея lcd.backlight(); // включение подсветки дисплея lcd.createChar(3, heart); // создаём символ «сердце» в 3 ячейке памяти lcd.home(); // ставим курсор в левый верхний угол, в позицию (0,0) lcd.print("Hello SolTau.ru!"); // печатаем строку текста lcd.setCursor(0, 1); // перевод курсора на строку 2, символ 1 lcd.print(" i "); // печатаем сообщение на строке 2 lcd.printByte(3); // печатаем символ «сердце», находящийся в 3-ей ячейке lcd.print(" Arduino "); } void loop() { // мигание последнего символа lcd.setCursor(13, 1); // перевод курсора на строку 2, символ 1 lcd.print("\t"); delay(500); lcd.setCursor(13, 1); // перевод курсора на строку 2, символ 1 lcd.print(" "); delay(500); }
Кстати, символы, записанные командой lcd.createChar();, остаются в памяти дисплея даже после выключения питания, т.к. записываются в ПЗУ дисплея 1602.
5Создание собственных символов для ЖК дисплея
Немного подробнее рассмотрим вопрос создания собственных символов для ЖК экранов. Каждый символ на экране состоит из 35-ти точек: 5 в ширину и 7 в высоту (+1 резервная строка для подчёркивания). В строке 6 приведённого скетча мы задаём массив из 7-ми чисел: {0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0}. Преобразуем 16-ричные числа в бинарные: {00000, 01010, 11111, 11111, 01110, 00100, 00000}. Эти числа – не что иное, как битовые маски для каждой из 7-ми строк символа, где "0" обозначают светлую точку, а "1" – тёмную. Например, символ сердца, заданный в виде битовой маски, будет выглядеть на экране так, как показано на рисунке.
6Управление ЖК экраном по шине I2C
Загрузим скетч в Arduino. На экране появится заданная нами надпись с мигающим курсором в конце.
7Что находится «за» шиной I2C
В качестве бонуса рассмотрим временную диаграмму вывода латинских символов "A", "B" и "С" на ЖК дисплей. Эти символы имеются в ПЗУ дисплея и выводятся на экран просто передачей дисплею их адреса. Диаграмма снята с выводов RS, RW, E, D4, D5, D6 и D7 дисплея, т.е. уже после преобразователя FC-113 «I2C параллельная шина». Можно сказать, что мы погружаемся немного «глубже» в «железо».
На диаграмме видно, что символы, которые имеются в ПЗУ дисплея (см. стр.11 даташита, ссылка ниже), передаются двумя полубайтами, первый из которых определяет номер столбца таблицы, а второй – номер строки. При этом данные «защёлкиваются» по фронту сигнала на линии E (Enable), а линия RS (Register select, выбор регистра) находится в состоянии логической единицы, что означает передачу данных. Низкое состояние линии RS означает передачу инструкций, что мы и видим перед передачей каждого символа. В данном случае передаётся код инструкции возврата каретки на позицию (0, 0) ЖК дисплея, о чём также можно узнать, изучив техническое описание дисплея.
И ещё один пример. На этой временной диаграмме показан вывод символа «Сердце» на ЖК дисплей.
Опять, первые два импульса Enable соответствуют инструкции Home() (0000 00102) – возврат каретки на позицию (0; 0), а вторые два – вывод на ЖК дисплей хранящийся в ячейке памяти 310 (0000 00112) символ «Сердце» (инструкция lcd.createChar(3, heart); скетча).
Скачать LCD 1602 datasheet
Download attachments:
- Скачать техническое описание на LCD дисплей 1602 (914 Downloads)
Поблагодарить автора:
Поделиться
Related items
10 comments
-
Максим Пятница, 29 Июнь 2018 09:07 Ссылка на комментарий
А что делать если у тебя загорелись H░░░░░░░░░░░░░░░
░♥░░░░░░░░░░░░▓░
░ - Ничего
▓ - Недокурсор
█ - Курсор -
Анатолий Среда, 08 Август 2018 01:23 Ссылка на комментарий
помогите в проблеме: W7
юзал с версиями софтвера ардуино 1.05; 1.6.13; 1.8.3 и разными версиями библиотек
дисплея по I2C. Возникла проблема: не могу раскопать откуда, при переустановке, софт берет устанавливаемые вручную библиотеки? Чистил и создаваемую папку "ардуино" в доках и скрытый app, прошелся по системе клинером (после удаления софта). Но устанавливаю любую версию через установщик и снова в списке библиотек стоят ранее установленные. Поведение софта странное, из установленных библиотек берет команды кривой и работает по её правилу, даже примеры других из библиотек дисплея обрабатывает по выбранной "кривой". В меню софта почему то отсутствует простое удаление или замена библиотек.
Подскажите, как удалить библиотеки? откуда он их хватает?
Вчера, эти библиотеки прописывались в папке "ардуино" > "Документы". Указывал зип файл библиотеки и она устанавливалась в папку "ардуино". Затем появлялась в меню софта. Удалял созданную библиотеку и она исчезала из меню софта. Все красиво. Не пошла > стер > переустановил. Сегодня ничего не могу сделать. При старте софта и переустановке все библиотеки всплывают и + открывается последний создаваемый скетч даже на переустановленном софте любого релиза???? -
aave1 Четверг, 09 Август 2018 17:32 Ссылка на комментарий
Я стараюсь использовать портабельные версии, которые не устанавливаются и нигде в системе не прописываются. Тогда и проблем таких не возникает. Попробовал с тремя обозначенными версиями - у меня повторить такую ошибку у себя не получилось.
Поэтому могу лишь порекомендовать воспользоваться бесплатным инструментом Process Monitor от Марка Руссиновича. Эта программа показывает, в том числе, все обращения заданной программы к файловой системе компьютера. Так вы сможете проследить, откуда всё же загружаются библиотеки. -
Григорий Суббота, 06 Октябрь 2018 08:40 Ссылка на комментарий
Подскажите пожалуйста как изменить пины A4 и A5 на другие,например на A2 и A3 при работе дисплея 1602 через i2C. Это можно сделать в библиотеке или в скетче!?
-
aave2 Понедельник, 08 Октябрь 2018 22:02 Ссылка на комментарий
Дело в том, что A4 и A5 - это выводы, которые аппаратно реализуют интерфейс I2C в Arduino. Если хотите использовать другие выводы, Вы можете написать свою программную реализацию интерфейса I2C или воспользоваться готовой, например, этой: https://github.com/adafruit/Adafruit_Trellis_Library
-
Гумер Суббота, 27 Июль 2019 14:36 Ссылка на комментарий
Добрый день.
Большой проект Color and Code версии 19. Определение элементов по цвету, коду, справочники, включая Arduino.
Есть встроенный калькулятор LCD1602 символов, генерация программной строки....
Может кому пригодится https://colorandcode.su -
Виталий Четверг, 13 Август 2020 17:56 Ссылка на комментарий
Спасибо автору.
Порадовал новыми версиями ...
Успехов проекту. -
Дмитрий Среда, 21 Октябрь 2020 08:53 Ссылка на комментарий
почему в описании функций begin(), а в примере lcd.init()?
-
aave1 Среда, 21 Октябрь 2020 15:01 Ссылка на комментарий
Дмитрий, на момент написания статьи API данной библиотеки был таков. Кстати, как и стандартной библиотеки Arduino LiquidCrystal для работы с ЖК экранами. Сейчас, действительно, название функции инициализации поменяли на init().
-
Egor Среда, 21 Декабрь 2022 14:38 Ссылка на комментарий
Здравствуйте, такая проблема что при загрузке скетча высветчивается ошибка в функции "init" что делать?
class LiquidCrystal_I2C' has no member named 'init'