Жидкокристаллический дисплей (LCD) 1602 и его старший брат 2004 встречаются в двух исполнениях: с параллельным интерфейсом и с поддержкой шины I2C. В первом случае, для подключения к контроллеру требуется задействовать целых шесть контактов, что часто заставляет нас грустить. Модуль дисплея приходится ставить на макетную плату, подключать в цепь внешний потенциометр контраста и связывать всё это кучей проводов.
Другое дело дисплеи с I2C шиной. Универсальный интерфейс, который позволяет на двухконтактную шину «навесить» множество разных устройств. Тех же ЖК дисплеев можно подключить целых 8 штук (если I2C модуль имеет перемычки для выставления адреса).
На этом уроке мы будем разбираться с I2C версией русифицированного жидкокристаллического модуля 1602. О работы с данным дисплеем без I2C мы уже рассказывали в одном из уроков ранее (дисплей 1602 с русскими буквами).
Список необходимых компонентов
Для выполнения простого примера, кроме самого дисплея, потребуется I2C модуль, Arduino-совместимый контроллер с напряжением логики 5В и немного проводов. Если вам не хватает чего-то из этого, можно добавить необходимые компоненты в корзину прямо здесь и затем оформить заказ в нашем интернет-магазине.
Подключение
Для начала, нам потребуется убедиться, что на нашем дисплее установлен тот самый I2C модуль. Как правило, это такая чёрная плата с микросхемой, 16 контактами для подключения дисплея и 4 контактами, собственно, для работы I2C.
Микросхема, которая находится на чёрной плате — это ни что иное, как расширитель GPIO с I2C интерфейсом. Про полезный модуль с аналогичной микросхемой мы уже рассказывали ранее (расширитель GPIO от RobotClass).
Подключаем его к Arduino или к иному контроллеру по стандартной схеме:
Arduino | +5V | GND | A4 | A5 |
LCD | VCC | GND | SDA | SCL |
Также на I2C модуле есть три перемычки для смены адреса. По-умолчанию, когда все перемычки разомкнуты, адрес устройства — 0x27. Другие комбинации можно посмотреть в таблице:
Перемычки | Адрес |
— | 0x27 |
A0 | 0x26 |
A1 | 0x25 |
A0,A1 | 0x24 |
A2 | 0x23 |
A0,A2 | 0x22 |
A1,A2 | 0x21 |
A0,A1,A2 | 0x20 |
Программа
В каждом подобном дисплее имеется немного встроенной постоянной памяти, в которой хранятся образы всех доступных символов. Именно из-за этой таблицы символов и возникает проблема с выводом кириллицы на большинстве нелокализованных дисплеев (купленных на Aliexpress или ещё где-то). То есть, символов кириллицы там просто нет.
Но мы будем работать с модулем 1602, в котором есть полноценная локализованная таблица. Только вот она совсем не стандартная. Не получится просто написать текст в кодировке cp1251 и отправить его на дисплей. Потребуется определённым образом перетасовать символы. К тому же, некоторые русские буквы можно взять из латинской части таблицы ASCII, чем пользуются производители дисплеев для экономии памяти.
Для работы с русифицированными дисплеями версии I2C потребуется установить две библиотеки. Первая — это LiquidCrystal_I2C, которую можно установить из репозитория Arduino IDE.
Вторая — это разработанная нами вспомогательная библиотека RobotClass_LiquidCrystal_I2C. Именно она делает все необходимые манипуляции с таблицей символов. Пользоваться ей так же просто, как и оригинальной LiquidCrystal_I2C.
Напишем программу, которая будет сначала выводить заглавными и прописными буквами первую половину алфавита, а спустя секунду, вторую половину.
#include <RobotClass_LiquidCrystal_I2C.h>
RobotClass_LiquidCrystal_I2C lcd(0x27, 16, 2, CP_UTF8);
byte idx = 0;
void setup() {
lcd.init();
lcd.backlight();
}
void loop() {
lcd.setCursor(0,0);
lcd.print( "АБВГДЕЁЖЗИКЛМНОП" );
lcd.setCursor(0,1);
lcd.print( "абвгдеёжзиклмноп" );
delay(1000);
lcd.setCursor(0,0);
lcd.print( "РСТУФХЦЧШЩЪЫЬЭЮЯ" );
lcd.setCursor(0,1);
lcd.print( "рстуфхцчшщъыьэюя" );
delay(1000);
}
Единственной отличие от обычной библиотеки LiquidCrystal_I2C наблюдается в строке инициализации:
RobotClass_LiquidCrystal_I2C lcd(0x27, 16, 2, CP_UTF8);
Последний аргумент CP_UTF8 означает, что мы передаём в функцию print текст в кодировке UTF-8. Это стандартная кодировка для Arduino IDE. Однако, если пользователь изменил кодировку среды на cp1251, то нужно будет заменить этот аргумент на CP_CP1251. Такие дела.
Остался ещё один момент, который может препятствовать нашей радости от работающего дисплея. После загрузки программы на Arduino необходимо настроить контрастность. Для этого покрутим ручку потенциометра, расположенную на I2C модуле, до тех пор, пока изображение на дисплее не станет чётким.
Загружаем программу на контроллер и наблюдаем русский алфавит. Теперь ваше устройство сможет общаться с пользователем на чистом русском!
Спасибо большое!! Наконец-то нашёл прямую библиотеку для дисплеев поддерживающих кириллицу!!
Полная ерунда, выводятся полукитайские буквы!
Уточните, какой именно дисплей вы подключаете? Если покупали в RobotClass, то укажите код товара. Не все дисплеи поддерживают кириллицу.
Супер! Все заработало с первого раза. LCD 2004. Грамотное решение. Спасибо!
Здравствуйте! При попытке компиляции примера вылетает следующая ошибка:
Arduino: 1.8.9 (Windows 10), Плата:»Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)»
In file included from D:\student\mydocs\Arduino\libraries\RobotClass_LiquidCrystal_I2C-master\examples\CyrillicLCDTest\CyrillicLCDTest.ino:1:0:
D:\student\mydocs\Arduino\libraries\RobotClass_LiquidCrystal_I2C-master/RobotClass_LiquidCrystal_I2C.h:7:10: fatal error: LiquidCrystal_I2C.h: No such file or directory
#include
^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
exit status 1
Ошибка компиляции для платы Arduino Mega or Mega 2560.
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»
Библиотека LicqudCristal_I2C имеется
В чем проблема?