Как подключить lcd дисплей к ардуино без i2c
Перейти к содержимому

Как подключить lcd дисплей к ардуино без i2c

  • автор:

Подключение к Аrduino дисплея LCD 1602 i2c

Рассмотрим, как подключить модуль дисплея LCD 1602 к плате Arduino и рассмотрим основные команды инициализации и управления жидкокристаллическим дисплеем. Разберем основные функции библиотеки LiquidCrystal_I2C.h для вывода текстовой информации на экран, которые вы можете использовать в своих различных проектах, так как этот модуль позволяет визуально отображать данные от датчиков и сенсоров.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • экран lcd 1602 arduino
  • экран lcd 1602 с i2c модулем
  • коннекторы
  • скачать библиотеку LiquidCrystal_I2C.h

Текстовый дисплей используется для отображения информации с датчиков, создания меню или подсказок. На экране lcd 1602 отображаются черные символы размером 5×8 пикселей. Встроенная подсветка включается при подаче питания на контакты модуля. Текстовый дисплей без модуля i2c подключается к микроконтроллеру Ардуино через 8 контактов. Пример подключения lcd с i2c модулем показан на изображении ниже.

LCD 1602 i2c Arduino распиновка, характеристики

LCD 1602 i2c Arduino распиновка, характеристики

Характеристики LCD 1602 i2c (datasheet)

  • Напряжение питания: 5 В
  • Количество строк: 2
  • Количество символов в строке: 16
  • Общее количество символов: 32
  • Диапазон рабочих температур: 0 — +60º C

По умолчанию жк дисплей с модулем I2C имеет адрес «0x27«. Если необходимо подключить к микроконтроллеру более одного дисплея 1602, необходимо изменить адреса устройств. Если вы перевернете дисплей и посмотрите на модуль IIC, вы увидите контакты, обозначенные «A0», «A1» и «A2». Если по умолчанию модуль имеет адрес «0x27» на шине IIC Arduino, то замыкание перемычки «A0» изменит адрес устройства на «0x26«.

Как подключить LCD 1602 к Ардуино по i2c

Как подключить LCD 1602 к Ардуино с модулем i2c

LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

ЖК дисплей 1602 i2c подключается к плате Ардуино всего 4 проводами — 2 провода для обмена данными и 2 провода питания. Подключение дисплея QAPASS 1602a к Arduino осуществляется стандартным для шины i2c способом: вывод SDA подключается к порту A4 (SDA), вывод SCL — к порту A5 (SCL). Питание дисплея осуществляется от 5 Вольт. Подробная схема подключения дисплея 1602 приведена на изображении выше.

Скетч для дисплея LCD 1602 i2c Arduino

Как подключить два экрана LCD 1602 iic к Ардуино

Как подключить два экрана LCD 1602 к Ардуино

Перед загрузкой следующей программы сначала соберите схему с двумя ЖК дисплеями 1602a и просканируйте шину i2c Arduino Uno. Это гарантирует, что микроконтроллер «увидит» оба устройства на шине. Также проверьте правильность адресов. После этого вы можете загрузить следующую программу, которая позволит вам управлять сразу двумя жк дисплеями с помощью модулей i2c от микроконтроллера Arduino.

Скетч для двух дисплеев LCD 1602 iic Arduino

Как подключить display LCD 1602 без модуля iic

Как подключить display LCD 1602 без модуля iic

Жидкокристаллический дисплей имеет два ряда по 16 символов, отсюда и название LCD 1602. Память устройства содержит 192 символа, при этом 8 дополнительных символов могут быть заданы пользователем. Если вы подключите дисплей без модуля IIC, вам потребуется использовать 6 портов общего назначения на плате, не считая портов питания. Соберите схему, как на картинке выше и загрузите в плату следующую программу.

Скетч display LCD 1602 Arduino без модуля iic

Заключение. В простой схеме подключения устройств по протоколу I²C может быть несколько ведомых устройств и одно ведущее устройство, которое инициирует передачу данных и синхронизирует сигнал. Используя примеры программ для платы Ардуино и жк экрана лсд 1602, представленные в этой статье, и схему подключения lcd 1602 к Arduino по i2c, вы сможете использовать этот модуль в своих будущих проектах на Arduino.

