Рейтинг@Mail.ru
I2C адаптер и ЖК экран
I2C адаптер и ЖК экран

Как подключить LCD дисплей с I2C модулем к Arduino

10 комментарии Arduino
Print Friendly, PDF & Email

В статье будем подключать к Ардуино жидкокристаллический дисплей 1602 с I2C модулем FC-113, благодаря чему подключение будет осуществляться всего по 2 проводам данных + 2 проводам питания.

Инструкция по подключению ЖК дисплея к Arduino по интерфейсу I2C

Нам понадобится:

1Описание FC-113 преобразователя последовательного интерфейса в параллельный

  • Модуль FC-113 сделан на базе микросхемы PCF8574T, которая представляет собой 8-битный сдвиговый регистр – «расширитель» входов-выходов для последовательной шины I2C. На рисунке микросхема обозначена DD1.
  • R1 – подстроечный резистор для регулировки контрастности ЖК дисплея.
  • Джампер J1 используется для включения подсветки дисплея.
  • Выводы 1…16 служат для подключения модуля к выводам LCD дисплея.
  • Контактные площадки А1…А3 нужны для изменения адреса I2C устройства. Запаивая соответствующие перемычки, можно менять адрес устройства. В таблице приведено соответствие адресов и перемычек: "0" соответствует разрыву цепи, "1" – установленной перемычке. По умолчанию все 3 перемычки разомкнуты и адрес устройства 0x27.
I2C модуль FC-113 для подключения ЖК экрана
I2C модуль FC-113 для подключения ЖК экрана

2Схема подключения ЖК дисплея к Arduinoпо протоколу I2C

Подключение модуля к Arduino осуществляется стандартно для шины I2C: вывод SDA модуля подключается к аналоговому порту A4, вывод SCL – к аналоговому порту A5 Ардуино. Питание модуля осуществляется напряжением +5 В от Arduino. Сам модуль соединяется выводами 1…16 с соответствующими выводами 1…16 на ЖК дисплее.

Схема подключения ЖК дисплея к Arduino по протоколу I2C
Схема подключения ЖК дисплея к Arduino по протоколу I2C

3Библиотека для работы по протоколу I2C

Теперь нужна библиотека для работы с LCD по интерфейсу I2C. Можно воспользоваться, например, вот этой (ссылка в строке "Download Sample code and library").

Библиотека для работы по протоколу I2C
Библиотека для работы по протоколу I2C

Скачанный архив 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" – тёмную. Например, символ сердца, заданный в виде битовой маски, будет выглядеть на экране так, как показано на рисунке.

Создание собственного символа для LCD экрана
Создание собственного символа для LCD экрана

6Управление ЖК экраном по шине I2C

Загрузим скетч в Arduino. На экране появится заданная нами надпись с мигающим курсором в конце.

Управление ЖК экраном с помощью Arduino по шине I2C
Управление ЖК экраном с помощью Arduino по шине I2C

7Что находится «за» шиной I2C

В качестве бонуса рассмотрим временную диаграмму вывода латинских символов "A", "B" и "С" на ЖК дисплей. Эти символы имеются в ПЗУ дисплея и выводятся на экран просто передачей дисплею их адреса. Диаграмма снята с выводов RS, RW, E, D4, D5, D6 и D7 дисплея, т.е. уже после преобразователя FC-113 «I2C параллельная шина». Можно сказать, что мы погружаемся немного «глубже» в «железо».

Временная диаграмма вывода латинских символов "A", "B" и "С" на LCD дисплей 1602
Временная диаграмма вывода латинских символов "A", "B" и "С" на LCD дисплей 1602

На диаграмме видно, что символы, которые имеются в ПЗУ дисплея (см. стр.11 даташита, ссылка ниже), передаются двумя полубайтами, первый из которых определяет номер столбца таблицы, а второй – номер строки. При этом данные «защёлкиваются» по фронту сигнала на линии E (Enable), а линия RS (Register select, выбор регистра) находится в состоянии логической единицы, что означает передачу данных. Низкое состояние линии RS означает передачу инструкций, что мы и видим перед передачей каждого символа. В данном случае передаётся код инструкции возврата каретки на позицию (0, 0) ЖК дисплея, о чём также можно узнать, изучив техническое описание дисплея.

