Подключить LCD1602 к Arduino (или любой другой LCD на базе микросхем HD44780) не всегда удобно, потому что используются как минимум 6 цифровых выходов. LCD I2C модули на базе микросхем PCF8574 позволяют подключить символьный дисплей к плате Arduino всего по двум сигнальным проводам (SDA и SCL).
- 1 PCF8574 — I2C модуль для LCD на базе HD44780
- 2 Установка библиотеки LiquidCrystal I2C
- 3 Описание методов библиотеки LiquidCrystal I2C
- 4 Подключение LCD1602 к Arduino
- 5 Создание собственных символов
- 6 Проблемы подключения LCD1602 к Arduino по I2C
- 7 Материалы
- 8 Купить LCD Adapter PCF8574 на AliExpress
- 9 Похожие записи
PCF8574 — I2C модуль для LCD на базе HD44780
Микросхема PCF8574/PCF8574T обеспечивает расширение портов ввода/вывода для контроллеров через интерфейс I2C и позволит легко решить проблему нехватки цифровых портов. При использовании модуля как расширитель портов ввода/вывода следует учитывать то, что вывод Р3 имеет инверсный выход с открытым коллектором.
Микросхема может использоваться для управления ЖК дисплеем под управлением контроллера HD44780, в 4-х битном режиме. Для этой цели на плате установлена микросхема PCF8574, которая является преобразователем шины I2C в параллельный 8 битный порт.
Плата модуля разведена таким образом, чтобы ее можно было сразу подключить к ЖКИ. На вход подается питание и линии I2C. На плате сразу установлены подтягивающие резисторы на линиях SCL и SDA, потенциометр для регулировки контрастности и питание самого дисплея. Джампер справа включает/отключает подсветку.
Установка библиотеки LiquidCrystal I2C
Для работы с данным модулем необходимо установить библиотеку LiquidCrystal I2C. Скачиваем, распаковываем и закидываем в папку libraries в папке Arduino. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.
Библиотеку можно установить из самой среды следующим образом:
- В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…
- В строке поиска вводим «LiquidCrystal I2C», находим библиотеку Фрэнка де Брабандера (Frank de Brabander), выбираем последнюю версию и кликаем Установить.
- Библиотека установлена (INSTALLED).
Описание методов библиотеки 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);
init()
Инициализация ЖК-дисплея.
void init();
backlight()
Включение подсветки дисплея.
void backlight();
setCursor(uint8_t, uint8_t)
Установка позиции курсора.
void setCursor(uint8_t, uint8_t);
clear()
Возвращает курсор в начало экрана.
void clear();
home()
Возвращает курсор в начало экрана и удаляет все, что было на экране до этого.
void home();
write(uint8_t)
Позволяет вывести одиночный символ на экран.
#if defined(ARDUINO) && ARDUINO >= 100 virtual size_t write(uint8_t); #else virtual void write(uint8_t); #endif
cursor()
Показывает курсор на экране.
void cursor();
noCursor()
Скрывает курсор на экране.
void noCursor();
blink()
Курсор мигает (если до этого было включено его отображение).
void blink();
noBlink()
Курсор не мигает (если до этого было включено его отображение).
void noBlink();
display()
Позволяет включить дисплей.
void display();
noDisplay()
Позволяет отключить дисплей.
void noDisplay();
scrollDisplayLeft()
Прокручивает экран на один знак влево.
void scrollDisplayLeft();
scrollDisplayRight()
Прокручивает экран на один знак вправо.
void scrollDisplayRight();
autoscroll()
Позволяет включить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
void autoscroll();
noAutoscroll()
Позволяет выключить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
void noAutoscroll();
leftToRight()
Установка направление выводимого текста — слева направо.
void leftToRight();
rightToLeft()
Установка направление выводимого текста — справа налево.
void rightToLeft();
createChar(uint8_t, uint8_t[])
Создает символ. Первый параметр — это номер (код) символа от 0 до 7, а второй — массив 8 битовых масок для создания черных и белых точек.
void createChar(uint8_t, uint8_t[]);
Подключение 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 | Жёлтый |
Схема подключения LCD1602 к Arduino по I2C
Пример скетча
/* Добавляем необходимые библиотеки */ #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); }
Результат
Создание собственных символов
С выводом текста разобрались, буквы английского алфавита зашиты в память контроллера. А вот что делать если нужного символа в памяти контроллера нет? Требуемый символ можно сделать вручную. Данный способ частично, ограничение в 7 символов, поможет решить проблему вывода.
Ячейка, в рассматриваемых нами дисплеях, имеет разрешение 5х8 точек. Все, к чему сводится задача создания символа, это написать битовую маску и расставить в ней единички в местах где должны гореть точки и нолики где нет.
Пример скетча
/* Добавляем необходимые библиотеки */ #include <LiquidCrystal_I2C.h> extern uint8_t bell[8]; extern uint8_t note[8]; extern uint8_t clock[8]; extern uint8_t heart[8]; extern uint8_t duck[8]; extern uint8_t check[8]; extern uint8_t cross[8]; extern uint8_t retarrow[8]; /* Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки */ LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { /* Инициализируем ЖК-дисплей */ lcd.init(); /* Включаем подсветку дисплея */ lcd.backlight(); /* Добавляем символы */ lcd.createChar(0, bell); lcd.createChar(1, note); lcd.createChar(2, clock); lcd.createChar(3, heart); lcd.createChar(4, duck); lcd.createChar(5, check); lcd.createChar(6, cross); lcd.createChar(7, retarrow); /* Устанавливаем курсор на первую строку и нулевой символ. */ lcd.home(); /* Выводим на экран строку */ lcd.print("Hello world..."); } void loop() { static char i = 0; /* Устанавливаем курсор на вторую строку и 'i' символ. */ lcd.setCursor(i, 1); /* Выводим на экран символ с номером 'i' */ lcd.print(i); /* Ждём секунду */ delay(1000); if (i == 7) { /* Очищаем вторую строку после вывода всех символов */ i = 0; lcd.setCursor(0, 1); for (char j = 0; j < 16; j++) { lcd.print(' '); } } else { i++; } } /* ..O.. .OOO. .OOO. .OOO. OOOOO ..... ..O.. */ uint8_t bell[8] = { 0b00100, 0b01110, 0b01110, 0b01110, 0b11111, 0b00000, 0b00100 }; /* ...O. ...OO ...O. .OOO. OOOO. .OO.. ..... */ uint8_t note[8] = { 0b00010, 0b00011, 0b00010, 0b01110, 0b11110, 0b01100, 0b000000000 }; /* ..... .OOO. O.O.O O.OOO O...O .OOO. ..... */ uint8_t clock[8] = { 0b00000, 0b01110, 0b10101, 0b10111, 0b10001, 0b01110, 0b00000 }; /* ..... .O.O. OOOOO OOOOO .OOO. ..O.. ..... */ uint8_t heart[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000 }; /* ..... .OO.. OOO.O .OOOO .OOOO ..OO. ..... */ uint8_t duck[8] = { 0b00000, 0b01100, 0b11101, 0b01111, 0b01111, 0b00110, 0b00000 }; /* ..... ....O ...OO O.OO. OOO.. .O..O ..... */ uint8_t check[8] = { 0b00000, 0b00001, 0b00011, 0b10110, 0b11100, 0b01001, 0b00000 }; /* ..... OO.OO .OOO. ..O.. .OOO. OO.OO ..... */ uint8_t cross[8] = { 0b00000, 0b11011, 0b01110, 0b00100, 0b01110, 0b11011, 0b00000 }; /* ....O ....O ..O.O .O..O OOOOO .O..O ..O.. */ uint8_t retarrow[8] = { 0b00001, 0b00001, 0b00101, 0b01001, 0b11111, 0b01001, 0b00100 };
Результат
Проблемы подключения LCD1602 к Arduino по I2C
Если после загрузки скетча у вас не появилось никакой надписи на дисплее, попробуйте выполнить следующие действия:
- Можно регулировать контрастность индикатора потенциометром. Часто символы просто не видны из-за режима контрастности и подсветки.
- Проверьте правильность подключения контактов, подключено ли питание подсветки. Если вы использовали отдельный I2C переходник, то проверьте еще раз качество пайки контактов.
- Проверьте правильность I2C адреса. Попробуйте сперва поменять в скетче адрес устройства с 0x20 до 0x27 для PCF8574 или с 0x38 до 0x3F для PCF8574A. Если и это не помогло, можете запустить скетч I2C сканера, который просматривает все подключенные устройства и определяет их адрес методом перебора. Для изменения адресации необходимо установить джамперы в нужное положение, тем самым притянуть выводы A0, A1, A2 к положительному либо отрицательному потенциалу. На плате положения промаркированы.
-
Если экран все еще останется нерабочим, попробуйте подключить LCD обычным образом.
Материалы
datasheets PCF8574.pdf
LiquidCrystal_I2C
Добрый день.
Большой проект Color and Code версии 19. Определение элементов по цвету, коду, справочники, включая Arduino.
Есть встроенный калькулятор LCD1602 символов, генерация программной строки….
Может кому пригодится https://colorandcode.su
Автор, огромнейшее тебе спасибо за совет, ты единственный из двух миллионов, кто подсказал поиграться потенциометром для регулировки контрастности, я уже голову сломал, перепробовал миллион скетчей, но шрифт так и не отображался, как раз из за низкой контрастности шрифта не было вообще видно