LCD Module: Connection to Arduino Board With and Without an I2C Module

IMG_9485

The LCD module can be connected to an Arduino board in two ways:

  1. Direct connection from the LCD module to the Arduino board (No I2C/IIC)
  2. LCD Module and Arduino board connected through an I2C Module

DIRECT CONNECTION

IMG_9486

Components needed for direct connection:

  1. Arduino Nano + USB connector (Although most Arduino boards can be used as well)
  2. LCD Module (we will be using the 1602 module – 16 characters per row, 2 rows)
  3. Rotary potentiometer (we will be using a 10K-ohm potentiometer)
  4. Lots of jumper wires (I am using 16 jumper wires)

LCD BARE 1602 - with Label

For us to be able to connect the module to an Arduino board, we need to study first the pins of the LCD module. The image below shows the pinout of for the LCD Module (1602):

Pin labels

Usually, the module’s pins are labeled 1 (leftmost pin) and 16 (rightmost pin). This gives us the order of the pins from 1 – 16. To better clarify the pin labeling, please see below:

LCD1602 NOIIC

We take a look at the schematics for this experiment:

LCD_ARDUINO_CONNECTION_TABLE

Table below explains the connections among these components:

The potentiometer has to be powered as well, so connect its VCC and GND pins to the +5V and GND pins respectively of the Arduino board of your choice (refer to the schematics for the VCC and GND pins).

IMG_9488

Set the needed components up to the breadboard, and the setup should similarly look like the image shown below:

Connect the Arduino board to the PC via a USB connector (usually supplied with your board when you buy one). We are now ready to upload some example sketches to our Arduino board. Luckily, the Arduino IDE has a built-in ready example for our set up. The first part of the sketch explains the pin connections from the LCD module to the Arduino board, and this matches our schematics.

Sample for Manual

Open an example sketch for the LCD. In this experiment, we will use the HelloWorld sketch:

HelloWorld

You should see something like this:

Board configuration

As said previously, the first part of the sketch explains the pin connection of the LCD module to the Arduino board. The next thing to do is to upload this sketch to the Arduino board. However, before that, we need to check if were have selected the right board, the and the right COM where the Arduino is connected to (for other boards, please select the right configurations as required by the board):

Upload

We are now ready to upload this example sketch. To upload this sketch, the shortcut CTRL + U can be used. Uploading sketches can also be done by going to Sketch > Upload in the menu, or click the arrow (pointing rightward), just below the menus:

IMG_9489.jpg

After uploading the sketch, you should be seeing something like this in your LCD:

IMPORTANT: If you are not seeing anything (or maybe only white blocks) in the LCD screen, then you might want trying to adjust the contrast of the display via the potentiometer. Turn it left or right until the output can be seen in the display.

VIA THE I2C (IIC) MODULE

IMG_9491

Components needed for direct connection:

  1. Arduino Nano + USB connector (Although most Arduino boards can be used as well)
  2. LCD Module (we will be using the 1602 module – 16 characters per row, 2 rows)
  3. I2C (IIC) module (If your have the I2C module already soldered to the LCD module, the better)
  4. Few of jumper wires (I am ONLY using 4 jumper wires!)

LCD1602_IIC

The schematics shows the connection between the LCD Module and the I2C module. We connect the I2C module to the Arduino board, using only 4 wires. Let’s look at the schematic below.:

LCD and I2C Connection

Connect the VCC pin of the I2C module to 5V pin (VCC) of the Arduino board. The GND pin of the I2C module should be connected to the GND pin of the Arduino board. SDA and SCL pins of the I2C modules should be connected to A4 and A5 pins of the Arduino board respectively:

IMG_9492

Some LCD modules already have the I2C module attached to them (soldered). This is actually better, as we don’t need a breadboard to connect the modules together. In our experiment, we will assume that the I2C module isn’t soldered to the LCD module. If the schematics above is followed correctly, the setup should be similar to what is shown below:

Now, the setup is complete. However, we still need to add the library for the I2C version of the LCD module. You can download the library from Liquid Crystal I2C Library (And Samples too!).

Since we are using an I2C module, we need to determine the address of the device. You can then Upload first the I2C Scanner to your Arduino board, open the Serial monitor (be sure you are in the correct COM port). The I2C Scanner sketch can be found in the Arduino web site: I2C Scanner.

