Символьный LCD и Arduino
В этой инструкции показано, как подключать к Arduino и использовать LCD экраны на 16х2 и 20х4.
Эти экраны имеют встроенную подсветку на базе маломощного светодиода, работают от +5 В. Для подключения этих жидкокристаллических экранов понадобится 6 контактов. Можно использовать любые пины на вашем Arduino!
Инструкция написана на основании LCD экранов от компании Adafruit - blue&white 16x2, RGB 16x2 LCD, и blue&white 20x4, RGB 20x4. Если вы используете ЖК экран от другого производителя, нет 100% гарантии, что он сработает (хотя в 99% случаев все работает).
Символьные и графические LCD - в чем разница?
Существует огромное количество разных ЖК экранов. В этой статье мы рассмотрим символьные (character) LCD. Подобные экраны - отличный вариант для отображения текста. Можно настроить и отображение иконок, но размер этих иконок не должен превышать 7 пикселей (очень маленькие!).
На фото ниже показан пример работы LCD монитора на 16 символов с двумя строками:

Если вы присмотритесь повнимательнее, вы увидите маленькие прямоугольники, в которых отображаются символы. Каждый прямоугольник - это отдельная сетка пикселей. Для сравнения, ниже показан графический (graphical) LCD экран:

На графическом жидкокристаллическом дисплее одна большая сетка пикселей (в данном примере - 128х64). На нем можно отобразить текст, но лучше выводить изображения. Графические LCD обычно больше по размерам, на них больше контактов для подключения, использовать их несколько сложнее, чем текстовые.
В этой статье мы рассмотрим только текстовые/символьные экраны!
Разные модели LCD экранов
После того, как мы ограничили тип рассматриваемых экранов, рассмотрим, какие они бывают.

Несмотря на то, что они используются только для отображения текста, существуют разные модели и форм-факторы: в левом верхнем углу ЖК экран 20x4 с белым текстом на синем фоне, в правом верхнем - 16x4 с черным текстом на зеленом фоне, слева внизу - 16x2 с белым текстом на синем фоне и 16x1 с черным текстом на сером фоне.
Хорошая новость: все эти экраны взаимозаменяемы. Если вы настроили один из них, вы можете заменить его на другую модель. Скетч Arduino придется немного изменить, но подключение одинаковое!

В этой части мы используем LCD экраны с одной рельсой и 16 контактами для подключения (смотрите фото выше). Есть и LCD с 2 рельсами по 8 контактов для подключения (на рисунке ниже).

Подключить вторую модель к беспаечной монтажной плате сложнее.
Подключение символьного LCD экрана к Arduino
Устанавливаем рельсы контактов

Помимо LCD экрана вам понадобится дополнительная обвязка. Во-первых - потенциометр на 10 КОм. С помощью потенциометра мы будем настраивать контрастность дисплея. На каждом ЖК экране различные настройки контрастности, так что без регулировки не обойтись. Кроме того, вам понадобится рельса контактов 0.1".

Если рельса с контактами слишком длинная, лишние контакты модно просто отрезать!
Вам надо припаять контакты к ЖК дисплею.
При пайке будьте предельно осторожны, не повредите ваш Breadboard! Можете сначала "прихватить" первый и 16 контакты, а потом уже припаять остальные.

