Как опознать дисплей со встроенными кириллическими буквами?
Дисплей LCD1602 популярен у разработчиков из-за дешевизны и простоты использования. Единовременно на экране отображается 2 строки по 16 символов в каждой. Существуют дисплеи с встроенной кириллицей. Опознать дисплей с кириллицей можно по буквам CT или CP в конце заголовка, например, WH1602B-YYH-CT. На таком дисплее русские буквы выводятся без привлечения излишних библиотек "из коробки". Вот только цена в разы выше чем на обычный англо-китайский экран. Тем не менее есть способ заставить эти дешёвые дисплеи печатать кириллические буквы.
Русифицируем дисплей
В качестве решения проблемы предлагаю использовать библиотеку BigRus1602. Это не русификация дисплея в полном смысле, но путем ухищрений открывает возможность использования всех русских букв.
Есть два основых варианта использования библиотеки:
1. Вывод текста в режиме бегущей строки
2. Для вывода часов или таймера в виде ЧЧ:ММ
Особенности библиотеки BigRus1602 :
- Каждая буква имеет высоту в две строки, что делает её заметной с дальнего расстояния.
- 2 встроенных шрифта: «строгий» и «мягкий».
- Имеет гибкую настройку, чтобы оставить память контроллеру на решение других задач.
- Переключение режимов: бегущая строка | статичный текст.
- Подходит для работы с модулем LCD KeypadShield для Arduino Uno.
Подключаем библиотеку
Для начала необходимо добавить библиотеку в среду Arduino IDE.
Если вы не делали этого раньше, просто следуйте инструкции, это не сложно:
1. Запускаем программу Arduino IDE.
2. В меню сверху находим Скетч->Подключить библиотеку->Добавить .ZIP библиотеку...
3. В открывшемся окне указываем путь к архиву с библиотекой на вашем компьютере.
Минимальный код для вывода кириллических букв.
Библиотека принимает данные типа byte, int, long и массив char[].
// В этом примере текст прокручивается по экрану слева направо:
#include "BigRus1602.h"
char text[] = " АЛХИМИЯ"; // обязательно заглавные буквы
//Пины для подключения LCD Keypad Shield
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
BigRus1602 lcdRus(&lcd);
void setup()
{
lcdRus.begin();
lcdRus.scrollText(true); // включаем скроллинг текста
lcdRus.print(text); // выводим текст на экран единожды
}
void loop()
{
}
Скроллинг текста по экрану
//Scroll speed
#include "BigRus1602.h"
char textSlow[] = " МЕДЛЕННО";
char textFast[] = " БЫСТРО";
//Пины для подключения LCD Keypad Shield
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
BigRus1602 lcdRus(&lcd);
void setup()
{
lcdRus.begin();
}
void loop()
{
//второй аргумент - временной интервал между сдвигами, вводить его не обязательно(по умолчанию 1000 мс)
lcdRus.scrollText(true, 500);
lcdRus.print(textFast);
lcdRus.scrollText(true, 1000);
lcdRus.print(textSlow);
}
Объединение нескольких слов для вывода на экран
В этом примере показано как объединить несколько слов вместе и вывести их на экран при помощи функции .getCarret().
//Sequence of words
#include "BigRus1602.h"
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
BigRus1602 lcdRus(&lcd);
void setup()
{
lcdRus.begin();
for (uint8_t i = 0; i <= 100; i++) //имитируем загрузку
{
lcdRus.print(i);
lcd.setCursor(lcdRus.getCarret(), 1);
lcd.print("% ");
delay(50);
}
delay(3000);
}
void loop()
{
lcd.clear();
for (uint8_t min = 0; min < 30; min++)
{
for (uint8_t sec = 0; sec < 60; sec++)
{
lcdRus.print(min);
lcdRus.print(":", lcdRus.getCarret() -1);
lcdRus.print(sec, lcdRus.getCarret() -1);
//заполним "хвост" строки пробелами чтобы избежать появления артефактов от старого текста. Можно заменить на lcd.clear()
lcdRus.print(" ", lcdRus.getCarret() -1);
delay(1000);
}
}
}
Чтение данных последовательного порта и вывод на ЖК-экран
//SerialRead
#include "BigRus1602.h"
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
BigRus1602 lcdRus(&lcd);
void setup()
{
lcd.begin(16, 2);
lcdRus.begin();
Serial.begin(9600);
lcdRus.scrollText(true);
}
void loop()
{
char serialText[30];
if (Serial.available())
{
//чем больше символов в строке, тем больше нужно времени чтобы принять ее
delay(100);
int availableText = Serial.available();
for (int i = 0; i < availableText; i++)
{
serialText[i] = Serial.read();
serialText[i + 1] = '\0';
}
lcdRus.print(serialText);
}
}
Символы доступные в BigRus1602
Чтобы увидеть все доступные в библиотеке символы, просто загрузите демонстрационный код:
//Simple print
//Демонстрация всех символов
#include "BigRus1602.h"
//библиотека позволяет выводить данные типа byte, int, long и char[]
char text[] = " АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ 1234567890 !?-.,:;";
//Пины для подключения LCD Keypad Shield
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
BigRus1602 lcdRus(&lcd); //указатель &lcd обязателен
void setup()
{
lcdRus.begin();
lcdRus.print("ЛСД");
delay(3000);
lcdRus.scrollText(true);
}
void loop()
{
lcdRus.print(text);
delay(3000);
}
Смена шрифта
В библиотеке доступно два шрифта: Strong и Smooth. Чтобы выбрать один из них откройте файл BigRus1602Font.h. Путь к этому файлу выглядит примерно так C:\Users\Admin\Documents\Arduino\libraries\BigRus1602\ В указанном файле нужно раскомментированую одну из строк. Остальные строки должны быть закомментированы.
Если нужно сэкономить память контроллера, оставьте раскомментированым только строку BC_ONLY_NUMBER
//#define BC_STRONG_FONT //угловатые буквы и цифры
#defineBC_SMOOTH_FONT //скругленные буквы и цифры
//#define BC_ONLY_NUMBER //только цифры (для экономии памяти)
Шрифты для дисплея соданы при помощи утилиты для генерации символов ЖК-экран. Подробнее об этой утилите смотрите здесь.
Смотрите ролик с процессом создания шрифта и разбор представленного кода