For a detailed instruction on how to add these libraries, please visit one of my articles entitled Displaying Text to LCD via i2c Module on DIY Arduino Board.

NOTE: You need to upload first the I2C Scanner sketch to the board to determine the address of your I2C module. After you’ve determine its address, then the sample sketches for the Liquid Crystal I2C can then be uploaded, since the sample sketches requires the I2C address.

I2C_HelloWorld

Now, open the HelloWorld sketch under LiquidCrystal_I2C examples:

Hello World - I2C

Sketch is something similar as below. The text inside the blue rectangle in the sketch is the address of the I2C device, but yours might have a different one – the reason why we need to upload the I2C Scanner sketch and determine the address by opening the Serial Monitor in the Arduino IDE:

IMG_9493.jpg

Now, upload this sketch (be sure to change the address, since this might be different as yours. Mine is 0x3F). The output should be the same as shown below:

IMG_9494

By the way, this is how it looks like when the I2C module is already soldered to the LCD Module:

Comments are welcome, especially correction to this article. I will have them corrected once I have verified that these indeed need correction.

Liquid Crystal Displays (LCD) with Arduino

This article was revised on 2021/11/18 by Karl Söderby.

The LiquidCrystal library allows you to control LCD displays that are compatible with the Hitachi HD44780 driver. There are many of them out there, and you can usually tell them by the 16-pin interface.

Output of the sketch on a 16x2 LCD

Output of the sketch on a 16×2 LCD

The LCDs have a parallel interface, meaning that the microcontroller has to manipulate several interface pins at once to control the display. The interface consists of the following pins:

  • A register select (RS) pin that controls where in the LCD's memory you're writing data to. You can select either the data register, which holds what goes on the screen, or an instruction register, which is where the LCD's controller looks for instructions on what to do next.
  • A Read/Write (R/W) pin that selects reading mode or writing mode
  • An Enable pin that enables writing to the registers
  • 8 data pins (D0 -D7). The states of these pins (high or low) are the bits that you're writing to a register when you write, or the values you're reading when you read.

There's also a display contrast pin (Vo), power supply pins (+5V and GND) and LED Backlight (Bklt+ and BKlt-) pins that you can use to power the LCD, control the display contrast, and turn on and off the LED backlight, respectively.

The process of controlling the display involves putting the data that form the image of what you want to display into the data registers, then putting instructions in the instruction register. The LiquidCrystal Library simplifies this for you so you don't need to know the low-level instructions.

The Hitachi-compatible LCDs can be controlled in two modes: 4-bit or 8-bit. The 4-bit mode requires seven I/O pins from the Arduino, while the 8-bit mode requires 11 pins. For displaying text on the screen, you can do most everything in 4-bit mode, so example shows how to control a 16×2 LCD in 4-bit mode.

Hardware Required

  • Arduino Board
  • LCD Screen (compatible with Hitachi HD44780 driver)
  • pin headers to solder to the LCD display pins
  • 10k ohm potentiometer
  • 220 ohm resistor
  • hook-up wires
  • breadboard

Circuit

Note that this circuit was originally designed for the Arduino UNO. As the Arduino is communicating with the display using SPI, pin 11 & 12 will change depending on what board you are using. For example, on a MKR WiFi 1010, the SPI bus is attached to pin 8 & 11.

Before wiring the LCD screen to your Arduino board we suggest to solder a pin header strip to the 14 (or 16) pin count connector of the LCD screen, as you can see in the image further up.

To wire your LCD screen to your board, connect the following pins:

  • LCD RS pin to digital pin 12
  • LCD Enable pin to digital pin 11
  • LCD D4 pin to digital pin 5
  • LCD D5 pin to digital pin 4
  • LCD D6 pin to digital pin 3
  • LCD D7 pin to digital pin 2
  • LCD R/W pin to GND
  • LCD VSS pin to GND
  • LCD VCC pin to 5V
  • LCD LED+ to 5V through a 220 ohm resistor
  • LCD LED- to GND

Additionally, wire a 10k potentiometer to +5V and GND, with it's wiper (output) to LCD screens VO pin (pin3).

The circuit (made using Fritzing).

The circuit (made using Fritzing).

