Как подключить 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
Скачать вложения:
- Скачать техническое описание на LCD дисплей 1602 (978 Скачиваний)
Поблагодарить автора:
Поделиться
Похожие материалы (по тегу)
10 комментарии
-
Максим 29.06.2018 09:07 Комментировать
А что делать если у тебя загорелись H░░░░░░░░░░░░░░░
░♥░░░░░░░░░░░░▓░
░ - Ничего
▓ - Недокурсор
█ - Курсор -
Анатолий 08.08.2018 01:23 Комментировать
помогите в проблеме: W7
юзал с версиями софтвера ардуино 1.05; 1.6.13; 1.8.3 и разными версиями библиотек
дисплея по I2C. Возникла проблема: не могу раскопать откуда, при переустановке, софт берет устанавливаемые вручную библиотеки? Чистил и создаваемую папку "ардуино" в доках и скрытый app, прошелся по системе клинером (после удаления софта). Но устанавливаю любую версию через установщик и снова в списке библиотек стоят ранее установленные. Поведение софта странное, из установленных библиотек берет команды кривой и работает по её правилу, даже примеры других из библиотек дисплея обрабатывает по выбранной "кривой". В меню софта почему то отсутствует простое удаление или замена библиотек.
Подскажите, как удалить библиотеки? откуда он их хватает?
Вчера, эти библиотеки прописывались в папке "ардуино" > "Документы". Указывал зип файл библиотеки и она устанавливалась в папку "ардуино". Затем появлялась в меню софта. Удалял созданную библиотеку и она исчезала из меню софта. Все красиво. Не пошла > стер > переустановил. Сегодня ничего не могу сделать. При старте софта и переустановке все библиотеки всплывают и + открывается последний создаваемый скетч даже на переустановленном софте любого релиза???? -
aave1 09.08.2018 17:32 Комментировать
Я стараюсь использовать портабельные версии, которые не устанавливаются и нигде в системе не прописываются. Тогда и проблем таких не возникает. Попробовал с тремя обозначенными версиями - у меня повторить такую ошибку у себя не получилось.
Поэтому могу лишь порекомендовать воспользоваться бесплатным инструментом Process Monitor от Марка Руссиновича. Эта программа показывает, в том числе, все обращения заданной программы к файловой системе компьютера. Так вы сможете проследить, откуда всё же загружаются библиотеки. -
Григорий 06.10.2018 08:40 Комментировать
Подскажите пожалуйста как изменить пины A4 и A5 на другие,например на A2 и A3 при работе дисплея 1602 через i2C. Это можно сделать в библиотеке или в скетче!?
-
aave2 08.10.2018 22:02 Комментировать
Дело в том, что A4 и A5 - это выводы, которые аппаратно реализуют интерфейс I2C в Arduino. Если хотите использовать другие выводы, Вы можете написать свою программную реализацию интерфейса I2C или воспользоваться готовой, например, этой: https://github.com/adafruit/Adafruit_Trellis_Library
-
Гумер 27.07.2019 14:36 Комментировать
Добрый день.
Большой проект Color and Code версии 19. Определение элементов по цвету, коду, справочники, включая Arduino.
Есть встроенный калькулятор LCD1602 символов, генерация программной строки....
Может кому пригодится https://colorandcode.su -
Виталий 13.08.2020 17:56 Комментировать
Спасибо автору.
Порадовал новыми версиями ...
Успехов проекту. -
aave1 21.10.2020 15:01 Комментировать
Дмитрий, на момент написания статьи API данной библиотеки был таков. Кстати, как и стандартной библиотеки Arduino LiquidCrystal для работы с ЖК экранами. Сейчас, действительно, название функции инициализации поменяли на init().
-
Egor 21.12.2022 14:38 Комментировать
Здравствуйте, такая проблема что при загрузке скетча высветчивается ошибка в функции "init" что делать?
class LiquidCrystal_I2C' has no member named 'init'