Подключение дисплея 1602 к ардуино мега. Подключение LCD к плате Ардуино (Arduino). Операция чтения реализуется аналогично

Некоторое время лежал без дела вот такой дисплей.


И вот появилось желание прикрутить его к одному из проектов, можно, конечно, постараться найти библиотеку с готовыми функциями, но в таком случае картина, о том как работает дисплей, будет неполная, а нас это не устраивает. Один раз, разобравшись с принципом работы LCD дисплея, не составит большого труда написать свою библиотеку под нужный дисплей, если она отсутствуют или чем-то не устраивает.

Итак, начнём.
Первое что надо сделать - это найти распиновку, то есть какой контакт за что отвечает, второе - найти название контроллера, который управляет дисплеем, для этого скачиваем даташит на данный LCD и открываем его на первой странице.


Контакты считаются слева направо, первый отмечен красной стрелочкой. Напряжение питание равно 5 вольтам, управляющий контроллер S6A0069 или аналогичный, например, ks0066U .

Для чего мы искали название управляющего контроллера? Дело в том, что в даташите на дисплей есть временные задержки(timing diagram), описана система команд, но нет банальной инициализации, а без неё никуда.
Далее, открываем вторую страницу и видим таблицу, в которой написано какой контакт за, что отвечает.


DB7…DB0 – шина данных/адреса.

R/W - определяет что будем делать, считывать(R/W=1) или записывать(R/W=0)

R/S – определяет, что будем слать команду(RS=0) или данные(RS=1)

E – стробирующий вход, изменяя сигнал на этом входе мы разрешаем дисплею считывать/записывать данные.

LED± – управление подсветкой.

Надо сказать, что на доставшемся мне дисплее подсветка просто так не включится, для этого надо впаять резистор, обозначенный на плате как R7. Но пока она нам и не нужна.

Скачиваем даташит на управляющий контроллер и находим инструкцию по инициализации. Картинки можно увеличить, кликнув по ним.



Оказывается, таких инструкций целых две, для 8-битного и 4-битного режима. Что ж это за режимы такие? Данные режимы определяют по скольки проводкам будут передаваться данные: по четырём, либо по восьми. Давайте рассмотрим передачу по 4 проводам , в таком случае дисплей будет работать медленнее, но зато мы сэкономим 4 вывода микроконтроллера, да и реализация восьмибитного режима не намного отличается.

Схема подключения информационных выглядит следующим образом.


Контрастность можно регулировать включив потенциометр между выводами питания.

Хотелось бы обратить внимание, что во время инициализации R/S и R/W всегда равны нулю, то есть мы будем слать команды .

При инициализации можно настроить:

  • N - количество отображаемых строк
  • C - включить или выключить курсор
  • B - сделать курсор мигающим
  • I/D - увеличивать или уменьшать значение счётчика адреса
  • SH - двигать окошко дисплея
Два последние пункта рассмотрим подробнее.
На картинке ниже показано по какому адресу надо писать данные чтобы они отобразились в определённой позиции, например, если мы хотим вывести символ на первой позиции второй строки , то мы должны писать по адресу 0х40.


После этого значение счётчика автоматически изменится, либо увеличится, либо уменьшится, а вместе с ним изменится и положение курсора.

Кстати, память в которую мы пишем, называется DDRAM , все что мы запишем в эту память выведется на дисплей, ещё есть CGROM , в которой хранится таблица знакогенератора.


Эту таблицу нельзя изменить, но из неё можно брать уже готовые символы. Ещё один вид памяти это CGRAM , она то же представляет собой таблицу знакогенератора, но символы в этой таблице мы рисуем сами.


Теперь пару слов о движении экрана, дело в том что обычно на дисплее мы видим не всю DDRAM, а лишь определённую часть, как показано на картинке ниже.


В невидимую часть мы также можем писать, но то что мы запишем видно не будет, до тех пор, пока мы не подвинем на это место окошко экрана.

С теорией закончили переходим к практике.
Картина общения с LCD дисплеем в 4-битном режиме выглядит следующим образом.


Данные шлются байтами, но так, как у нас 4-битный режим, то для того чтобы отправить байт надо сделать 2 посылки, старшим битом вперёд. На картинке первая посылка обозначена D7(старшая тетрада), вторая D3(младшая тетрада). Перед следующей посылкой мы должны проверить флаг занятости и если он не установлен снова можно слать, если установлен ждём, пока контроллер, управляющий LCD закончит свои дела.

Имея общую картину посылки, давайте разберемся как реализовать операцию отправки.


Для отправки надо по 8-битной шине:
  • R/W установить в 0
  • выдаём код команды/данные в шину
  • задержка 2us
  • опускаем строб Е

Операция чтения реализуется аналогично:

  • убедиться, что управляющий контроллер свободен
  • R/W установить в 1
  • поднимаем строб E(в этот момент LCD выдаст данные в шину)
  • задержка 2us
  • читаем то что выдал LCD
  • опускаем строб Е
Откуда взялась задержка 2us?

Выше таймингов есть таблица в которой написано чему равны задержки изображённые на графике, так вот длительность стробирующего импульса - tw должна быть равна 230nS или 450nS в зависимости от напряжения питания, мы взяли чуть с запасом. Почему мы учли только эту задержку? Потому что значение остальных задержек очень мало.