Schematic

The schematic (made using Fritzing).

The schematic (made using Fritzing).

Hello World Example

This example sketch prints to the LCD and shows the time in seconds since the Arduino was reset.

Autoscroll Example

This example sketch shows how to use the and methods to move all the text on the display left or right.

  • moves all the text one space to the left each time a letter is added
  • turns scrolling off

This sketch prints the characters to with autoscroll off, then moves the cursor to the bottom right, turns autoscroll on, and prints them again.

Blink Example

This example sketch shows how to use the and methods to blink a block-style cursor.

Cursor

This example sketch shows how to use the and methods to control an underscore-style cursor.

Display Example

This example sketch shows how to use the and methods to turn on and off the display. The text to be displayed will still be preserved when you use noDisplay() so it's a quick way to blank the display without losing everything on it.

Scroll Example

This example sketch shows how to use the and methods to reverse the direction the text is flowing. It prints "Hello World!", scrolls it offscreen to the left, then offscreen to the right, then back to home.

Serial to Display Example

This example sketch accepts serial input from a host computer and displays it on the LCD. To use it, upload the sketch, then open the Serial Monitor and type some characters and click Send. The text will appear on your LCD.

Set Cursor Example

This example sketch shows how to use the method to reposition the cursor. To move the cursor, just call with a row and column position. For example, for a 2×16 display:

Here is the full example:

Text Direction Example

This example sketch shows how to use the and methods. These methods control which way text flows from the cursor.

  • causes text to flow to the left from the cursor, as if the display is right-justified.
  • causes text to flow to the right from the cursor, as if the display is left-justified.

This sketch prints through right to left, then through left to right, then through right to left again.

Custom Character

This example demonstrates how to add custom characters on an LCD display.

Arduino. LCD 1602. I2C и другие варианты подключения.

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

Обзор.

Выглядит герой сегодняшней статьи следующим образом:

LCD 1602

Название дисплея, а точнее, числа входящие в его состав — 16 и 2 — символизируют количество столбцов и строк, доступных для вывода информации. Действительно:

Нумерация символов дисплея

Все верно, логика прослеживается, доступны 16 символов в каждой из 2-х строк ) Данный типоразмер является самым распространенным, также среди популярных: дисплеи 20х4 (LCD 2004) или 8х2 (LCD 0802):

LCD 2004 и LCD 0802

При этом сам по себе один символ, выводимый на экран, представляет из себя набор точек размером 8 на 5:

Единичный символ

Устройства максимально простые, поскольку позволяют вывести на экран только символы в конкретных позициях, тем не менее, их популярность остается на уровне и не так уж и сильно снижается с течением времени. И помимо размера разные модели дисплеев также могут отличаться цветом подсветки, вот несколько вариантов:

Варианты подсветки LCD 1602

При кажущемся многообразии моделей все эти дисплеи подключаются и функционируют одинаково, и код, написанный для одного типа, вполне себе будет работать и для другого, с минимальными доработками. К слову, я в практической части статьи буду снова использовать Arduino Uno R3 и дисплей LCD 1602, можно сказать стандартный комплект.

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

Коммутация с Arduino может производиться несколькими способами, из которых можно выделить два основных. Будем последовательными, и начнем с первого из них. В данном случае линии данных дисплея (DB4 — DB7) подключаются напрямую к четырем цифровым выводам Ардуино:

Arduino LCD 1602

Помимо этого мы имеем:

  • VDD питание дисплея, в данном случае подключаем к пину 5V
  • VSS земля, GND
  • A (Led+) анод светодиода подсветки
  • K (Led-) катод светодиода подсветки
  • RW отвечает за направление передачи данных, чтение или запись, подключаем к GND
  • E сигнал Enable, закидываем на еще один цифровой пин Ардуино
  • RS выбор регистра данных или команд, также подключаем на любой цифровой пин напрямую
  • V0 вывод для установки контрастности
  • DB4. DB7 уже упомянутые линии данных, на некоторых дисплеях они обозначены как D4. D7, но чтобы не создавать путаницу с выводами Arduino, я буду для линий дисплея использовать обозначение «DB»
  • DB0. DB3 не используем, так как и без того задействовано уже много выводов платы