Рекомендуем для пайки установить рельсы на макетке, а сверху поставить экран. В таком положении экран будет достаточно надежно зафиксирован и процесс пайки пройдет легко и непринужденно ;)!
Питание и подсветка
Фото |
Пояснения |
---|---|
![]() |
Мы начинаем подбираться к интересным вещам! Установите ваш LCD на breadboard. |
![]() |
Макетную плату запитываем от нашего Arduino. Подключите +5V к красной рельсе, а Gnd - к синей. |
![]() |
После этого подключим подсветку нашего LCD экрана. Подключите контакт 16 к gnd, а пин 15 - к +5V. На большинстве ЖК экранов предусмотрены резисторы для подсветки. Если же на вашем модуле резисторов не оказалось, придется добавить один между 5V и пином 15. Для расчета номинала резисторов, уточните максимальный ток для питания подсветки и примерное значение падения напряжения из даташита. Отнимите значение падения напряжения от 5 В, после этого разделите на максимальную силу тока и округлите к ближайшему большему стандартному значению номинала резистора. Например, если падение напряжения составляет 3.5 В, а сила тока 16 мА, номинал резистора будет равен: (5 - 3.5)/0.016 = 93.75 Ом, или 100 Ом после округления к стандартному значению. Если вы не можете найти даташит, используйте резистор на 220 Ом. Правда, в этом случае подсветка может быть достаточно бледной. |
![]() |
Подключите ваш Arduino к питанию. Подсветка должна загореться. |
Кстати, на некоторых дешевых LCD экранах подсветка не предусмотрена!
Схема для настройки контраста
Фото |
Пояснения |
---|---|
![]() |
Устанавливаем потенциометр. На фото он находится справа от пина 1. |
![]() |
Подключите одну сторону потенциометра к +5V, а вторую - к Gnd. Средний контакт потенциометра подключите к 3 пину на LCD. |
![]() |
Теперь подключаем логику нашего экрана - это отдельная от подсветки цепь! Пин 1 идет к Gnd, а пин 2 - к +5V. |
![]() |
Включите ваш Arduino. Если на LCD Мониторе предусмотрена подсветка, она должна загореться. Покрутите ручку потенциометра, чтобы увидеть первую прямоугольники пикселей на первой строке. |
Если все сработало, поздравляем. Это значит, что логика, подсветка и контраст работают! Если не получилось, не переходите к следующим шагам инструкции, пока не выясните, в чем ошибка!
Окончательное подключение
От D0 до D7, RS, EN, и RW. D0-D7 - это контакты, на которых хранится значения, передаваемые на дисплей. Контакт RS сообщает контроллеру, будем ли мы отображать данные (например, ASCII символ) или это управляющий байт (например, смена положения курсора). Контакт EN - это сокращение от 'enable' (доступно), с помощью этого контакта мы сообщаем LCD, когда данные готовы для считывания. Контакт RW используется для установки направления - мы хотим отобразить (обычно) или считать (используется реже) данные с дисплея.
Не все эти контакты надо подключать к Arduino. Например, использовать RW не надо, если мы только отображаем данные на экране, так что его достаточно 'подтянуть' к контакту Gnd. Кроме того, можно обмениваться данными с LCD экраном, используя 4 контакта вместо 8. Вероятно, возникает закономерный вопрос, в каких случаях используют 8 контактов? Скорее всего, это влияет на скорость передачи данных. То есть, используя 8 контактов вместо 4, вы можете увеличить скорость обмена информацией в 2 раза. В данном случае, скорость не важна, так что мы используем 4 контакта для подключения LCD к Arduino.
Итак, нам понадобятся 6 контактов: RS, EN, D7, D6, D5, и D4.
Для работы с LCD экраном, будем использовать библиотеку LiquidCrystal library, которая значительно облегчает процесс настройки пинов. Одно из достоинств этой библиотеки: вы можете использовать любые пины на Arduino для подключения контактов ЖК дисплея. Так что по окончанию этого гайда вы сможете легко заменить контакты, если это критично для вашего проекта.
Фото |
Пояснения |
---|---|
![]() |
Как упоминалось выше, мы не будем использовать пин RW, так что 'подтягиваем' его к земле. Это пин 5. |
![]() |
После подключаем RS - это пин #4. Мы используем коричневый провод для его подключения к цифровому контакту #7 на Arduino. |
![]() |
Белым проводом подключаем контакт EN - пин #6 к цифровому пину digital #8 на Arduino. |
![]() |
Подошла очередь к контактам data. DB7 - это пин #14 на LCD. Он подключается оранжевым проводом к пину #12 на Arduino. |
![]() |
Осталось три контакта data, DB6 (пин #13 желтый), DB5 (пин #12 зеленый) и DB4 (пин #11 синий). Они подключаются к пинам #11, 10 и 9 на Arduino соответственно. |
![]() |
В результате Подключения у вас получится что-то похожее на фото слева. |
Используем символьный LCD
Пришло время загрузить скетч на Arduino для управления LCD экраном. Библиотека LiquidCrystal library установлена в Arduino IDE по умолчанию. Так что нам достаточно загрузить один из примеров и немного подкорректировать в соответствии с теми пинами, которые мы использовали для подключения.
Откройте скетч File→Examples→LiquidCrystal→HelloWorld.
Обновляем информацию о пинах. Ищем следующую строку:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
И меняем ее на:
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
Теперь можете компилировать и загружать скетч на Arduino.

Если надо, настройте контраст

Естественно, вы можете использовать ЖК дисплей с любыми размерами. Например, на фото ниже показана работа LCD 20x4.

Или черный текст на зеленом фоне:

Одно из достоинств экранов с черным текстом на зеленом фоне - возможность отключения подсветки.

Задействуем насколько строк
Давайте разберемся, как ЖК экран обрабатывает длинные сообщения и задействует несколько строк. Например, если вы измените следующую строку:
lcd.print("hello, world!");
На следующую:
lcd.print("hello, world! this is a long long message");
LCD дисплей 16x2 обрежет все после 16-го символа:

Но LCD дисплей 20x4 перенесет не отображенные символы с первой строки на третью (вторая строка продолжится на четвертой). Не очень удобно, но на этом этапе придется смириться. Так что при отображении длинных строк, считайте символы, чтобы не превысить допустимую длину.

LCD с RGB подсветкой
Эти экраны работают так же как и обычные, но для подсветки установлены три светодиода (красный, зеленый, синий), так что вы можете использовать разные цвета подсветки.
После подключения LCD и его проверки в соответствии с инструкциями выше, подключите светодиоды к ШИМ аналоговым пинам вашего Arduino для точной настройки цвета. Если вы используете Arduino Uno, у вас должно было остаться три свободных ШИМ контакта. подключите красный светодиод (16 контакт на LCD) к Digital 3, зеленый светодиод (контакт 17) - к Digital 5, а синий светодиод (18 контакт на LCD) - к digital 6. На LCD модуле уже предусмотрены резисторы, так что подключать дополнительные не надо.

Теперь загрузите приведенный ниже скетч на Arduino.
// включаем в скетч библиотеки:
#include <LiquidCrystal.h>
#include <Wire.h>
#define REDLITE 3
#define GREENLITE 5
#define BLUELITE 6
// объявляем количество контактов, которые используем
// для передачи данных
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// яркость можно изменять в диапазоне 0 -> 255
int brightness = 255;
void setup() {
// настраиваем количество столбцов и строк на LCD:
lcd.begin(16, 2);
// отображаем сообщение на LCD.
lcd.print("RGB 16x2 Display ");
lcd.setCursor(0,1);
lcd.print(" Multicolor LCD ");
pinMode(REDLITE, OUTPUT);
pinMode(GREENLITE, OUTPUT);
pinMode(BLUELITE, OUTPUT);
brightness = 100;
}
void loop() {
for (int i = 0; i < 255; i++) {
setBacklight(i, 0, 255-i);
delay(5);
}
for (int i = 0; i < 255; i++) {
setBacklight(255-i, i, 0);
delay(5);
}
for (int i = 0; i < 255; i++) {
setBacklight(0, 255-i, i);
delay(5);
}
}
void setBacklight(uint8_t r, uint8_t g, uint8_t b) {
// настраиваем красный светодиод - он ярче остальных!
r = map(r, 0, 255, 0, 100);
g = map(g, 0, 255, 0, 150);
r = map(r, 0, 255, 0, brightness);
g = map(g, 0, 255, 0, brightness);
b = map(b, 0, 255, 0, brightness);
// общий анод, так что инвертируем!
r = map(r, 0, 255, 255, 0);
g = map(g, 0, 255, 255, 0);
b = map(b, 0, 255, 255, 0);
Serial.print("R = "); Serial.print(r, DEC);
Serial.print(" G = "); Serial.print(g, DEC);
Serial.print(" B = "); Serial.println(b, DEC);
analogWrite(REDLITE, r);
analogWrite(GREENLITE, g);
analogWrite(BLUELITE, b);
}
Результат работы данного скетча приведен на видео ниже
Команда createChar
Вероятно, вы захотите использовать специальные символы. Например, если вы разрабатываете проект с использованием датчика температуры (термопары), вам пригодится символ (°).
Реализовать это можно с помощью команды createChar. Кроме того, вам может пригодиться отличный веб-сайт, который выполнит за вас всю грязную работу по созданию новых символов!
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!