Для отправки по 4-битной шине:

  • убедиться, что управляющий контроллер свободен
  • установить RS в 0(команда) или 1(данные), в зависимости оттого что будем слать
  • R/W установить в 0
  • поднимаем строб E(устанавливаем в 1)
  • выдаём старшую тетраду в шину
  • задержка 2us
  • опускаем строб Е
  • задержка 1us
  • поднимаем строб E(устанавливаем в 1)
  • выдаём младшую тетраду в шину
  • задержка 2us
  • опускаем строб Е

Для чтения по 4-битной шине:

  • убедиться, что управляющий контроллер свободен
  • порт данных на вход с подтяжкой
  • установить RS в 0(команда) или 1(данные), в зависимости оттого что будем читать
  • R/W установить в 1
  • поднимаем строб E(устанавливаем в 1)
  • задержка 2us
  • читаем старшую тетраду
  • опускаем строб Е
  • задержка 1us
  • поднимаем строб E(устанавливаем в 1)
  • задержка 2us
  • читаем младшую тетраду
  • опускаем строб Е

Поднятие строба и вывод команды/данных в шину, можно поменять местами. Теперь не составит труда инициализировать дисплей. Для упрощения инициализации, мы заменим чтение флага занятости задержкой, а работу с флагом рассмотрим позже.
Надо отметить, что при инициализации в 4-битном режиме используются 4-битные команды, а после инициализации 8-битная система команд, поэтому для инициализации мы реализуем отдельную функцию отправки команд void Write_Init_Command(uint8_t data) .
//Код инициализации для Atmega16 #define F_CPU 8000000UL #define LCD_PORT PORTA #define LCD_DDR DDRA #define LCD_PIN PINA #define DATA_BUS 0XF0 #define RS 0 #define RW 1 #define E 2 #include #include void Write_Init_Command(uint8_t data) { //ножки по которым передаются команды/данные на выход LCD_DDR |= DATA_BUS; //будем слать команду LCD_PORT &= ~(1<Весело мигающий курсор, свидетельствует о том, что инициализация прошла успешно. В

  • Модуль FC-113 сделан на базе микросхемы PCF8574T, которая представляет собой 8-битный сдвиговый регистр - «расширитель» входов-выходов для последовательной шины I2C. На рисунке микросхема обозначена DD1.
  • R1 - подстроечный резистор для регулировки контрастности ЖК дисплея.
  • Джампер J1 используется для включения подсветки дисплея.
  • Выводы 1…16 служат для подключения модуля к выводам LCD дисплея.
  • Контактные площадки А1…А3 нужны для изменения адреса I2C устройства. Запаивая соответствующие перемычки, можно менять адрес устройства. В таблице приведено соответствие адресов и перемычек: "0" соответствует разрыву цепи, "1" - установленной перемычке. По умолчанию все 3 перемычки разомкнуты и адрес устройства 0x27 .

2 Схема подключения ЖК дисплея к Arduino по протоколу I2C

Подключение модуля к Arduino осуществляется стандартно для шины I2C: вывод SDA модуля подключается к аналоговому порту A4, вывод SCL - к аналоговому порту A5 Ардуино. Питание модуля осуществляется напряжением +5 В от Arduino. Сам модуль соединяется выводами 1…16 с соответствующими выводами 1…16 на ЖК дисплее.


3 Библиотека для работы по протоколу I2C

Теперь нужна библиотека для работы с LCD по интерфейсу I2C. Можно воспользоваться, например, вот этой (ссылка в строке "Download Sample code and library").

Скачанный архив LiquidCrystal_I2Cv1-1.rar разархивируем в папку \libraries\ , которая находится в директории Arduino IDE.

Библиотека поддерживает набор стандартных функций для LCD экранов:

Функция Назначение
LiquidCrystal() создаёт переменную типа LiquidCrystal и принимает параметры подключения дисплея (номера выводов);
begin() инициализация LCD дисплея, задание параметров (кол-во строк и символов);
clear() очистка экрана и возврат курсора в начальную позицию;
home() возврат курсора в начальную позицию;
setCursor() установка курсора на заданную позицию;
write() выводит символ на ЖК экран;
print() выводит текст на ЖК экран;
cursor() показывает курсор, т.е. подчёркивание под местом следующего символа;
noCursor() прячет курсор;
blink() мигание курсора;
noBlink() отмена мигания;
noDisplay() выключение дисплея с сохранением всей отображаемой информации;
display() включение дисплея с сохранением всей отображаемой информации;
scrollDisplayLeft() прокрутка содержимого дисплея на 1 позицию влево;
scrollDisplayRight() прокрутка содержимого дисплея на 1 позицию вправо;
autoscroll() включение автопрокрутки;
noAutoscroll() выключение автопрокрутки;
leftToRight() задаёт направление текста слева направо;
rightToLeft() направление текста справа налево;
createChar() создаёт пользовательский символ для LCD-экрана.

4 Скетч для вывода текста на LCD экран по шине I2C

Откроем образец: Файл Образцы LiquidCrystal_I2C CustomChars и немного его переделаем. Выведем сообщение, в конце которого будет находиться мигающий символ. В комментариях к коду прокомментированы все нюансы скетча.