LCD 1602 Arduino LCD 1602 Arduino
VDD 5V DB2 Не используется
VSS GND DB3 Не используется
V0 Потенциометр DB4 D4
RS D8 DB5 D5
RW GND DB6 D6
E D9 DB7 D7
DB0 Не используется A 5V через резистор
DB1 Не используется K GND

Отмечаем сразу наличие двух дополнительных элементов — токоограничивающий резистор R_1 , и потенциометр R_2 . Первый из них нужен по той простой причине, что для светодиода подсветки 5 В это слишком много, поэтому я поставил резистор на 1 КОм. Принцип его функционирования точно такой же, как описан в статье по ссылке в начале абзаца. А потенциометр R_2 нужен для того, чтобы была возможность настраивать контрастность, вот и все. В итоге схема и приобретает указанный выше вид, на макетной же плате можно смонтировать, например, так:

Подключение дисплея на макетной плате

Подключение по I2C.

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

Модуль на базе PCF8574

В чем тут смысл? Данный замечательный модуль был разработан именно для того, чтобы облегчить подключение LCD 1602 (или любого из аналогичных). Собственно, модуль является прослойкой между Ардуино и дисплеем:

Arduino LCD 1602 I2C

Arduino использует интерфейс I2C (который мы буквально вчера разбирали) для взаимодействия с этим модулем, а значит заняты оказываются всего лишь два вывода — SDA и SCL. А уже непосредственно модуль полученные команды преобразует в вид, который будет понятен дисплею. И в итоге вместо 6-ти линий из первого варианта подключения LCD 1602 к Arduino мы имеем только 2, что не может не радовать �� Более того, данный модуль укомплектован и дополнительными элементами обвязки, в частности потенциометром для настройки контрастности:

Потенциометр контрастности

В статье про Arduino I2C мы выяснили, что для функционирования шины необходимы подтягивающие резисторы, здесь они также присутствуют:

Подтягивающие резисторы I2C

И результатом является следующая схема подключения LCD 1602 по I2C:

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

Конечно же, вот вариант для макетной платы:

Breadboard-реализация

У меня сейчас под рукой дисплей без PCF8574, соответственно этот дополнительный мини-девайс я видимо приобретал когда-то отдельно, но довольно часто он бывает смонтирован на плате дисплея, и продается все это дело уже в виде единого законченного устройства (как и на схеме выше):

Модуль дисплея в сборе

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

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

Библиотека LiquidCrystal.

Для работы Arduino с LCD 1602 и его братьями существует стандартная библиотека LiquidCrystal. Установить ее можно из Library Manager, но есть стойкое ощущение, что в новые версии Arduino IDE она включена по умолчанию. Для подключения библиотеки в коде скетча требуется всего лишь простая манипуляция:

Пройдем по списку реализованных функций, начинаем с конструктора объекта:

Функция создает объект класса LiquidCrystal , причем, как видите, есть несколько вариантов использования.

Аргументы функций — номера используемых цифровых выводов Arduino. Выбор конкретной функции же зависит от способа подключения. На нашей схеме (первый вариант — без дополнительного модуля) мы используем только линии DB4, DB5, DB6 и DB7, соответственно, для нас подходят первый или второй вариант. Во второй функции настраивается также вывод RW, мы его просто закинули на землю, поэтому наш выбор — LiquidCrystal(rs, enable, d4, d5, d6, d7) .

Имена аргументов полностью соответствуют названиям выводов дисплея, так что тут все понятно. А на примере используем на практике для максимального понимания. Пока же небольшой примерчик: LiquidCrystal lcd(2, 3, 4, 10, 11, 12) . Этой строкой мы создаем объект lcd , который будет использоваться для вызовов всех последующих функций.

Функция должна быть вызвана перед всеми другими операциями с дисплеем, поскольку производит инициализационную деятельность. Аргументы — количество столбцов и строк используемого дисплея, для LCD 1602 будет так: lcd.begin(16, 2) .

Название довольно красноречивое �� Функция выполняет очистку дисплея, а также помещает курсор в левый верхний угол.

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

Эта функция также отвечает за управление позицией курсора, но позволяет поместить его в любое произвольное положение. Задается эта целевая позиция аргументами: первый ( col ) — номер столбца, второй ( row ) — номер строки. Все это задействуем в демо-примерах, к которым скоро перейдем. А пока продолжаем с функциями:

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

