Arduino IDE
Начнём знакомство с написания простой программы, которая выведет текст «Hello, world!» в первой строке.
Для работы с ЖК дисплеями различных размеров и типов, в редакторе Arduino IDE имеется специальная библиотека LiquidCrystal. Чтобы подключить библиотеку, напишем в первой строчке нашей программы выражение:
#include <LiquidCrystal.h>
Далее, нам потребуется указать какие выводы Arduino мы использовали для подключения дисплея. Эту информацию мы укажем при инициализации модуля:
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
Здесь первые два аргумента — это выводы RS и EN, а оставшиеся четыре — линии шины данных DB4-DB7.
Далее, инициализируем дисплей командой begin, передав два аргумента: количество символов в строке и количество строк.
lcd.begin(16, 2);
Если будет другой дисплей, например, lcd2004, то пишем begin(20, 4).
Наконец, для вывода текста нам понадобится простая функция print. Вывод с помощью этой функции всем известной фразы будет выглядеть следующим образом:
lcd.print( "Hello, world!" );
Полностью программа будет выглядеть так:
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
void setup(){
lcd.begin(16, 2);
lcd.print( "Hello, world!" );
}
void loop(){
}
Загружаем её на Arduino, и смотрим что творится на дисплее. Может быть три распространённые ситуации.
1) На дисплее отобразится надпись «Hello, world!». Значит мы все правильно подключили, и контраст каким-то чудесным образом оказался изначально правильно настроен. Радуемся, и переходим к следующей главе.
2) На дисплее отобразится целый ряд черных прямоугольников — требуется настройка контраста! Именно для этого мы добавили в цепь потенциометр с ручкой. Крутим его от одного края, до другого, до момента пока на дисплее не появится четкая надпись.
3) Два ряда черных прямоугольников. Скорее всего, вы что-то напутали при подключении. Проверьте трижды все провода. Если не найдете ошибку — попросите кота проверить!
Бегущая строка
Теперь когда дисплей точно работает, попробуем более сложную программу. Сделаем бегущую строку.
Для сдвига текста влево или вправо воспользуемся функциями scrollDisplayLeft и scrollDisplayRight. Пусть сначала текст бежит влево, пока его последняя буква не скроется за границей дисплея. Затем текст бежит вправо, также, пока не скроется. Наконец, текст бежит влево в исходную позицию.
#include <LiquidCrystal.h>
String text = "Hello, world!";
byte text_len = 0; // размер строки
byte lcd_len = 16; // размер дисплея
LiquidCrystal lcd(4, 5, 6, 7, 8, 9); // инициализация
void setup() {
lcd.begin(16, 2);
lcd.print("hello, world!");
text_len = text.length();
}
void loop() {
// двигаем текст влево, пока он не скроется
for( byte pos = 0; pos < text_len; pos++ ){
lcd.scrollDisplayLeft();
delay(200);
}
// двигаем текст вправо, пока он не скроется
for( byte pos = 0; pos < text_len + lcd_len; pos++ ){
lcd.scrollDisplayRight();
delay(200);
}
// двигаем текст снова влево в исходную позицию
for (int pos = 0; pos < lcd_len; pos++) {
lcd.scrollDisplayLeft();
delay(200);
}
delay(1000);
}
Загружаем на Arduino и наблюдаем бегущую строку.
Русские буквы
В каждом подобном дисплее имеется немного встроенной постоянной памяти, в которой хранятся образы всех доступных символов. Именно из-за этой таблицы символов и возникает проблема с выводом кириллицы на большинстве нелокализованных дисплеев (купленных на Aliexpress или ещё где-то). То есть, символов кириллицы там просто нет.
Но мы будем работать с дисплейным модулем, в котором есть полноценная локализованная таблица. Только вот она совсем нестандартная. Не получится просто написать текст в кодировке cp1251 и отправить его на дисплей. Потребуется определённым образом перетасовать символы. К тому же, некоторые русские буквы можно взять из латинской части таблицы ASCII, чем пользуются производители дисплеев для экономии памяти.
Для работы с русифицированными дисплеями, которые продаются в нашем интернет-магазине, мы разработали вспомогательную библиотеку RobotClass_LiquidCrystal. Она сама делает все необходимые манипуляции с таблицей символов. Пользоваться ей так же просто, как и стандартной LiquidCrystal.
Напишем программу, которая будет сначала выводить заглавными и прописными буквами первую половину алфавита, а спустя секунду, вторую половину.
#include <RobotClass_LiquidCrystal.h>
RobotClass_LiquidCrystal lcd(4, 5, 6, 7, 8, 9, CP_UTF8);
byte idx = 0;
void setup() {
lcd.begin( 16, 2 );
}
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 наблюдается в строке инициализации:
RobotClass_LiquidCrystal lcd(4, 5, 6, 7, 8, 9, CP_UTF8);
Последний аргумент CP_UTF8 означает, что мы передаём в функцию print текст в кодировке UTF-8. Это стандартная кодировка для Arduino IDE. Однако, если пользователь изменил кодировку среды на cp1251, то следует заменить этот аргумент на CP_CP1251. Такие дела.