И ещё один пример. На этой временной диаграмме показан вывод символа «Сердце» на ЖК дисплей.

Временная диаграмма вывода символа «Сердце» из ПЗУ на ЖК дисплей 1602
Временная диаграмма вывода символа «Сердце» из ПЗУ на ЖК дисплей 1602

Опять, первые два импульса Enable соответствуют инструкции Home() (0000 00102) – возврат каретки на позицию (0; 0), а вторые два – вывод на ЖК дисплей хранящийся в ячейке памяти 310 (0000 00112) символ «Сердце» (инструкция lcd.createChar(3, heart); скетча).

Скачать LCD 1602 datasheet

Скачать вложения:

Последнее изменениеСреда, 10 Январь 2024 19:50 Прочитано 98222 раз
Теги :

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email

10 комментарии

  • Максим
    Максим 29.06.2018 09:07 Комментировать

    А что делать если у тебя загорелись H░░░░░░░░░░░░░░░
    ░♥░░░░░░░░░░░░▓░
    ░ - Ничего
    ▓ - Недокурсор
    █ - Курсор

  • Анатолий
    Анатолий 08.08.2018 01:23 Комментировать

    помогите в проблеме: W7
    юзал с версиями софтвера ардуино 1.05; 1.6.13; 1.8.3 и разными версиями библиотек
    дисплея по I2C. Возникла проблема: не могу раскопать откуда, при переустановке, софт берет устанавливаемые вручную библиотеки? Чистил и создаваемую папку "ардуино" в доках и скрытый app, прошелся по системе клинером (после удаления софта). Но устанавливаю любую версию через установщик и снова в списке библиотек стоят ранее установленные. Поведение софта странное, из установленных библиотек берет команды кривой и работает по её правилу, даже примеры других из библиотек дисплея обрабатывает по выбранной "кривой". В меню софта почему то отсутствует простое удаление или замена библиотек.
    Подскажите, как удалить библиотеки? откуда он их хватает?
    Вчера, эти библиотеки прописывались в папке "ардуино" > "Документы". Указывал зип файл библиотеки и она устанавливалась в папку "ардуино". Затем появлялась в меню софта. Удалял созданную библиотеку и она исчезала из меню софта. Все красиво. Не пошла > стер > переустановил. Сегодня ничего не могу сделать. При старте софта и переустановке все библиотеки всплывают и + открывается последний создаваемый скетч даже на переустановленном софте любого релиза????

  • aave1
    aave1 09.08.2018 17:32 Комментировать

    Я стараюсь использовать портабельные версии, которые не устанавливаются и нигде в системе не прописываются. Тогда и проблем таких не возникает. Попробовал с тремя обозначенными версиями - у меня повторить такую ошибку у себя не получилось.
    Поэтому могу лишь порекомендовать воспользоваться бесплатным инструментом Process Monitor от Марка Руссиновича. Эта программа показывает, в том числе, все обращения заданной программы к файловой системе компьютера. Так вы сможете проследить, откуда всё же загружаются библиотеки.

  • Григорий
    Григорий 06.10.2018 08:40 Комментировать

    Подскажите пожалуйста как изменить пины A4 и A5 на другие,например на A2 и A3 при работе дисплея 1602 через i2C. Это можно сделать в библиотеке или в скетче!?

  • aave2
    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 Комментировать

    Спасибо автору.
    Порадовал новыми версиями ...
    Успехов проекту.

  • Дмитрий
    Дмитрий 21.10.2020 08:53 Комментировать

    почему в описании функций begin(), а в примере lcd.init()?

  • aave1
    aave1 21.10.2020 15:01 Комментировать

    Дмитрий, на момент написания статьи API данной библиотеки был таков. Кстати, как и стандартной библиотеки Arduino LiquidCrystal для работы с ЖК экранами. Сейчас, действительно, название функции инициализации поменяли на init().

  • Egor
    Egor 21.12.2022 14:38 Комментировать

    Здравствуйте, такая проблема что при загрузке скетча высветчивается ошибка в функции "init" что делать?
    class LiquidCrystal_I2C' has no member named 'init'

Оставить комментарий