Здесь также вывод данных на дисплей, только более гибкий. В качестве данных для вывода ( data ) могут передаваться переменные следующих типов: char, byte, int, long или string. Второй аргумент задает систему счисления для вывода числовых значений, варианты:

  • BIN — двоичная
  • DEC — десятичная
  • OCT — восьмеричная
  • HEX — шестнадцатеричная

Не могу пройти мимо банального, но классического примера: lcd.print(«hello, world!»);

Семейство из двух функций для отображения/скрытия курсора.

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

lcd.noDisplay() выключает дисплей, отображение символов прекращается, но текущая информация не теряется и может быть возвращена последующим включением дисплея при помощи lcd.display() . Также сохраняется и позиция курсора, которую он занимал до вызова lcd.noDisplay() .

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

Включение/отключение автоскролла, то есть автоматической прокрутки. Автоматическая прокрутка подразумевает смещение предыдущих символов влево или вправо на одну позицию при добавлении нового. Направление зависит от текущего режима отображения текста — слева-направо или справа-налево. Если активен режим по умолчанию (текст отображается слева-направо), то прокрутка будет производиться влево, в другом режиме диаметрально противоположно.

А упомянутый режим как раз и задается следующими функциями:

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

Выходим на финишную прямую, последняя функция:

Добавляет свой собственный символ для использования с дисплеем. И этому тоже будет посвящен отдельный пример, так что сейчас на этом останавливаться смысла нет, переходим как раз-таки к демо-примерам.

И сразу же важное замечание! Если на дисплее ничего не отображается, не спешите исправлять код, пробовать другие библиотеки, бить его молотком и т. д. Первым делом крутим ручку потенциометра, который отвечает за контрастность, крутим в одну сторону, крутим в другую — до начала адекватного отображения информации на дисплее. 99,9% проблем с дисплеем решаются этим способом!

Пример 1. Arduino LCD 1602, вывод информации.

Как обещал, начинаем с первого варианта подключения, освежаем в памяти электрическую схему:

Принципиальная схема

Подключили, остается лишь вывести какую-либо информацию для проверки работоспособности подопытного. Скетчи будут снабжены комментариями, плюс после полного кода разберем те или иные детали подробнее:

Вот конкретно в этом случае к комментариям внутри скетча даже особо нечего добавить, мне кажется довольно исчерпывающе ) Разве что задаем переменные, в которые сохраняем номера выводов Arduino, к которым подключен наш LCD 1602:

Это в данном случае делается для наглядности, а вообще лучше взять на заметку стиль программирования, при котором номера тех или иных выводов в коде задаются только в одном единственном месте. Если данный номер пина будет использоваться в скетче многократно, то при ином подключении (к другому пину) поменять нужно будет только в одном месте, вместо того, чтобы выискивать упоминания по всему скетчу. Тем не менее приведенная инициализация объекта LiquidCrystal могла бы выглядеть и так:

Переходим к I2C варианту подключения LCD 1602.

Пример 2. Arduino LCD 1602 I2C.

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

Arduino LCD 1602 I2C

Для работы с дисплеем по I2C нужно взять уже иную библиотеку — LiquidCrystal_I2C, скачать можно, например, здесь — ссылка. А процесс добавления библиотеки в Arduino IDE я описал в отдельном посте, поскольку данный вопрос является достаточно распространенным, поэтому он достоин отдельного материала.

Приготовление завершены, переходим к деятельности:

В данном случае вместо объекта LiquidCrystal у нас LiquidCrystal_I2C , отличаются и передаваемые аргументы:

  • первый — адрес дисплея на шине I2C (0x27)
  • второй, третий — размеры дисплея — количество столбцов (16), количество строк (2)

Вопрос — как узнать адрес? Есть два глобальных варианта. Первый, эмпирический/экспериментальный заключается в том, что берется скетч из предыдущей статьи курса про I2C, он позволяет определить все наличествующие устройства на шине. В примере как раз и протестировано на примере подключения этого самого дисплея, так что видим адрес 0x27.

Второй способ, аналитический. Из документации на микросхему PCF8574, являющуюся центральным элементом модуля, который позволяет подключить дисплей по I2C, можно узнать следующее:

