Содержание
- Назначение и принцип работы,
- Способы подключения,
- Примеры,
- Вывод,
- FAQ.
Назначение и принцип работы
Раньше, когда компьютеры были большие, а мониторы маленькие, подобные дисплеи назывались алфавитно-цифровыми, потому что, судя по названию, они могли высвечивать только определенные буквы, цифры ну и прочие символы, заранее прописанные в память. Тогда такими были почти все мониторы, отличались они лишь по количеству строк и символов в строке, а также по цвету свечения (а чаще вовсе не отличались, а светили уныло-зеленым). Теперь же, когда компьютерные технологии шагнули так далеко, что порвали не одни штаны, подобные дисплеи остались востребованы только в малой цифровой электронике, для работы с Ардуино и прочими микроконтроллерами. Положительными чертами АЦ дисплеев является простота, малая ресурсоемкость, надежность, неприхотливость, удобство использования, легкое считывание информации, низкая цена и широкое распространение. Теперь они стали еще меньше чем были, количество символов в строке исчисляется парой десятков, а строк несколькими штуками, ведь для наших целей важна компактность и разумная достаточность.
Сейчас встретить их можно на каждом шагу в различных устройствах, от вендинговых автоматов до вполне серьезных приборов. Да, в микроэлектронике АЦ дисплеи начинают постепенно вытесняться графическими конкурентами, но в прошлое канут они еще не скоро, а всё благодаря перечисленным выше преимуществам.
Итак, в современных, наиболее часто встречающихся жидкокристаллических алфавитно-цифровых дисплеях, символ представляет собой матрицу из сорока точек, 5 по горизонтали, 8 по вертикали. Строк может быть 2 или 4, редко больше. Строк 16, 20 и 24, остальные экземпляры являются экзотикой. Называют модели по числу символов и строк, первые две цифры - количество символов, вторые две - количество строк. Вот так выглядит один из самых часто встречающихся у нас дисплей LCD 1602.
Соответственно 16 символов и 2 строки, чего хватает на подавляющее большинство задач. Если же этого мало, применяется второй по популярности дисплей LCD 2004. Попробуйте самостоятельно - по названию - угадать его параметры.
Кроме размера модели отличаются цветом подсветки (желтые, синие, зеленые, красные, белые и так далее), а также делятся на инверсионные и прямые, у одних буквы светлые на темном фоне, у других наоборот.
Несмотря на различия, работают все дисплеи одинаково, подключаются тоже одинаково и для написания программ на Ардуино для них используются одни и те же библиотеки. Разумеется, программисту следует оптимизировать информацию для своего девайса, чтобы текст на нем смотрелся красиво, а информация читалась максимально быстро.
Способы подключения
Их два. Первый самый прямой, к каждому пину дисплея подключается свой пин от контроллера (не считая питания, разумеется). Все бы хорошо и понятно, но проблема в том, что пинов потребуется очень много, до 12 штук, если есть необходимость полностью контролировать процесс.
Одна только шина данных занимает целый порт, то есть 8 пинов! И разумеется, никто не запретит вам потратить моток проводов, половину пинов Ардуино и полчаса времени на подключения одного дисплея, для этого даже существует стандартная схема подключения.
Однако некоторые жадные и ленивые инженеры не пожелали с этим мириться и придумали адаптер - устройство, выполняющее процесс формирования сигналов для дисплея от команд контроллера, передаваемых по двухпроводной шине i2с.
Теперь, потратив несколько десятков рублей на адаптер, можно подключить его всего при помощи двух пинов и двух проводков. Адаптер припаивается прямо к дисплею, лишь немного увеличивая его габарит по глубине, и делает жизнь гораздо проще и веселее.
Схема подключения с адаптером сократилась до минимума:
Даже регулировка контрастности уже предусмотрена на адаптере, нет необходимости искать для этой цели отдельный переменный резистор. Все для человека!
Мы рекомендуем пользоваться вторым вариантом и сами им же пользуемся. Все примеры из этой статьи будут приведены для подключения дисплея через адаптер.
Где приобрести?Купить дисплеи для Arduino и робототехники можно нашем магазине 3DIY
Примеры
С аппаратным подключением разобрались. Осталось подключить программно, то есть добавить в скетч библиотеку, поддерживающую работы через i2c адаптер. Называется она так: “LiquidCrystal_I2C”, подключается так:
#include <Wire.h> #include <LiquidCrystal_I2C.h> // библиотека
Первая строка подключает протокол i2c, вторая саму библиотеку. Ходят слухи, что будет работать даже без первой строки, обязательно проверьте это при случае. Инициируем и запускаем дисплей: LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес в шине, количество символов, количество строк lcd.init(); // запуск lcd.backlight(); // включаем подсветку lcd.clear(); // очищаем экран
Все готово, экран светится и он пуст. Выведем на него стандартное для цифровых устройств приветствие, для чего зальем в Ардуино следующую программу.#include <Wire.h> #include <LiquidCrystal_I2C.h> // библиотека void setup() { LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем lcd.init(); lcd.createChar(1, sd); // создаем символ рожицы lcd.backlight(); // включаем подсветку lcd.clear(); // очищаем экран lcd.print("Hello, World!"); } void loop() {}
Смотрим что получилось. Выглядит замечательно. А давайте, для разнообразия, сделаем надпись в две строки и сдвинем их в центр экрана? Для этого добавим в программу несколько строк с позиционированием курсора.#include <Wire.h> #include <LiquidCrystal_I2C.h> // библиотека void setup() { LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем lcd.init(); lcd.backlight(); // включаем подсветку lcd.clear(); // очищаем экран lcd.setCursor(5, 0); // с 5 позиции первой строки lcd.print("Hello,"); lcd.setCursor(5, 1); // с 5 позиции второй строки lcd.print("World!"); } void loop() {}
Удивительно, но опять все получилось! И что самое приятное, этих нескольких функций достаточно для выполнения большинства задач, уже можно выводить практически любую информацию в любом месте дисплея, для чего он и создан. Но тут особо пытливый читатель обязательно спросит, а какие еще символы способен отображать данный дисплей кроме цифр, латинских букв и знаков препинания? Можно ли изобразить разные мини-картинки и эмодзи? А как насчет русских (турецких, грузинских и прочих) букв? Это очень правильный вопрос и мы ответим на него в два этапа.
Сперва разберемся, что уже можно изобразить на экране с помощью данного конкретного дисплея, попавшего вам в руки. У разных моделей возможна разная прошивка и, соответственно, разные наборы символов в памяти. Латиница, цифры и часть стандартных символов есть всегда, но буквы других алфавитов прошиты в память далеко не всегда. Существуют версии, уже включающие национальные шрифты, при этом продавец, как правило, гордо сообщает об этом в описании товара. Дисплеи с кириллицей значительно облегчат задачу русификации вашего интерфейса, поэтому заранее уточняйте, что приобретаемая модель их уже содержит.
Давайте проверим что содержится в памяти дисплея, попавшего в наши цепкие лапки. Особенно интересно, есть ли там русские буквы? Для этого напишем и запустим несложную программу, которая последовательно, по 16 штук, выведет на экран все символы, которые имеются в ПЗУ.
#include <Wire.h> #include <LiquidCrystal_I2C.h> // подключаем библиотеку #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif LiquidCrystal_I2C lcd(0x27, 16, 2); // запускаем библиотеку для дисплея с адресом 0x27, 16 символов, 2 строки void setup() { lcd.init(); // запускаем дисплей lcd.backlight(); // включаем подсветку lcd.clear(); } void loop() { // по кругу выводим все символы в памяти дисплея по 16 штук через 4 сек static byte i = 0; lcd.clear(); lcd.print("Codes 0x"); lcd.print(i, HEX); lcd.print("-0x"); lcd.print(i + 16, HEX); lcd.setCursor(0, 1); for (byte j = 0; j < 16; j++) { lcd.printByte(i + j); } i += 16; delay(4000); }
Затаив дыхание смотрим. Первые 16 символов - какая-то абракадабра. Так и должно быть, позже поймем почему. Смотрим дальше.
Уже лучше, пошли знакомые математические и пунктуационные знаки.
К ним добавились цифры, совсем хорошо.
Начались латинские буквы.
Пошли прописные латинские буквы.
С адреса 0x80 по 0xA0 пусто, поэтому пропускаем их. А вот дальше начинается самое интересное!
Это же родная кириллица, нам повезло с дисплеем! Только вот почему не хватает многих букв? Дело в том, что некоторые буквы русского алфавита не отличаются от латинских, такие как А, В, С, О и так далее, а если нет разницы, зачем прописывать их дважды? Используем латинские буквы в русских словах, никто ничего не заметит. Особо въедливый читатель, однако, спросит, а где же буквы Д, Ц, Ш, ф ц и щ? У них же нет латинского аналога. Это странно и где они, мы пока не знаем, смотрим дальше.
А вот и наши потеряшки! Не спрашивайте, почему их оторвали от коллектива, мы не знаем. Есть предположение, что будь они на месте, пришлось бы сдвигать другие ценные символы, например, кавычки, что недопустимо, ибо приведет к искажению стандарта, или программист просто вспомнил о них чуть позже.
Завершают дефиле дроби и совсем уж какая-то дичь, но за русские буквы мы готовы простить дисплею что угодно.
Теперь, просмотрев все содержимое знакогенератора, мы вооружились необходимыми знаниями и готовы печатать по-русски.
К великому сожалению, среда разработки Ардуино не поддерживает русские символы, а значит придется каждую букву прописывать в виде ее номера. Это усложняет задачу и утяжеляет чтение кода, но других вариантов пока нет. Итак, поприветствуем наш сайт с экрана русифицированного LCD 1602.
#include <Wire.h> #include <LiquidCrystal_I2C.h> // подключаем библиотеку #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif LiquidCrystal_I2C lcd(0x27, 16, 2); // запускаем библиотеку для дисплея с адресом 0x27, 16 символов, 2 строки void setup() { lcd.init(); // запускаем дисплей lcd.backlight(); // включаем подсветку lcd.clear(); lcd.printByte(0xA8); // П lcd.printByte(0x70); // р lcd.printByte(0xB8); // и lcd.printByte(0xB3); // в lcd.printByte(0x65); // е lcd.printByte(0xBF); // т lcd.print(", 3DIY! "); // дальше латиницей } void loop() {}
У нас опять все получилось! В качестве альтернативы можно использовать более компактную, но не легче читаемую форму записи русского текста в виде массива.
#include <Wire.h> #include <LiquidCrystal_I2C.h> // подключаем библиотеку #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif LiquidCrystal_I2C lcd(0x27, 16, 2); // запускаем библиотеку для дисплея с адресом 0x27, 16 символов, 2 строки void setup() { lcd.init(); // запускаем дисплей lcd.backlight(); // включаем подсветку lcd.clear(); byte tx[9] = {'K', 'a', 0xBA, ' ', 0xE3, 'e', 0xBB, 'a', '?'}; // "Как дела?" записываем в виде массива символов for (byte i = 0; i < 9; i++) lcd.printByte(tx[i]); // выводим на экран } void loop() {}
Работает и так, и эдак, каким именно способом страдать каждый выбирает сам. Скажем лишь, что второй компактнее не только в программе, но и в коде, а значит занимает меньше драгоценной памяти контроллера и выполняется быстрее. Теперь пришла пора ответить на вопрос: можно ли вывести на экран символ, которого нет в памяти дисплея? Можно, хоть и не очень просто. Для этого сперва надо нарисовать желаемый символ в виде матрицы точек размером 5х8. Давайте изобразим рожицу, которая нам улыбается и одновременно хитро подмигивает.
Запишем рисунок в виде массива бит, где 0 это светлая точка, а 1 - темная.
11011
00000
00100
00100
10001
01110
00000
Осталось придать этой матрице вид массива, залить этот массив в качестве символа в память дисплея и можно выводить его на экран как любой другой. Проиллюстрируем сказанное программой, где рожица будет записана в ячейку памяти 1 и выведена на экран в нескольких местах.
#include <Wire.h> #include <LiquidCrystal_I2C.h> // библиотека byte sd[8] = { // карта рожицы 0b00011, 0b11011, 0b00000, 0b00100, 0b00100, 0b10001, 0b01110, 0b00000, }; void setup() { LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем lcd.init(); lcd.createChar(1, sd); // создаем символ рожицы lcd.backlight(); // включаем подсветку lcd.clear(); // очищаем экран lcd.setCursor(0, 0); // курсор в верхний левый угол lcd.print("\1"); // рожица lcd.setCursor(0, 1); // курсор в нижний левый угол lcd.print("\1"); lcd.setCursor(15, 0); // курсор в верхний правый угол lcd.print("\1"); lcd.setCursor(15, 1); // курсор в нижний правый угол lcd.print("\1"); lcd.setCursor(6, 0); // курсор в верхний центр lcd.print("LCD"); lcd.setCursor(6, 1); // курсор в нижний центр lcd.print("1602"); } void loop() {}
Если теперь, не выключая дисплея, залить в него программу вывода всех символов на экран, в первой же странице мы увидим такую картину. Приглядевшись, можно заметить нашу рожицу на втором слева месте, то есть в ячейке с номером 1. Вот теперь стало понятно, что это за хаотичные символы. Это место под символы пользователя, которые могут быть сформированы программно. Но в отличие от всех остальных символов, дисплей про них забудет при первом же обесточивании, а значит, первое, что должна делать программа при запуске - записывать их в память дисплея снова.
Теоретически, таким образом можно решить проблему с отсутствующими русскими буквами, просто нарисовав их и записав в дисплей. Однако не у всех дисплеев хватит места на все недостающие буквы. Рожица на десятом месте намекает нам на то, что в данном дисплее всего 8 знакомест под программируемые символы. По неподтвержденным слухам, существуют дисплеи, позволяющие вмещать в себя до 32 символов, что уже достаточно для русификации хотя бы печатной части кириллицы, однако такие дисплеи нам пока не попадались.
На всякий случай разместим здесь набор кодировок русских печатных букв, взятого из открытых источников. Это поможет вам сэкономить время для реализации проекта с русифицированным дисплеем.
byte bukva_G[8] = {B11111,B10001,B10000,B10000,B10000,B10000,B10000,B00000,}; // Буква "Г"
byte bukva_D[8] = {B01111,B00101,B00101,B01001,B10001,B11111,B10001,B00000,}; // Буква "Д"
byte bukva_ZH[8] = {B10101,B10101,B10101,B11111,B10101,B10101,B10101,B00000,}; // Буква "Ж"
byte bukva_Z[8] = {B01110,B10001,B00001,B00010,B00001,B10001,B01110,B00000,}; // Буква "З"
byte bukva_I[8] = {B10001,B10011,B10011,B10101,B11001,B11001,B10001,B00000,}; // Буква "И"
byte bukva_IY[8] = {B01110,B00000,B10001,B10011,B10101,B11001,B10001,B00000,}; // Буква "Й"
byte bukva_L[8] = {B00011,B00111,B00101,B00101,B01101,B01001,B11001,B00000,}; // Буква "Л"
byte bukva_P[8] = {B11111,B10001,B10001,B10001,B10001,B10001,B10001,B00000,}; // Буква "П"
byte bukva_Y[8] = {B10001,B10001,B10001,B01010,B00100,B01000,B10000,B00000,}; // Буква "У"
byte bukva_F[8] = {B00100,B11111,B10101,B10101,B11111,B00100,B00100,B00000,}; // Буква "Ф"
byte bukva_TS[8] = {B10010,B10010,B10010,B10010,B10010,B10010,B11111,B00001,}; // Буква "Ц"
byte bukva_CH[8] = {B10001,B10001,B10001,B01111,B00001,B00001,B00001,B00000,}; // Буква "Ч"
byte bukva_Sh[8] = {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00000,}; // Буква "Ш"
byte bukva_Shch[8]= {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00001,}; // Буква "Щ"
byte bukva_Mz[8] = {B10000,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Ь"
byte bukva_IYI[8] = {B10001,B10001,B10001,B11001,B10101,B10101,B11001,B00000,}; // Буква "Ы"
byte bukva_Yu[8] = {B10010,B10101,B10101,B11101,B10101,B10101,B10010,B00000,}; // Буква "Ю"
byte bukva_Ya[8] = {B01111,B10001,B10001,B01111,B00101,B01001,B10001,B00000,}; // Буква "Я"
Выводы
Алфавитно-цифровые дисплеи, несмотря на почтенный возраст, остаются актуальными устройствами для визуализации информации в понятном человеку виде. Простые, надежные, недорогие и компактные LCD-дисплеи еще долго будут пользоваться заслуженным вниманием и уважением со стороны DIY-мастеров.
FAQ
Если нет возможности сделать короткие подписи на английском языке (обычно их понимает 90% пользователей), а также заменить дисплей на русифицированный, остается подбирать слова, максимально использующие латинские буквы, а радикально недостающие прописывать в пользовательские ячейки. Это процесс трудный, но творческий и интересный.
Можно отличить русифицированный дисплей по внешнему виду?
Нет, если производитель это специально не указал в маркировке. Обычно все они выглядят одинаково.
Можно ли самостоятельно прошить ПЗУ знакогенератора.
Теоретически можно, практически нет. Микросхемы дисплеев залиты компаундом- и неизвестно, какие они, и подобраться к ножкам для программирования было бы весьма непросто.
На глаза попадались внешне похожие дисплеи с маркировкой OLED, что это такое?
Это такие же дисплеи, только вместо ЖК матрицы в них установлена более современная OLED, которая намного ярче и контрастнее. Несомненным преимуществом является лучшая читаемость при ярком освещении, например на солнце. OLED дисплеи гораздо менее инертные, быстро сменяемое изображение не оставляет следов, хвостов и мешанины на экране. Из минусов - они склонны к выгоранию, а значит менее долговечны и цена примерно на порядок выше, чем у стандартных.
Как быстро LCD-дисплеи разряжают аккумулятор при автономной работе?
Львиная доля потребления энергии дисплея уходит на его подсветку. По возможности ее следует выключать, когда на дисплей никто не смотрит. Включение можно производить принудительно (например, кнопкой) или автоматически ( датчик движения, приближения и т.п.). Программно включение и выключение подсветки производится функциями .backlight() и .noBacklight().