#include // подключаем библиотеку Wire #include // подключаем библиотеку ЖКИ #define printByte(args) write(args); // uint8_t heart = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; // битовая маска символа «сердце» LiquidCrystal_I2C lcd(0x27, 16, 2); // Задаём адрес 0x27 для LCD дисплея 16x2 void setup() { lcd.init(); // инициализация ЖК дисплея lcd.backlight(); // включение подсветки дисплея lcd.createChar(3, heart); // создаём символ «сердце» в 3 ячейке памяти lcd.home(); // ставим курсор в левый верхний угол, в позицию (0,0) lcd.!"); // печатаем строку текста lcd.setCursor(0, 1); // перевод курсора на строку 2, символ 1 lcd.print(" i "); // печатаем сообщение на строке 2 lcd.printByte(3); // печатаем символ «сердце», находящийся в 3-ей ячейке lcd.print(" Arduino "); } void loop() { // мигание последнего символа lcd.setCursor(13, 1); // перевод курсора на строку 2, символ 1 lcd.print("\t"); delay(500); lcd.setCursor(13, 1); // перевод курсора на строку 2, символ 1 lcd.print(" "); delay(500); }

Кстати, символы, записанные командой lcd.createChar(); , остаются в памяти дисплея даже после выключения питания, т.к. записываются в ПЗУ дисплея 1602.

5 Создание собственных символов для ЖК дисплея

Немного подробнее рассмотрим вопрос создания собственных символов для ЖК экранов. Каждый символ на экране состоит из 35-ти точек: 5 в ширину и 7 в высоту (+1 резервная строка для подчёркивания). В строке 6 приведённого скетча мы задаём массив из 7-ми чисел: {0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0} . Преобразуем 16-ричные числа в бинарные: {00000, 01010, 11111, 11111, 01110, 00100, 00000} . Эти числа - не что иное, как битовые маски для каждой из 7-ми строк символа, где "0" обозначают светлую точку, а "1" - тёмную. Например, символ сердца, заданный в виде битовой маски, будет выглядеть на экране так, как показано на рисунке.

6 Управление ЖК экраном по шине I2C

Загрузим скетч в Arduino. На экране появится заданная нами надпись с мигающим курсором в конце.


7 Что находится «за» шиной I2C

В качестве бонуса рассмотрим временную диаграмму вывода латинских символов "A", "B" и "С" на ЖК дисплей. Эти символы имеются в ПЗУ дисплея и выводятся на экран просто передачей дисплею их адреса. Диаграмма снята с выводов RS, RW, E, D4, D5, D6 и D7 дисплея, т.е. уже после преобразователя FC-113 «I2C параллельная шина». Можно сказать, что мы погружаемся немного «глубже» в «железо».


Временная диаграмма вывода латинских символов "A", "B" и "С" на LCD дисплей 1602

На диаграмме видно, что символы, которые имеются в ПЗУ дисплея (см. стр.11 даташита, ссылка ниже), передаются двумя полубайтами, первый из которых определяет номер столбца таблицы, а второй - номер строки. При этом данные «защёлкиваются» по фронту сигнала на линии E (Enable), а линия RS (Register select, выбор регистра) находится в состоянии логической единицы, что означает передачу данных. Низкое состояние линии RS означает передачу инструкций, что мы и видим перед передачей каждого символа. В данном случае передаётся код инструкции возврата каретки на позицию (0, 0) ЖК дисплея, о чём также можно узнать, изучив техническое описание дисплея.

И ещё один пример. На этой временной диаграмме показан вывод символа «Сердце» на ЖК дисплей.


Опять, первые два импульса Enable соответствуют инструкции Home() (0000 0010 2) - возврат каретки на позицию (0; 0), а вторые два - вывод на ЖК дисплей хранящийся в ячейке памяти 3 10 (0000 0011 2) символ «Сердце» (инструкция lcd.createChar(3, heart); скетча).

Иногда мы сталкиваемся с проблемой вывода различной информации из Arduino в окружающий мир. Зачастую, использование последовательного порта невозможно, неудобно и невыгодно.

Символьный дисплей является одним из самых простых и дешевых средств для вывода информации, потому что он имеет собственный микроконтроллер, в памяти которого хранятся закодированные символы. Такая система упрощает использование этих дисплеев, но в тоже время ограничивает их использование выводом только текстовой информации, в отличие от графических дисплеях.

В примере мы рассмотрим дисплей Winstar wh1602l1 – один из самых распространенных дисплеев на контроллере hd44780. Кроме того Вы можете подключать LCD 2004 и другие аналогичные.
Первые две цифры обозначают количество символов в строке, а вторые количество строк, таким образом, выбранный дисплей имеет 2 строки по 16 символов.
Данный способ подключения подразумевает занятие минимум 6 портов микроконтроллера Ардуино. В случае необходимости Вы можете подключить текстовый дисплей 1602 через I2C интерфейс (2 порта).

Из дополнительных элементов нам понадобиться переменный резистор, для управления контрастностью. В остальном все подключается по схеме, согласно даташиту и выбранных выходов Arduino в программе.

Выводы 15 и 16 на дисплее отвечают за подсветку, ее можно выключить или сделать автоматическую регулировку яркости при подключения фоторезистора к Arduino , как датчика яркости.