Адрес на шине

Из 7-ми битов адреса (помечены зеленым) 4 старших (помечены красным) фиксированы и зависят только от модели микросхемы: PCF8574 или PCF8574A. Берем модуль и изучаем, что написано на микросхеме. У меня первый вариант — PCF8574, значит фиксированная часть равна 0100 в двоичном виде. Замечательно, оставшиеся 3 бита зависят от того, какие логические уровни (1 или 0) на входах A0, A1, A2 PCF8574. По умолчанию обычно они подтянуты вверх, то есть к 1. Смотрим на плату конвертера:

Резисторы настройки адреса

У меня здесь три посадочных места для перемычек, которые позволят подключить каждый из этих входов (A0, A1, A2) к земле. Но перемычки отсутствуют, а значит на всех трех логическая единица, поэтому недостающая часть адреса на шине I2C — 111. Итоговый семибитный адрес — 0100111, что и равно 0x27 в шестнадцатеричном виде.

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

На этом можно переходить к следующему демо-примеру. Ну и да, результат работы данного скетча аналогичен предыдущему, что ожидаемо:

Вывод информации на дисплей LCD 1602

Пример 3. Бегущая строка.

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

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

LCD 1602, доступные символы

Символы выводятся по 32 штуки (столько помещается на экране), здесь я сгруппировал их все вместе. Таким образом, если мы хотим вывести символ восклицательного знака, код которого 0x21, то делаем так:

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

Рассмотрим структуру скетча чуть подробнее, в частности вывод символа:

Чтобы все было понятно, разберем на конкретных числовых значениях. Значение переменной i меняется от 0 до 32, а j от 0 до 8. Операция i % 16 даем нам в результате остаток от деления i на 16, например:

i i % 16 i i % 16
0 0 15 15
1 1 16 0
2 2 17 1

Таким образом меняем столбец, на который указывает курсор, от 0 до 15 для каждого следующего символа. При делении ( i / 16 ) получаем 0 или 1 (целочисленный результат деления):

i i / 16 i i / 16
0 0 15 0
1 0 16 1
2 0 17 1

Итоговые значения, передаваемые в lcd.setCursor() :

i lcd.setCursor(i % 16, i / 16) i lcd.setCursor(i % 16, i / 16)
0 lcd.setCursor(0, 0); 15 lcd.setCursor(15, 0);
1 lcd.setCursor(1, 0); 16 lcd.setCursor(0, 1);
2 lcd.setCursor(2, 0); 17 lcd.setCursor(1, 1);

В lcd.write() же передаем аргументом номера символов в памяти дисплея. Вот и все, результат мы уже видели.

Пример 5. Создаем свой символ для вывода на дисплей.

В теоретической части мы выяснили, что каждый из символов представляет из себя набор точек размером 8 * 5. А в примере под номером 4 можно обратить внимания на странные символы, с которых начинается вывод:

Custom symbols

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

Отрисованный символ

Для того, чтобы добавить символ нужно описать его в виде массива, где каждая точка — это один бит. Закрашенная точка — единица, незакрашенная — ноль. В данном случае получим:

Все в точности соответствует внешнему виду символа, который мы собираемся добавить. Скетч в итоге будет выглядеть так:

Прошиваем Arduino Uno и проверяем:

LCD 1602 custom glyph

Все верно, отлично! Но добавленный символ будет существовать только до отключения питания дисплея, так что при запуске платы надо всегда вызывать функцию lcd.createChar() . Кроме того, еще один нюанс, после вызова lcd.createChar() текущее положение курсора сбрасывается, так что необходимо выполнить lcd.setCursor() .

Пример 6. LCD 1602 RUS. Кириллица.

И еще один пример, нельзя обойти вниманием возможность вывода русских букв. В этом нам поможет библиотека LCD_1602_RUS_ALL — github. Устанавливаем по старой схеме, пишем скетч и прошиваем Arduino:

В самом скетче отметить можно только строку, которая задает тип дисплея, ее обязательно надо добавить до подключения библиотеки:

Сегодняшняя статья получилась довольно объемной, зато затронули большое количество разных нюансов и вариантов использования. Завершаем результатом работы примера под номером 6:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *