Оглавление
- Объяснение программы для ведомой (Slave) платы Arduino
- Create and Display Custom Characters
- 3 Библиотека для работы по протоколу I2C
- Распиновка 16х02 символов
- I2C LCD Basics
- Генерация пользовательских символов для LCD
- Программный код
- PCF8574 — I2C модуль для LCD на базе HD44780
- Описание методов библиотеки LiquidCrystal I2C
- 5Создание собственных символов для ЖК дисплея
- Сканер I2C интерфейса (шины) Ардуино
- Подключение LCD1602 к Arduino
- Basic Arduino example code for I2C LCD
- How to connect the I2C LCD to Arduino UNO
- I2C Address of LCD
- Плюсы и минусы LCD 1602
- Specifications
- Заключение
- 4Скетч для вывода текста на LCD экран по шине I2C
Объяснение программы для ведомой (Slave) платы Arduino
1. Как и в ведущей плате, первым делом в программе мы должны подключить библиотеку Wire для задействования возможностей протокола I2C и библиотеку для работы с ЖК дисплеем. Также нам необходимо сообщить плате Arduino к каким ее контактам подключен ЖК дисплей.
Arduino
#include<Wire.h>
#include<LiquidCrystal.h>
LiquidCrystal lcd(2, 7, 8, 9, 10, 11);
1 |
#include<Wire.h> LiquidCrystallcd(2,7,8,9,10,11); |
- В функции void setup():
— мы инициализируем последовательную связь со скоростью 9600 бод/с;
Arduino
Serial.begin(9600);
1 | Serial.begin(9600); |
— далее мы инициализируем связь по протоколу I2C на контактах A4 и A5
В качестве адреса ведомого мы будем использовать значение 8 – очень важно здесь указать адрес ведомого;. Arduino
Wire.begin(8);
Arduino
Wire.begin(8);
1 | Wire.begin(8); |
После этого мы должны вызвать функцию в которой ведомый принимает значение от ведущего и функцию в которой ведущий запрашивает значение от ведомого.
Arduino
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
1 |
Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); |
— затем мы инициализируем ЖК дисплей для работы в режиме 16х2, отображаем на нем приветственное сообщение и очищаем его экран через 5 секунд.
Arduino
lcd.begin(16,2); //Initilize LCD display
lcd.setCursor(0,0); //Sets Cursor at first line of Display
lcd.print(«Circuit Digest»); //Prints CIRCUIT DIGEST in LCD
lcd.setCursor(0,1); //Sets Cursor at second line of Display
lcd.print(«I2C 2 ARDUINO»); //Prints I2C ARDUINO in LCD
delay(5000); //Delay for 5 seconds
lcd.clear(); //Clears LCD display
1 |
lcd.begin(16,2);//Initilize LCD display lcd.setCursor(,);//Sets Cursor at first line of Display lcd.print(«Circuit Digest»);//Prints CIRCUIT DIGEST in LCD lcd.setCursor(,1);//Sets Cursor at second line of Display lcd.print(«I2C 2 ARDUINO»);//Prints I2C ARDUINO in LCD delay(5000);//Delay for 5 seconds lcd.clear();//Clears LCD display |
3. Затем нам будут необходимы две функции: одна для события запроса (request event) и одна для события приема (receive event).
Для события запроса:
Эта функция будет выполняться когда ведущий будет запрашивать значение от ведомого. Эта функция будет считывать значение с потенциометра, подключенного к ведомой плате Arduino, преобразовывать его в диапазон 0-127 и затем передавать его ведущей плате.
Arduino
void requestEvent()
{
int potvalue = analogRead(A0);
byte SlaveSend = map(potvalue,0,1023,0,127);
Wire.write(SlaveSend);
}
1 |
voidrequestEvent() { intpotvalue=analogRead(A0); byteSlaveSend=map(potvalue,,1023,,127); Wire.write(SlaveSend); } |
Для события приема:
Эта функция будет выполняться когда ведущий будет передавать данные ведомому с адресом 8. Эта функция считывает принятые значения от ведущего и сохраняет ее в переменной типа byte.
Arduino
void receiveEvent (int howMany)
{
SlaveReceived = Wire.read();
}
1 |
voidreceiveEvent(inthowMany) { SlaveReceived=Wire.read(); } |
4. В функции Void loop():
Мы будем непрерывно отображать принятые от ведущей платы значения на экране ЖК дисплея.
Arduino
void loop(void)
{
lcd.setCursor(0,0); //Sets Currsor at line one of LCD
lcd.print(«>> Slave <<«); //Prints >> Slave << at LCD
lcd.setCursor(0,1); //Sets Cursor at line two of LCD
lcd.print(«MasterVal:»); //Prints MasterVal: in LCD
lcd.print(SlaveReceived); //Prints SlaveReceived value in LCD received from Master
Serial.println(«Slave Received From Master:»); //Prints in Serial Monitor
Serial.println(SlaveReceived);
delay(500);
lcd.clear();
}
1 |
voidloop(void) { lcd.setCursor(,);//Sets Currsor at line one of LCD lcd.print(«>> Slave <<«);//Prints >> Slave << at LCD lcd.setCursor(,1);//Sets Cursor at line two of LCD lcd.print(«MasterVal:»);//Prints MasterVal: in LCD lcd.print(SlaveReceived);//Prints SlaveReceived value in LCD received from Master Serial.println(«Slave Received From Master:»);//Prints in Serial Monitor Serial.println(SlaveReceived); delay(500); lcd.clear(); } |
После того как вы соберете всю схему проекта и загрузите обе программы в платы Arduino вы можете приступать к тестированию работы проекта. Вращая потенциометр на одной стороне вы должны увидеть изменяющиеся значения на экране ЖК дисплея на другой стороне.
Теперь, когда вы разобрались, как работать с интерфейсом I2C в плате Arduino, вы можете использовать описанные в данной статье приемы для подключения к плате Arduino любых датчиков, работающих по данному протоколу.
Create and Display Custom Characters
If you are finding characters on the display dull and unexciting, you can create your own custom characters (glyph) and symbols for your LCD. They are extremely useful when you want to display a character that is not part of the standard ASCII character set.
CGROM and CGRAM
All LCD displays based on Hitachi HD44780 controller have two types of memories that store defined characters called CGROM and CGRAM (Character Generator ROM & RAM). CGROM memory is non-volatile and can’t be modified whereas; CGRAM memory is volatile and can be modified any time.
CGROM is used for storing all permanent fonts that can be displayed by using their ASCII code. For example, if we write 0x41 then on the LCD we get character ‘A’. CGRAM is another memory that can be used for storing user defined characters.
This RAM is limited to 64 bytes. Meaning, for 5×8 pixel based LCD; up to 8 user-defined characters can be stored in the CGRAM. And for 5×10 pixel based LCD, only 4 user-defined characters are can be stored.
To define a custom character the function is used. This function accepts an array of 8 bytes. Each byte (only 5 bits are considered) in the array defines one row of the character in the 5×8 matrix. Whereas, 0s and 1s in the byte indicate which pixels in the row should be off and which should be turned on.
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-экрана. |
Распиновка 16х02 символов
Перед тем, приступить к сборке и написанию кода, давайте сначала взглянем на распиновку LCD 1602.
Профессиональный цифровой осциллограф
Количество каналов: 1, размер экрана: 2,4 дюйма, разрешен…
Подробнее
- GND — должен быть подключен к земле Arduino.
- VCC — это вывод питание для ЖК-дисплея, к которому мы подключаем 5-вольтовый контакт Arduino.
- Vo (LCD Contrast) — вывод контролирует контрастность и яркость ЖК-дисплея. Используя простой делитель напряжения с потенциометром, мы можем точно отрегулировать контрастность.
- RS (Register Select) — этот вывод позволяет Arduino сообщать ЖК-дисплею, отправляются команды или данные. В основном этот вывод используется для дифференциации команд от данных. Например, когда на выводе RS установлено значение LOW, мы отправляем команды на ЖК-дисплей (например, установить курсор в определенном месте, очистить дисплей, сдвинуть дисплей вправо и т. д.). Когда вывод RS установлено значение HIGH, мы отправляем данные/символы на ЖК-дисплей.
- R/W (Read/Write) — вывод предназначен для контроля того, что необходимо сделать — считать данные или передать их на ЖК-дисплй. Поскольку мы просто используем этот ЖК-дисплей в качестве устройства вывода, то достаточно на этот вывод подать HIGH уровень, тем самым мы перейдем в режим записи.
- EN (Enable) — вывод используется для включения дисплея. Это означает, что когда на этом выводе установлено значение LOW ЖК-дисплей не реагирует на то, что происходит с R/W, RS и линиями шины данных. Когда же на этом выводе HIGH ЖК-дисплей обрабатывает входящие данные.
- D0-D7 (Data Bus) — это выводы, по которым передаются 8-битные данные на дисплей. Например, если мы хотим отобразить символ «A» в верхнем регистре, мы отправляем на LCD дисплей 0100 0001 (в соответствии с таблицей ASCII) .
- AK (Anode & Cathode) используются для управления подсветкой LCD дисплея.
I2C LCD Basics
This type of LCD is ideal for displaying text and numbers, hence the name ‘character LCD’. The I2C LCD that we are using in this tutorial comes with a small add-on circuit mounted on the back of the module. This module features a PCF8574 chip (for I2C communication) and a potentiometer to adjust the LED backlight. The advantage of an I2C LCD is that the wiring is very simple. You only need two data pins to control the LCD.
Standard LCDs typically require around 12 connections, which can be a problem if you do not have many GPIO pins available. Luckily, you can also buy the I2C add-on circuit separately on Amazon, so you can easily upgrade a standard LCD as well.
For a tutorial and wiring diagram for standard character LCDs, please see the following article:
How to use a 16×2 character LCD with Arduino
If you look closely at the LCD, you can see the small rectangles that form the individual characters of the LCD. Each rectangle is made up of a grid of 5×8 pixels. Later in this tutorial, I will show you how you can control the individual pixels to display custom characters on the LCD.
Генерация пользовательских символов для LCD
Если вы находите символы на дисплее неподходящими и неинтересными, вы можете создать свои собственные символы (глиф) для своего ЖК-дисплея. Пользовательские символы чрезвычайно полезны в том случае, когда вы хотите отобразить символ, который не является частью стандартного набора символов ASCII.
Как мы уже обсуждали ранее в этом руководстве, символ на дисплее формируется в матрице 5×8 пикселей, поэтому вам нужно определить свой пользовательский символ в этой матрице. Для определения символа необходимо использовать функцию createChar() библиотеки LiquidCrystal.
Для использования createChar() сначала необходимо назначить массив из 8 байт. Каждый байт (учитывается только 5 бит) в массиве определяет одну строку символа в матрице 5×8. В то время как нули и единицы в байте указывают, какие пиксели в строке должны быть включены, а какие-выключены.
Генератор символов LCD
Создание собственного символа до сих пор было непросто! Поэтому было создано небольшое приложение под названием «Генератор пользовательских символов» для LCD.
Вы видите синюю сетку ниже? Вы можете нажать на любой из 5 × 8 пикселей, чтобы установить/очистить этот конкретный пиксель. И когда вы нажимаете на пиксели, код для символа генерируется рядом с сеткой. Этот код может быть непосредственно использован в вашем скетче Arduino.
Единственным ограничением является то, что библиотека LiquidCrystal поддерживает только восемь пользовательских символов.
Следующий скриншот демонстрирует, как вы можете использовать эти пользовательские символы на дисплее.
// подключаем библиотеку LiquidCrystal: #include <LiquidCrystal.h> // Создаем LCD объект. Выводы: (rs, enable, d4, d5, d6, d7) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // создадим несколько пользовательских символов byte Heart = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 }; byte Bell = { 0b00100, 0b01110, 0b01110, 0b01110, 0b11111, 0b00000, 0b00100, 0b00000 }; byte Alien = { 0b11111, 0b10101, 0b11111, 0b11111, 0b01110, 0b01010, 0b11011, 0b00000 }; byte Check = { 0b00000, 0b00001, 0b00011, 0b10110, 0b11100, 0b01000, 0b00000, 0b00000 }; byte Speaker = { 0b00001, 0b00011, 0b01111, 0b01111, 0b01111, 0b00011, 0b00001, 0b00000 }; byte Sound = { 0b00001, 0b00011, 0b00101, 0b01001, 0b01001, 0b01011, 0b11011, 0b11000 }; byte Skull = { 0b00000, 0b01110, 0b10101, 0b11011, 0b01110, 0b01110, 0b00000, 0b00000 }; byte Lock = { 0b01110, 0b10001, 0b10001, 0b11111, 0b11011, 0b11011, 0b11111, 0b00000 }; void setup() { // инициализируем LCD и устанавливаем количество столбцов и строк: lcd.begin(16, 2); // создание нового символа lcd.createChar(0, Heart); // создание нового символа lcd.createChar(1, Bell); // создание нового символа lcd.createChar(2, Alien); // создание нового символа lcd.createChar(3, Check); // создание нового символа lcd.createChar(4, Speaker); // создание нового символа lcd.createChar(5, Sound); // создание нового символа lcd.createChar(6, Skull); // создание нового символа lcd.createChar(7, Lock); // Очищаем LCD дисплей lcd.clear(); // Печатаем сообщение на LCD. lcd.print("Custom Character"); } // Печатаем все пользовательские символы void loop() { lcd.setCursor(0, 1); lcd.write(byte(0)); lcd.setCursor(2, 1); lcd.write(byte(1)); lcd.setCursor(4, 1); lcd.write(byte(2)); lcd.setCursor(6, 1); lcd.write(byte(3)); lcd.setCursor(8, 1); lcd.write(byte(4)); lcd.setCursor(10, 1); lcd.write(byte(5)); lcd.setCursor(12, 1); lcd.write(byte(6)); lcd.setCursor(14, 1); lcd.write(byte(7)); }
После включения библиотеки нам нужно инициализировать пользовательский массив из восьми байтов.
byte Heart = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 };
В настройках мы должны создать пользовательский символ, используя функцию createChar(). Эта функция принимает два параметра. Первый — это число от 0 до 7, чтобы зарезервировать один из 8 поддерживаемых пользовательских символов. Второй параметр — это имя массива байтов.
// создание нового символа lcd.createChar(0, Heart);
Далее в цикле для отображения пользовательского символа мы используем функцию write(), а в качестве параметра мы используем номер символа, который мы зарезервировали.
// byte(0) покажет символ Heart (сердце). lcd.write(byte(0));
Программный код
Если для работы с дисплеем без модуля необходимо было воспользоваться только одной библиотекой, то для работы с модулем нужно две библиотеки. Одна из них уже есть в составе Arduino IDE — Wire. Другую библиотеку, LiquidCrystal I2C, надо скачивать отдельно и устанавливать. Для установки библиотеки в Arduino содержимое скачанного архива необходимо загрузить в корневую папку Libraries. Пример программного кода с использованием I2C:
#include
#include
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
void setup()
{
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
lcd..setCursor(8, 1);
lcd.print(«LCD 1602»);
}
void loop()
{
// Устанавливаем курсор на вторую строку и нулевой символ.
lcd.setCursor(0, 1);
// Выводим на экран количество секунд с момента запуска ардуины
lcd.print(millis()/1000);
}
Как можно увидеть, код почти не отличается.
PCF8574 — I2C модуль для LCD на базе HD44780
Микросхема PCF8574/PCF8574T обеспечивает расширение портов ввода/вывода для контроллеров через интерфейс I2C и позволит легко решить проблему нехватки цифровых портов. При использовании модуля как расширитель портов ввода/вывода следует учитывать то, что вывод Р3 имеет инверсный выход с открытым коллектором.
Микросхема может использоваться для управления ЖК дисплеем под управлением контроллера HD44780, в 4-х битном режиме. Для этой цели на плате установлена микросхема PCF8574, которая является преобразователем шины I2C в параллельный 8 битный порт.
Плата модуля разведена таким образом, чтобы ее можно было сразу подключить к ЖКИ. На вход подается питание и линии I2C. На плате сразу установлены подтягивающие резисторы на линиях SCL и SDA, потенциометр для регулировки контрастности и питание самого дисплея. Джампер справа включает/отключает подсветку.
Описание методов библиотеки LiquidCrystal I2C
LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)
Конструктор для создания экземпляра класса, первый параметр это I2C адрес устройства, второй — число символов, третий — число строк.
LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);
1 | LiquidCrystal_I2C(uint8_tlcd_Addr,uint8_tlcd_cols,uint8_tlcd_rows); |
init()
Инициализация ЖК-дисплея.
void init();
1 | voidinit(); |
backlight()
Включение подсветки дисплея.
void backlight();
1 | voidbacklight(); |
setCursor(uint8_t, uint8_t)
Установка позиции курсора.
void setCursor(uint8_t, uint8_t);
1 | voidsetCursor(uint8_t,uint8_t); |
clear()
Возвращает курсор в начало экрана.
void clear();
1 | voidclear(); |
home()
Возвращает курсор в начало экрана и удаляет все, что было на экране до этого.
void home();
1 | voidhome(); |
write(uint8_t)
Позволяет вывести одиночный символ на экран.
#if defined(ARDUINO) && ARDUINO >= 100
virtual size_t write(uint8_t);
#else
virtual void write(uint8_t);
#endif
1 |
#if defined(ARDUINO) && ARDUINO >= 100 virtualsize_twrite(uint8_t); #else virtualvoidwrite(uint8_t); #endif |
cursor()
Показывает курсор на экране.
void cursor();
1 | voidcursor(); |
noCursor()
Скрывает курсор на экране.
void noCursor();
1 | voidnoCursor(); |
blink()
Курсор мигает (если до этого было включено его отображение).
void blink();
1 | voidblink(); |
noBlink()
Курсор не мигает (если до этого было включено его отображение).
void noBlink();
1 | voidnoBlink(); |
display()
Позволяет включить дисплей.
void display();
1 | voiddisplay(); |
noDisplay()
Позволяет отключить дисплей.
void noDisplay();
1 | voidnoDisplay(); |
scrollDisplayLeft()
Прокручивает экран на один знак влево.
void scrollDisplayLeft();
1 | voidscrollDisplayLeft(); |
scrollDisplayRight()
Прокручивает экран на один знак вправо.
void scrollDisplayRight();
1 | voidscrollDisplayRight(); |
autoscroll()
Позволяет включить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
void autoscroll();
1 | voidautoscroll(); |
noAutoscroll()
Позволяет выключить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
void noAutoscroll();
1 | voidnoAutoscroll(); |
leftToRight()
Установка направление выводимого текста — слева направо.
void leftToRight();
1 | voidleftToRight(); |
rightToLeft()
Установка направление выводимого текста — справа налево.
void rightToLeft();
1 | voidrightToLeft(); |
createChar(uint8_t, uint8_t[])
Создает символ. Первый параметр — это номер (код) символа от 0 до 7, а второй — массив 8 битовых масок для создания черных и белых точек.
void createChar(uint8_t, uint8_t[]);
1 | voidcreateChar(uint8_t,uint8_t); |
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» – тёмную. Например, символ сердца, заданный в виде битовой маски, будет выглядеть на экране так, как показано на рисунке.
Создание собственного символа для LCD экрана
Сканер I2C интерфейса (шины) Ардуино
Для этого занятия нам потребуется:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- макетная плата;
- два текстовых дисплея 1602 I2C;
- любое устройство с I2C интерфейсом;
- провода «папа-папа», «папа-мама».
Подключение двух дисплеев 1602 I2C к Ардуино
Перед тем, как управлять несколькими объектами, подключенных к IIC шине, необходимо узнать их адреса. Для этого используется программа — сканер I2C Arduino, которая позволяет узнать адреса всех устройств, подключенных в данный момент к шине. Соберите схему из двух текстовых экранов с IIC модулем (можно подключить только одно устройство), подключенных к Ардуино Уно, и загрузите следующий скетч.
Скетч. Сканер шины i2c для Arduino
#include <Wire.h> void setup(){ Wire.begin(); Serial.begin(9600); } void loop(){ byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 8; address < 127; address++ ){ Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0){ Serial.print("I2C device found at address 0x"); if (address < 16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error == 4) { Serial.print("Unknow error at address 0x"); if (address < 16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); }
Пояснения к коду:
- данный код позволяет узнать все адреса устройств, подключенных к шине IIC. Если устройство не было подключено или подключено неправильно — на мониторе порта будет выходить сообщение, что устройства не найдены;
- ниже, на скриншоте монитора порта Arduino IDE, выводится адрес LCD 1602.
Сканер шины i2c для Arduino с LCD дисплеем
Подключение LCD1602 к Arduino
Модуль оборудован четырех-пиновым разъемом стандарта 2.54мм
- SCL: последовательная линия тактирования (Serial CLock)
- SDA: последовательная линия данных (Serial DAta)
- VCC: «+» питания
- GND: «-» питания
Выводы отвечающие за интерфейс I2C на платах Arduino на базе различных контроллеров разнятся
Arduino Mega | Arduino Uno/Nano/Pro Mini | LCD I2C модуль | Цвет проводов на фото |
---|---|---|---|
GND | GND | GND | Черный |
5V | 5V | VCC | Красный |
20 (SDA) | A4 | SDA | Зелёный |
21 (SCL) | A5 | SCL | Жёлтый |
Пример скетча
/*
Добавляем необходимые библиотеки
*/
#include <LiquidCrystal_I2C.h>
/*
Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки
*/
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
/*
Инициализируем ЖК-дисплей
*/
lcd.init();
/*
Включаем подсветку дисплея
*/
lcd.backlight();
/*
Устанавливаем курсор на первую строку и нулевой символ.
*/
lcd.setCursor(0, 0);
/*
Выводим на экран строку
*/
lcd.print(» micro-pi.ru «);
}
void loop()
{
/*
Устанавливаем курсор на вторую строку и 3 символ.
*/
lcd.setCursor(3, 1);
/*
Выводим на экран количество секунд с момента запуска ардуины
*/
lcd.print(millis() / 1000);
delay(1000);
}
1 |
/* LiquidCrystal_I2Clcd(0x27,16,2); voidsetup() { /* Инициализируем ЖК-дисплей lcd.init(); /* Включаем подсветку дисплея lcd.backlight(); /* Устанавливаем курсор на первую строку и нулевой символ. lcd.setCursor(,); /* Выводим на экран строку lcd.print(» micro-pi.ru «); } voidloop() { /* Устанавливаем курсор на вторую строку и 3 символ. lcd.setCursor(3,1); /* Выводим на экран количество секунд с момента запуска ардуины lcd.print(millis()1000); delay(1000); } |
Basic Arduino example code for I2C LCD
You can upload the following example code to the Arduino using the Arduino IDE.
For this tutorial, I used this 16×2 I2C character LCD display, but you can use other I2C LCDs of different sizes as well.
This example sketch will display the classic ‘Hello World!’ on the first line of the LCD and ‘LCD tutorial’ on the second line. Next, I will explain how the code works.
/* I2C LCD with Arduino example code. More info: https://www.makerguides.com */ // Include the libraries: // LiquidCrystal_I2C.h: https://github.com/johnrickman/LiquidCrystal_I2C #include <Wire.h> // Library for I2C communication #include <LiquidCrystal_I2C.h> // Library for LCD // Wiring: SDA pin is connected to A4 and SCL pin to A5. // Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered) LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // Change to (0x27,20,4) for 20x4 LCD. void setup() { // Initiate the LCD: lcd.init(); lcd.backlight(); } void loop() { // Print 'Hello World!' on the first line of the LCD: lcd.setCursor(2, 0); // Set the cursor on the third column and first row. lcd.print("Hello World!"); // Print the string "Hello World!" lcd.setCursor(2, 1); //Set the cursor on the third column and the second row (counting starts at 0!). lcd.print("LCD tutorial"); }
You should see the following output on the LCD:
How the code works
First, the required libraries are included. As mentioned earlier we need both the wire.h* and the LiquidCrystal_I2C library. In the rest of this tutorial, I will cover more of the built-in functions of this library.
*When using the latest version of the LiquidCrystal_I2C library it is no longer needed to include the wire.h library in your sketch. The other library imports wire.h automatically.
// Include the libraries: // LiquidCrystal_I2C.h: https://github.com/johnrickman/LiquidCrystal_I2C #include <Wire.h> // Library for I2C communication #include <LiquidCrystal_I2C.h> // Library for LCD
The next step is to create an LCD object with the LiquidCrystal_I2C class and specify the address and dimensions. For this, we use the function . This is where you will need to change the default address to the address you found earlier if it happens to be different.
When using a 20×4 LCD, change this line to
Note that we have called the display ‘lcd’. You can give it a different name if you want like ‘menu_display’. You will need to change ‘lcd’ to the new name in the rest of the sketch.
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered) LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // Change to (0x27,20,4) for 20x4 LCD.
In the setup, the LCD is initiated with and the backlight is turned on with .
void setup() { // Initiate the LCD: lcd.init(); lcd.backlight(); }
In the loop section of the code, the cursor is set to the third column and the first row of the LCD with . Note that counting starts at 0 and the first argument specifies the column. So sets the cursor on the third column and the second row.
Next the string ‘Hello World!’ is printed with . Note that you need to place quotation marks (” “) around the text since we are printing a text string. When you want to print numbers, no quotation marks are necessary. For example .
void loop() { lcd.setCursor(2, 0); // Set the cursor on the third column and first row. lcd.print("Hello World!"); // Print the string "Hello World!". lcd.setCursor(2, 1); //Set the cursor on the third column and the second row. lcd.print("LCD tutorial"); // Print the string "LCD tutorial". }
If you want to see an example for displaying (changing) variables on the LCD, check out my tutorial for the HC-SR04 ultrasonic distance sensor:
How to use a HC-SR04 Ultrasonic Distance Sensor with Arduino
How to connect the I2C LCD to Arduino UNO
The wiring diagram below shows you how to connect the I2C LCD to the Arduino. Wiring an I2C LCD is a lot easier than connecting a standard LCD. You only need to connect 4 pins instead of 12.
I2C LCD with Arduino wiring diagram
The connections are also given in the table below.
I2C LCD Connections
I2C Character LCD | Arduino |
---|---|
GND | GND |
VCC | 5 V |
SDA | A4 |
SCL | A5 |
If you are not using an Arduino Uno, the SDA and SCL pins can be at a different location. Note that an Arduino Uno with the R3 layout (1.0 pinout) also has the SDA (data line) and SCL (clock line) pin headers close to the AREF pin. Check the table below for more details.
Board | SDA | SCL |
---|---|---|
Arduino Uno | A4 | A5 |
Arduino Nano | A4 | A5 |
Arduino Micro | 2 | 3 |
Arduino Mega 2560 | 20 | 21 |
Arduino Leonardo | 2 | 3 |
Arduino Due | 20 | 21 |
SDA and SCL pin locations on different Arduino boards.
I2C Address of LCD
If you are using multiple devices on the same I2C bus, you may need to set a different I2C address for the board, so that it does not conflict with another I2C device.
To do so, the board has three solder jumpers (A0, A1 and A2) or solder pads.
Each of these is used to hardcode the address. If a jumper is shorted with a blob of solder, it sets the address.
An important point here is that many companies manufacture the same PCF8574 chip: Texas Instruments and NXP Semiconductors to name a few. And the I2C address of your LCD depends on the chip manufacturer.
If your LCD has a PCF8574 chip from Texas Instruments:
According to the Texas Instruments’ datasheet, three address selection bits (A0, A1 and A2) are placed at the end of the 7-bit I2C address register.
As there are 3 address inputs, which can take 2 states, either HIGH/LOW, we can therefore create 8 (23) different combinations(addresses).
By default, all the 3 address inputs are pulled HIGH using onboard pullups, giving PCF8574 a default I2C address of 0100111Binary or 0x27Hex.
By shorting the solder jumpers, the address inputs are puled LOW. If you were to short all three jumpers, the address would be 0x20. The range of all possible addresses spans from 0x20 to 0x27. Please refer the below illustration.
If your LCD has a PCF8574 chip from NXP Semiconductors:
According to the NXP Semiconductors’ datasheet, three address selection bits (A0, A1 and A2) are also placed at the end of the 7-bit I2C address register. But other bits in the Address Register are different.
Again! The 3 address input can have 2 states, either HIGH / LOW, giving us 8 (23) different combinations.
By default, all the 3 address inputs are pulled HIGH using onboard pullups, giving PCF8574 a default I2C address of 0111111Binary or 0x3FHex.
By shorting the solder jumpers, the address inputs are puled LOW. If you were to short all three jumpers, the address would be 0x38. The range of all possible addresses spans from 0x38 to 0x3F. Please refer the below illustration.
Плюсы и минусы LCD 1602
Рассмотрим плюсы и минусы дисплея LCD 1602.
- Цена. Этот модуль можно приобрести совсем по демократичной цене в китайских магазинах. Цена составляет 200-300 рублей. Иногда продается даже вместе с I2C модулем.
- Легко подключать. Вероятно, никто сейчас не подключает LCD 1602 без I2C. А с этим модулем подключение занимает всего 4 контакта, никаких «паутин» из проводов не будет.
- Программирование. Благодаря готовым библиотекам работать с этим модулем легко, все функции уже прописаны. А при необходимости добавить свой символ затрачивается всего пару минут.
За время использования тысячами радиолюбителями никаких больших минусов выявлено не было, только бывают случаи покупки брака, так как в основном используются китайские варианты дисплеев.
В этой статье было рассмотрено подключение 1602 к Arduino, а также были представлены примеры программ для работы с этим дисплеем. Он действительно является в своей категории одним из лучших, не просто так его выбирают тысячи радиолюбители для своих проектов!
В этой статье расскажу, как использовать интерфейсный модуль I2C для управления LCD дисплеем (2×16 / 20х4) с помощью Arduino. Данный модуль позволяет уменьшить количество используемых выводов контроллера, вместо 8 или 4-битного соединения, требуется только 2 вывода (SDA и SCL).
Specifications
The specifications of the 16×2, 20×4, and other sized LCDs are mostly the same. They all use the same HD44780 Hitachi LCD controller, so you can easily swap them. You will only need to change the size specifications in your Arduino code.
The specifications of a typical 16×2 I2C display can be found in the table below.
16×2 I2C LCD Specifications
Operating voltage | 5 V |
Controller | Hitachi HD44780 LCD controller |
Default address | 0x27 |
Screen resolution | 2-lines × 16 characters |
Character resolution | 5 × 8 pixels |
Module dimensions | 80 × 36 × 12 mm |
Viewing area dimensions | 64.5 × 16.4 mm |
Cost | Check price |
For more information, you can check out the datasheets below. The 16×2 and 20×4 datasheets include the dimensions of the LCD and you can find more information about the Hitachi LCD driver in the HD44780 datasheet. The PCF8574 chip is used in the I2C module on the back of the LCD.
16×2 Character LCD Datasheet
20×4 Character LCD Datasheet
HD44780 Datasheet
PCF8574 Datasheet
Заключение
В этой статье мы рассмотрели основные вопросы использования LCD экрана в сложных проектах ардуино, когда нам нужно экономить свободные пины на плате. Простой и недорогой переходник i2c позволит подключить LCD экран 1602, занимая всего 2 аналоговых пина. Во многих ситуациях это может быть очень важным. Плата за удобство – необходимость в использовании дополнительного модуля – конвертера и библиотеки. На наш взгляд, совсем не высокая цена за удобство и мы крайне рекомендуем использовать эту возможность в проектах.
Каждый радиолюбитель после некоторого количества простых самоделок приходит к цели сконструировать что-то грандиозное с использование датчиков и кнопок. Ведь гораздо интереснее выводить данные на дисплей, нежели на монитор порта. Но тогда встает вопрос: какой дисплей выбрать? И вообще, как подключать его, что нужно для подключения? Ответы на эти вопросы будут рассмотрены в этой статье.
4Скетч для вывода текста на LCD экран по шине I2C
#include <Wire.h> // подключаем библиотеку Wire #include <LiquidCrystal_I2C.h> // подключаем библиотеку ЖКИ #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.print("Hello SolTau.ru!"); // печатаем строку текста 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.