В нашем примере будем считывать данные из последовательного порта и выводить их на дисплей:

#include // Подключаем библиотеку работы с символьными дисплеями LiquidCrystal lcd(13, 11, 5, 4, 3, 2); // (RS, E, D4, D5, D6, D7) подключаем выходы дисплея согласно последовательности, R/W – GND, так как мы будем записывать данные в дисплей, а не считывать void setup() { lcd.begin(16, 2); // Инициализируем LCD 1602 // lcd.begin(20, 4); // Инициализируем LCD 2004 Serial.begin(9600); // Запускаем последовательный порт } void loop() { if (Serial.available()) // Если из порта поступаю данные, то... { delay(100); lcd.clear(); // Полностью очищаем экран while (Serial.available() > 0) // Если из порта поступаю данные больше 0, то... { lcd.write(Serial.read()); // Считываем значения из serial порта и выводим их на дисплей } } }

Вы можете усложнить код и вывести часы реального времени DS1307 на Arduino на Ваш LCD1602.

Теперь по подробнее рассмотрим все функции в библиотеке LiquidCrystal:

Первое и самое главное, что с помощью этой библиотеки нельзя выводить русские буквы, даже если дисплей имеет в памяти эти символы. Эта проблема решается или другими библиотеками, или записью значений при помощи 16-ричного кода.

lcd.print(); - самая простая и часто используемая, используется для вывода информации.

lcd . clear (); - используется для очистки дисплея.

lcd.setCursor(x , y ); - ставит курсор на определенное место.

Х – изменение позиции в строке

Y – изменение строки

Например, lcd.setCursor(0, 0); это верхняя левая ячейка.

lcd.home(); - ставит курсор в позицию 0, 0

lcd.home(); = lcd.setCursor(0, 0);

lcd . scrollDisplayLeft (); - сдвиг влево

lcd . scrollDisplayRight (); - сдвиг вправо

Lcd.createChar(имя , массив ); - создание собственного знака.

Например знак градуса выглядит вот так:

Celc = {B00111, B00101, B00111, B00000, B00000, B00000, B00000, B00000 };

В уроке поговорим о знакосинтезирующих жидкокристаллических индикаторах, о подключении их к плате Ардуино и управлении индикаторами с помощью библиотек LiquidCrystal и LiquidCrystalRus.

Светодиодные семисегментные индикаторы хотя и являются самым дешевым вариантом индикации для электронных устройств, но их применение ограничено двумя существенными недостатками.

  • Практически сложно подключить к микроконтроллеру более 8ми разрядов светодиодных индикаторов. Требуется большое число выводов, значительные токи индикаторов, сложные ключи, низкая частота регенерации и т.п.
  • Невозможно отображать на семисегментных индикаторах символьную информацию.

Для вывода текстовой информации или чисел размером более 4 разряда гораздо практичнее использовать жидкокристаллические знакосинтезирующие индикаторы (дисплеи). К их достоинствам следует отнести:

  • удобный для подключения к микроконтроллерам интерфейс;
  • малая потребляемая мощность;
  • низкое напряжение питания;
  • долговечность.

На рынке существует большое число разнообразных жидкокристаллических (LCD) индикаторов разных производителей. Практически все они аналогичны по параметрам, сигналам интерфейсов, командам управления. В данный момент наиболее распространенными ЖК индикаторами на российском рынке являются устройства производства компании Winstar, Тайвань. Я буду ссылаться на индикаторы этой фирмы. Но информация вполне применима и для символьных LCD дисплеев других производителей.

Общие сведения.

Знакосинтезирующие или символьные индикаторы отображают информацию в виде знакомест определенной разрядности. Одно знакоместо отображает один символ. Количество знакомест определяет разрядность индикатора. Информация на индикаторах может выводиться на нескольких строках, поэтому для индикаторов такого типа всегда указывается число символов в строке и число строк.

Отображение информации происходит на жидкокристаллической матрице со светодиодной подсветкой. Подсветка бывает самых разных цветов, что значительно оживляет монохромную текстовую информацию.

Для управления жидкокристаллической матрицей и организации интерфейса индикатора используется встроенный контроллер HD44780 или его полные аналоги. Этот контроллер определяет сигналы интерфейса индикатора и команды управления.

HD44780 стал де-факто стандартом для символьных жидкокристаллических (LCD) дисплеев. Техническую документацию по контроллеру HD44780 в формате PDF можно посмотреть по этой ссылке - . Может кому-то больше понравится документация одного из аналогов этого контроллера – SPLC780D. Ссылка в формате PDF – .

Символьные LCD индикаторы фирмы Winstar.

Мне известны следующие варианты ЖК индикаторов этой фирмы.

Тип индикатора Формат отображения, символов x строк Габариты, мм Размеры видимой области, мм Ссылка на документацию, формат PDF
WH0802A1 8 x 2 58 x 32 38 x 16
WH1202A 12 x 2 55,7 x 32 46 x 14,5
WH1601A 16 x 1 80 x 36 66 x 16
WH1601B 16 x 1 85 x 28 66 x 16
WH1601L 16 x 1 122 x 33 99 x 13
WH1602A 16 x 2 84 x 44 66 x 16
WH1602B 16 x 2 80 x 36 66 x 16
WH1602C 16 x 2 80 x 36 66 x 16
WH1602D 16 x 2 85 x 30 66 x 16
WH1602J 16 x 2 80 x 36 66 x 16
WH1602L1 16 x 2 122 x 44 99 x 24
WH1602M 16 x 2 85 x 32,6 66 x 16
WH1602O 16 x 2 85 x 25,2 66 x 16
WH1602P 16 x 2 85 x 25,2 66 x 16
WH1602S 16 x 2 59 x 29,3 52 x 15
WH1602T 16 x 2 65,4 x 28,2 54,8 x 19
WH1602W 16 x 2 80 x 36 66 x 16
WH1602V2 16 x 2 66,7 x 23,3 61 x 15,9
WH1604A 16 x 4 87 x 60 62 x 26
WH1604B 16 x 4 70,6 x 60 60 x 32,6
WH2002A 20 x 2 116 x 37 85 x 18,6
WH2002D 20 x 2 89 x 21,5 75 x 15
WH2002L 20 x 2 180 x 40 149 x 23
WH2002M 20 x 2 146 x 43 123 x 23
WH2004A 20 x 4 98 x 60 77 x 25,2
WH2004B 20 x 4 98 x 60 77 x 25,2
WH2004D 20 x 4 77 x 47 60 x 22
WH2004G 20 x 4 87 x 58 74,4 x 24,8
WH2004H 20 x 4 87 x 58 74,4 x 24,8
WH2004L 20 x 4 146 x 62,5 123,5 x 43
WH2402A 24 x 2 118 x 36 94,5 x 16
WH4002A 40 x 2 182 x 33,5 154,4 x 16,5
WH4004A 40 x 4 190 x 54 147 x 29,5

Подключение LCD индикатора к микроконтроллеру.

Схемы подключения, временные диаграммы, параметры сигналов, команды управления, коды символов подробно расписаны в документации на контроллер HD44780. Я приведу только самые необходимые данные о подключении индикаторов к микроконтроллерам.

Как правило, LCD индикаторы имеют 16 выводов.

Номер вывода Сигнал I - вход O - выход Назначение сигнала
1 Vss - Земля (общий провод)
2 Vdd - Питание + 5 В
3 Vo - Управление контрастностью дисплея. Вход для подключения среднего вывода делителя напряжения + 5 В. Можно использовать подстроечный резистор сопротивлением 10-20 кОм.
4 RS I Выбор регистра: 0 – регистр команд; 1 – регистр данных. Низкий уровень сигнала означает, что на шине данных сформирована команда, высокий уровень – на шине данные.
5 R/W I Направление передачи данных:

0 – запись;

1 – чтение.

Во многих приложениях функция чтения не используется, поэтому сигнал часто подключается к земле.

6 E I Строб операции шины (по отрицательному фронту).
7 DB0 I/O Младшие биты восьми битного режима. При четырех битном интерфейсе не используются.
8 DB1 I/O
9 DB2 I/O
10 DB3 I/O
11 DB4 I/O Старшие биты восьми битного режима или биты данных четырех битного интерфейса.
12 DB5 I/O
13 DB6 I/O
14 DB7 I/O
15 A - Анод питания подсветки (+).
16 K - Катод питания подсветки (-). Ток должен быть ограничен.

Номер вывода (первый столбец) приведен для наиболее распространенного варианта. Лучше проверьте, загрузив документацию на Ваш тип индикатора из таблицы предыдущего раздела.

Символьные ЖК дисплеи поддерживают два варианта подключения к микроконтроллеру:

  • С использованием 8ми битной шины данных. Подключаются все сигналы шины DB0-DB7. За один цикл обмена передается байт информации.
  • С применением 4х битной шины данных. Подключаются только 4 старшие разряда DB4-DB7. Информация передается по четыре бита за один такт шины.

Первый вариант обеспечивает передачу данных на дисплей с большей скоростью. Второй – требует для подключения индикатора на 4 вывода меньше. Несомненно, важнее сократить число выводов для подключения, чем увеличить скорость обмена. Тем более, что LCD индикаторы довольно медленные устройства со временем цикла регенерации 10-20 мс.

Подключение символьного ЖК (LCD) дисплея к плате Ардуино.

Я буду подключать индикатор WH2004A (4 строки по 20 символов) в четырех битном режиме обмена к плате Arduino UNO R3. Документацию на LCD дисплей WH2004 можете посмотреть по этой ссылке .

Схема выглядит так.

Резисторы R2 и R3 определяют контрастность индикатора. Можете подключить подстроечный резистор и установить необходимую четкость изображения. Я часто использую индикаторы WH2004, и в своих схемах выбираю такие номиналы резисторов.

Светодиоды подсветки индикатора я подключил к источнику питания 5 В через резистор R1 (30 Ом). Этим я задал ток порядка 25 мА. Тускло, но светится. В темноте видно хорошо. Хотя индикаторы WH2004 допускают ток подсветки до 580 мА.

Библиотека для управления LCD индикаторами в системе Ардуино LiquidCrystal.

Существует стандартная библиотека для управления ЖК индикаторами на базе контроллера HD44780. Подробно опишу ее методы.

LiquidCristal(…)

Конструктор класса. Может иметь разное число аргументов.

  • LiquidCristal(rs, en, d4, d5, d6, d7) – четырех битный интерфейс, сигнал RW не используется (подключен к земле).
  • LiquidCristal(rs,rw, en, d4, d5, d6, d7) – четырех битный интерфейс, сигнал RW используется.
  • LiquidCristal(rs, en, d0, d1, d2, d3, d4, d5, d6, d7) – восьми битный интерфейс, сигнал RW не используется (подключен к земле).
  • LiquidCristal(rs, rw, en, d0, d1, d2, d3, d4, d5, d6, d7) – восьми битный интерфейс, сигнал RW используется.

Аргументы:

  • rs – номер вывода сигнала RS;
  • rw – номер вывода сигнала RW;
  • en – номер вывода сигнала E;
  • d0, d1, d2, d3, d4, d5, d6, d7 – номера выводов шины данных.

LiquidCrystal disp(6, 7, 2, 3, 4, 5);

void begin(cols, rows)

Инициализирует интерфейс индикатора. Задает размерность индикатора. Метод должен быть вызван первым, до использования других функций класса.

Аргументы:

  • cols – количество символов в строке;
  • rows – число строк.

disp.begin(20, 4); // используем дисплей – 4 строки по 20 символов

void clear()

Очистка экрана, установка курсора в верхний левый угол.

disp.clear(); // сброс дисплея

void home()

Установка курсора в верхний левый угол.

disp.home(); // в начало экрана

void setCursor(col, row)

Устанавливает курсор в заданную позицию.

  • col – координата X, нумерация с 0;
  • row – координата Y, нумерация с 0.

setCursor(0,1); // курсор в начало второй строки

byte write(data)

Выводит символ на экран. Возвращает количество переданных байтов.

Следующий скетч выводит на экран данные с последовательного порта. Данные можно передать монитором порта Arduino IDE.

// вывод данных последовательного порта на LCD индикатор
#include


char data;

void setup()
{
Serial.begin(9600); // инициализируем последовательны порт
disp.begin(20, 4); //
}

void loop()
{
if (Serial.available()) { // если есть данные
data= Serial.read(); // читаем символ
if((data != 0xd) && (data != 0xa)) { // перевод строки
disp.write(data); // выводим символ на экран
}
}
}

У меня индикатор большой – 4 строки по 20 символов. В нем установлены два контроллера HD44780. Поэтому последовательно передаваемые символы заполняют сначала первую строку, затем третью, дальше вторую и четвертую. Т.е. через строку. Надо учитывать это свойство для определенных типов индикаторов. В документации на каждый LCD индикатор указывается последовательность адресации символов.

byte print(data)

Выводит на экран текст. Возвращает количество переданных байтов.

Функция имеет различные формы вызова для разных форматов и типов данных.

print(char d) Если аргумент типа char выводит код символа

char d= 83;
disp.print(d); // выводит символ S
disp.print(‘S’); // выводит символ S

print(int d) Если аргумент – целый тип, то выводит строку с десятичным представлением числа

int d= 83;
disp.print(d); // выводит строку “83”
disp.print(83); // выводит строку “83”

print(float) Вещественные типы выводятся символами ASCII, два знака после запятой

float d= 7.65432;
disp.print(d); // выводит строку “7.65”
disp.print(7.65432); // выводит строку “7.65”

print(* str) Если аргумент указатель на строку, то выводится текстовая строка.

char letters= {65, 66, 67};
disp.print(“Letters”); // выводит строку “Letters”
disp.print(letters); // выводит строку из 3 символов с кодами 65, 66, 67

print(int d, DEC) Выводит строку ASCII - десятичное представление числа

int d= 83;
disp.print(d, DEC); // вывод строку “83”

print(int d, HEX) Выводит строку ASCII – шестнадцатиричное представление числа

int d= 83;
disp.print(d, HEX); // вывод строку “53”

print(int d, OCT) Выводит строку ASCII – восьмеричное представление числа

int d= 83;
disp.print(d, OCT); // вывод строку “123”

print(int d, BIN) Выводит строку ASCII – двоичное представление числа

int d= 83;
disp.print(d, BIN); // вывод строку “01010011”

print(float d, N) Для вещественных чисел параметр N задает количество цифр после запятой.

disp.print(7.65432, 0); // выводит строку “7”
disp.print(7.65432, 2); // выводит строку “7.65”
disp.print(7.65432, 4); // выводит строку “7.6543”

Пример программы, печатающей на дисплее текстовую строку.

// вывод текстовой строки на LCD индикатор
#include

LiquidCrystal disp(6, 7, 2, 3, 4, 5); // создаем объект

void setup()
{
disp.begin(20, 4); // инициализируем дисплей 4 строки по 20 символов
disp.print("Test string");
}

void loop()
{ }

void cursor()

Включает режим отображения курсора. Позиция, куда будет выведен следующий символ, подчеркивается.

disp.cursor(); // разрешаем отображение курсора

void noCursor()

Запрещает отображение курсора.

disp.noCursor(); // запрещаем отображение курсора

void blink()

Включает режим мигающего курсора. Используется совместно с функцией cursor(). Результат зависит от конкретной модели индикатора.

disp.blink(); // разрешаем мигающий курсор

void noBlink()

Отключает режим мигающего курсора.

disp.noBlink(); // запрещаем мигающий курсор

void display()

Включает экран после того, как он был выключен функцией noDisplay(). На экране отобразится информация, которая была до выключения.

disp.display(); // включаем дисплей

void noDisplay()

Выключает экран. Информация сохраняется в памяти и появляется при включении дисплея.

disp.noDisplay(); // выключаем дисплей

void scrollDisplayLeft()

Прокручивает содержимое дисплея на один символ влево.

disp. scrollDisplayLeft(); // сдвигаем все влево

void scrollDisplayRight()

Прокручивает содержимое дисплея на один символ вправо.

disp. scrollDisplayRight(); // сдвигаем все вправо

void autoscroll()

Включение режима автоматической прокрутки текста. При выводе каждого символа, весь текст на экране будет сдвигаться на один символ. В какую сторону сдвигается информация определяют функции leftToRight() и rightToLeft().

disp. autoscroll()(); // включаем автопрокрутку

void noAutoscroll()

Выключение автоматической прокрутки текста.

disp. noAutoscroll()(); // запрещаем автопрокрутку

void leftToRight()

Задает режим вывода теста слева-направо. Новые символы будут появляться справа от предыдущих.

leftToRight(); // режим слева-направо

void rightToLeft()

Задает режим вывода теста справа-налево. Новые символы будут появляться слева от предыдущих.

rightToLeft(); // режим справа-налево

void createChar(num, data)

Метод для создания пользовательского символа. Контроллер допускает создание до 8 символов (0…7) размером 5x8 пикселей. Изображение символа задается массивом размерностью 8 байт. 5 младших битов каждого байта определяют состояние пикселей строки.

Для вывода пользовательского символа можно использовать функцию write() с номером символа.

// создание пользовательского символа
#include

LiquidCrystal disp(6, 7, 2, 3, 4, 5); // создаем объект

byte smile = {
B00000000,
B00010001,
B00000000,
B00000000,
B00010001,
B00001110,
B00000000,
B00000000
};

void setup()
{
disp.createChar(0, smile); // создаем символ
disp.begin(20, 4); // инициализируем дисплей 4 строки по 20 символов
disp.print("Smile ");
disp.write(byte(0)); // выводим символ
}

void loop()
{ }

Вот пример программы, выводящей на экран русский алфавит.

// вывод русского алфавита
#include

LiquidCrystalRus disp(6, 7, 2, 3, 4, 5); // создаем объект

void setup()
{
disp.begin(20, 4); // инициализируем дисплей 4 строки по 20 символов
disp.print("абвгдеёжзийклмнопрст");
disp.print("АБВГДЕЁЖЗИЙКЛМНОПРСТ");
disp.print("уфхцчшщьыьэюя ");
disp.print("УФХЦЧШЩЫЬЭЮЯ ");
}

void loop()
{ }

Жидкокристаллический дисплей (LCD) мод. 1602 (даташит) - отличный выбор для ваших проектов.

Первое, что радует - низкая цена. Второе - наличие готовых библиотек под Arduino. Третье - наличие нескольких модификаций, которые в том числе идут с различными подсветками (голубая, зеленая). В этой статье рассмотрим основы подключения данного дисплея к Arduino и приведем пример небольшого проекта для отображения уровня освещенности на дисплее с использованием фоторезистора.

Контакты и схема подключения LCD 1602 к Arduino

Контакты на этом дисплее пронумерованы от 1 до 16. Нанесены они на задней части платы. Как именно они подключаются к Arduino, показано в таблице ниже.

Табл. 1. Подключение контактов LCD 1620 к Arduino

Подключение 1602 к ArduinoЕсли дисплей 1602 питается от Arduino через 5-ти вольтовой USB-кабель и соответствующий пин, для контакта контраста дисплея (3-й коннектор – Contrast) можно использовать номинал 2 кОм. Для Back LED+ контакта можно использовать резистор на 100 Ом. Можно использовать и переменный резистор – потенциометр для настройки контраста вручную.

На основании таблицы 1 и схемы, приведенной ниже, подключите ваш жидкокристаллический дисплей к Arduino. Для подключения вам понадобится набор проводников. Желательно использовать разноцветные проводники, чтобы не запутаться.

Табл. 2. Предпочтительные цвета проводников

Схема подключения LCD дисплея 1602 к Arduino:


Базовый пример программы для работы LCD 1602 с Arduino

В примере используются 0, 1, 2, 3, 4, и 5 пины Arduino для подключения соответствующих пинов 4, 6, 11, 12, 13 и 14 с дисплея 1602 (смотри табл. 1). После этого в коде для Arduino мы инициализируем lcd() следующим образом:

LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

Этот кусок кода объясняет Arduino, как именно подключен LCD дисплей.

Весь соурс файл проекта метеостанции, в которой используется дисплей LCD 1602 можно скачать по этой ссылке .

LCD 1602A, Arduino и датчик освещенности (фоторезистор)

В примере мы рассмотрим подключение модификации дисплея - 1602A и фоторезистора. В результате данного проекты мы сможем отображать на дисплее числовые значения, пропорциональные интенсивности освещения.


Данный пример будет хорошим стартом для начинающих разбираться с Arduino. Стоит обратить внимание, что у дисплея 1602 существуют различные модификации. Соответственно, расположение контактов на них могут несколько отличаться.

Необходимые материалы

  • 1 Arduino UNO;
  • 1 макетная плата (63 рельсы);
  • 1 датчик освещенности (фоторезистор);
  • 1 потенциометр на 50 кОм;
  • 1 LCD дисплей 1602A;
  • 1 резистор на 10кОм;
  • 1 рельса коннекторов (на 16 пинов);
  • 1 USB кабель.

LCD Дисплей 1602A

Дисплеи, как правило, продаются без распаянных коннекторов. То есть, паяльник в руках придется подержать. Вам понадобится 16 пинов. Запаивайте со стороны коротких ног, длинные оставляйте для дальнейшего подключения к плате или другим периферийным устройствам.

После распайки можете устанавливать дисплей на макетной плате. Желательно, на самой нижней дорожке, чтобы у вас осталась возможность соединять дисплей через дополнительные коннекторы с платой.

Подключение дисплея 1602A к Arduino

Первое что необходим о – запитать дисплей. Подключите два кабеля от +5 вольт и земли к соответствующим рядам плюс-минус на макетной плате.

Подключите: пин на 5 вольт (5V) с Arduino к одной из дорожек макетной платы.

Подключите: пин Земля (GND) Arduino к другой дорожек (макетной платы).

После этого подключаем питание экрана и его подсветку к дорожкам, на макетной плате, на которых у нас получается 5 вольт и минус.

Подключите: дорожку GND (минус) на макетной плате к 1 пину на LCD экране (он обозначен как VSS).

Подключите: дорожку 5 вольт (плюс) на макетной плате ко 2 пину на LCD экране (он обозначен как VDD).

Подключите: дорожку 5 вольт (плюс) на макетной плате к 15 пину на LCD экране (он обозначен как A).

Подключите: дорожку GND (минус) на макетной плате к 16 пину на LCD экране (он обозначен как K).

Подключаем нашу Arduino к персональному компьютеру через USB-кабель и вуаля! Экран должен включиться.

Следующий шаг – подключение потенциометра для регулировки контрастности дисплея. В большинстве гайдов, используется потенциометр на 10 кОм, но 50 кОм тоже подойдет. Из-за большего диапазона значений сопротивлений на выходе потенциометра, более точная настройка становится сложнее, но для нас в данном случае это не критично. Установите потенциометр на макетной плате и подключите три его пина.

Подключите: первый пин на потенциометре к минусу на макетке.

Подключите: средний пин потенциометра к 3 пину на дисплее (он обозначен как V0).

Подключите: третий пин на потенциометре к плюсу на макетке.

После подачи питания на плату через USB-кабель, на дисплее первый ряд должен заполниться прямоугольниками. Если вы их не увидели, немного проверните ручку потенциометра слева направо, чтобы отрегулировать контраст. В дальнейшем, когда мы будем отображать числовые значения на экране, вы сможете более точно отрегулировать контрастность. Если ваш дисплей выглядит примерно так, вы все делаете верно:

Продолжим. Теперь нам надо обеспечить обмен данными между Arduino и LCD дисплеем 1602A для отображения символов.

Для этого подключите 4 пин дисплея (RS) к 7 пину Arduino (желтый коннектор). 5 пин дисплея (RW) – к ряду пинов земля на макетке (черный кабель).

6 пин дисплея (E) – к 8 пину Arduino (ШИМ).

11 пин дисплея (D4) – к 9 пину Arduino (ШИМ).

12 пин дисплея (D5) – к 10 пину Arduino (ШИМ).

13 пин дисплея (D6) – к 11 пину Arduino (ШИМ).

14 пин дисплея (D7) – к 12 пину Arduino (ШИМ).

Программа для Arduino IDE – отображение надписи на дисплее 1602A

Представленный ниже кусок кода достаточно скопипастить в Arduino IDE и загрузить на плату:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

lcd.begin(16, 2);

lcd.setCursor(0,1);

lcd.write("LIGHT: ");

После загрузки программы на плату, на дисплее во второй строке отобразится следующая надпись:

Своеобразный "hello world!" на LCD 1602A запущен. Я вас поздравляю.

Подключаем фоторезистор и заливаем всю программу в Arduino

Теперь подключим фоторезистор. Подключите три провода к свободным рельсам на макетной плате (условно пронумеруем их 1, 2, 3). Оставьте в рельсах немного места для самого датчика освещенности и резистора.

Рельсу GND с макетной платы подключаем к рельсе 1. A0 (аналоговый вход) с Arduino - к рельсе 2. 5 вольт с макетной платы - к рельсе 3.

Дальше подключаем наш датчик и резистор к подготовленным рельсам. Какие именно ноги идут к земле, а какие - к питанию для нашего датчика освещенности и резистора неважно (в отличие от, например, светодиода, в котором есть катод и анод). Так что тут не перепутаете.

Датчик освещенности подключаем к рельсе 1 и рельсе 2. Резистор – к рельсе 2 и к рельсе 3.

Теперь вернемся к нашей программе и добавим несколько строк в пустующее пока что тело функции loop():

int sensorValue = analogRead(A0);

lcd.setCursor(7,1);

lcd.print(sensorValue);

После заливки на Arduino окончательной версии нашей программы, на дисплее будут отображаться текущие значения уровня освещенности.



Что еще почитать