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. Такие дела.

Дисплей 1602 с русским языком

Изменено: