OLED I2C 128 x 64 px – схема подключения к Arduino
В небольших устройствах тоже бывает нужно вывести какую-либо полезную информацию, сохраняя компактные габариты.
Обычные экраны, вроде Nokia 3310, не обеспечивают достаточного разрешения, к тому же их не видно в темноте.
В различных плеерах, электронных сигаретах и прочем давно уже используют компактные OLED-дисплеи с большим для их габаритов разрешением – так чем наши проекты хуже?
Важным плюсом OLED-экранов является работа без подсветки – каждый пиксель – сам себе подсветка. За счёт такой системы, экран потребляет крайне мало тока (фактически, его можно запитать от пина Arduino). Есть и один минус – при постоянном использовании отдельные пиксели начинают выгорать и терять яркость, но до наступления этого состояния вы успеете отладить и вывести всё, что только можно.
Дисплей подключается по высокоскоростному интерфейсу I2C (относительно высокоскоростному – до 400Кбод) и использует всего 2 сигнальных провода. Это ещё один неоспоримый плюс! Несмотря на то, что интерфейс последовательный, да ещё и данные в обе стороны идут по одной линии, на рядовой Arduino можно достичь порядка 15-20fps, чего более чем достаточно для проектов.
Стоит заметить, что дисплей монохромный – цветные картинки на него не выведешь, а для текста или графика хватит и двух цветов.
Всего у дисплея 4 пина – VCC, GND, SDA, SCL. VCC и GND подключаются к VCC и GND Arduino соответственно (чтобы перестраховаться, лучше питать дисплей от пина 3.3В – не на всех модулях стоят понижающие преобразователи), а линии данных находятся у каждой версии Arduino на разных пинах. У Uno (Nano, Pro Mini и других платах на ATMega328/168) SDA – A4, SCL – A5. У Mega – SDA – 20, SCL – 21.
На платах 3 ревизии контакты интерфейса выведены перед 13 пином на гребёнке и подписаны соответственно.
Для экрана написано множество библиотек, его поддерживает в том числе и универсальная U8g2.
Для управления дисплеем нам потребуются две библиотеки:
1) Adafruit_GFX_Library — мы её уже ставили, когда подключали Nokia 5110
2) Adafruit_SSD1306 — библиотека для управления именно OLED дисплеями
Устанавливаем обе библиотеки в Arduino IDE, и пробуем вывести наш любимый «Hello world!»:
Схема подключения OLED 128 x 64 к Arduino #include «SPI.h»
#include «Wire.h»
#include «Adafruit_GFX.h»
#include «Adafruit_SSD1306.h»
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
void setup() {
// инициализация и очистка дисплея
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
delay(1000);
display.setTextSize(1); // установка размера шрифта
display.setTextColor(WHITE); // установка цвета текста
display.setCursor(0,0); // установка курсора
display.println(«Hello, world!»);
display.display();
}
void loop() {
}
#include «Adafruit_GFX.h»#include «Adafruit_SSD1306.h»Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);// инициализация и очистка дисплеяdisplay.begin(SSD1306_SWITCHCAPVCC);display.setTextSize(1); // установка размера шрифтаdisplay.setTextColor(WHITE); // установка цвета текстаdisplay.setCursor(0,0); // установка курсораdisplay.println(«Hello, world!»); |
Ответить
Библиотеки для работы с i2c LCD дисплеем
Для взаимодействие Arduino c LCD 1602 по шине I2C вам потребуются как минимум две библиотеки:
- Библиотека Wire.h для работы с I2C уже имеется в стандартной программе Arduino IDE.
- Библиотека LiquidCrystal_I2C.h, которая включает в себя большое разнообразие команд для управления монитором по шине I2C и позволяет сделать скетч проще и короче. Нужно дополнительно установить библиотеку После подключения дисплея нужно дополнительно установить библиотеку LiquidCrystal_I2C.h
После подключения к скетчу всех необходимых библиотек мы создаем объект и можем использовать все его функции. Для тестирования давайте загрузим следующий стандартный скетч из примера.
#include <Wire.h> #include <LiquidCrystal_I2C.h> // Подключение библиотеки //#include <LiquidCrystal_PCF8574.h> // Подключение альтернативной библиотеки LiquidCrystal_I2C lcd(0x27,16,2); // Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой //LiquidCrystal_PCF8574 lcd(0x27); // Вариант для библиотеки PCF8574 void setup() { lcd.init(); // Инициализация дисплея lcd.backlight(); // Подключение подсветки lcd.setCursor(0,0); // Установка курсора в начало первой строки lcd.print("Hello"); // Набор текста на первой строке lcd.setCursor(0,1); // Установка курсора в начало второй строки lcd.print("ArduinoMaster"); // Набор текста на второй строке } void loop() { }
Описание функций и методов библиотеки LiquidCrystal_I2C:
- home() и clear() – первая функция позволяет вернуть курсор в начало экрана, вторая тоже, но при этом удаляет все, что было на мониторе до этого.
- write(ch) – позволяет вывести одиночный символ ch на экран.
- cursor() и noCursor() – показывает/скрывает курсор на экране.
- blink() и noBlink() – курсор мигает/не мигает (если до этого было включено его отображение).
- display() и noDisplay() – позволяет подключить/отключить дисплей.
- scrollDisplayLeft() и scrollDisplayRight() – прокручивает экран на один знак влево/вправо.
- autoscroll() и noAutoscroll() – позволяет включить/выключить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
- leftToRight() и rightToLeft() – Установка направление выводимого текста – слева направо или справа налево.
- createChar(ch, bitmap) – создает символ с кодом ch (0 – 7), используя массив битовых масок bitmap для создания черных и белых точек.
Альтернативная библиотека для работы с i2c дисплеем
В некоторых случаях при использовании указанной библиотеки с устройствами, оснащенными контроллерами PCF8574 могут возникать ошибки. В этом случае в качестве альтернативы можно предложить библиотеку LiquidCrystal_PCF8574.h. Она расширяет LiquidCrystal_I2C, поэтому проблем с ее использованием быть не должно.
Скачать библиотеку можно на нашем сайте. Библиотека также встроена в последние версии Arduino IDE.
Исходный код программы
Чтобы в программе подключить ЖК дисплей к ARDUINO UNO, необходимо сделать следующие несколько вещей:
Arduino
#include <LiquidCrystal.h>
lcd.begin(16, 2);
LiquidCrystal lcd(0, 1, 8, 9, 10, 11);
lcd.print(«hello, world!»);
1 |
#include <LiquidCrystal.h> lcd.begin(16,2); LiquidCrystallcd(,1,8,9,10,11); lcd.print(«hello, world!»); |
В первую очередь мы должны подключить заголовочный файл (‘#include <LiquidCrystal.h>’), в котором находятся все необходимые инструкции для взаимодействия с ЖК дисплеем, что значительно упростит взаимодействие с ним в 4 битном режиме. Используя этот заголовочный файл нам не нужно будет передавать в ЖК дисплей бит за битом и нам не нужно будет самим программировать какие-либо функции для взаимодействия с ЖК дисплеем.
Во второй строчке мы должны сказать плате ARDUINO UNO какой тип ЖК дисплея мы собираемся использовать, поскольку существует достаточно большое число типов подобных дисплеев, например, 20×4, 16×2, 16×1 и т.д. В нашем проекте мы собираемся подключать к ARDUINO UNO ЖК дисплей 16х2, поэтому мы и должны записать команду ‘lcd.begin(16, 2);’. А если бы мы подключали ЖК дисплей 16х1, то в этом случае изменилась бы и команда соответствующим образом — ‘lcd.begin(16, 1);’.
В следующей инструкции мы сообщаем плате ARDUINO UNO к каким контактам мы подсоединили ЖК дисплей. В нашем случае мы использовали контакты ЖК дисплея “RS, En, D4, D5, D6, D7”, которые подсоединены к контактам «0, 1, 8, 9, 10, 11» ARDUINO UNO, поэтому и приведенная команда выглядит следующим образом — “LiquidCrystal lcd(0, 1, 8, 9, 10, 11);”.
Для того, чтобы напечатать на экране дисплея строку символов, мы использовали команду lcd.print(«hello, world!»), которая выводит на экран дисплея строку ‘hello, world!’.
Как мы видим из представленного кода, нам не нужно заботиться больше ни о каких аспектах взаимодействия с ЖК дисплеем, нам нужно просто инициализировать ЖК дисплей в программе и тогда плата ARDUINO UNO будет готова к отображению информации на экране дисплея.
Далее представлен исходный код программы (с комментариями) для взаимодействия платы ARDUINO UNO с ЖК дисплеем 16х2.
Arduino
#include <LiquidCrystal.h> // инициализируем библиотеку для взаимодействия с ЖК дисплеем
LiquidCrystal lcd(0, 1, 8, 9, 10, 11); /// сообщаем Arduino номера контактов, к которым подключен ЖК дисплей — REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN
void setup()
{
// устанавливаем число столбцов и строк для ЖК дисплея
lcd.begin(16, 2);
}
void loop()
{
// устанавливаем курсор в нулевой столбец первой строки
lcd.print(» CIRCUIT DIGEST»); //печатаем строку
lcd.setCursor(0, 1); // устанавливаем курсор в нулевой столбец второй строки
lcd.print(«http://www.circuitdigest.com/»);//печатаем строку
delay(750); //задержка на 0.75 сек
lcd.scrollDisplayLeft();// переключаем данные на ЖК дисплее
lcd.setCursor(0, 0);// устанавливаем курсор в нулевой столбец первой строки
}
1 |
#include <LiquidCrystal.h> // инициализируем библиотеку для взаимодействия с ЖК дисплеем LiquidCrystallcd(,1,8,9,10,11);/// сообщаем Arduino номера контактов, к которым подключен ЖК дисплей — REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN voidsetup() { // устанавливаем число столбцов и строк для ЖК дисплея lcd.begin(16,2); } voidloop() { // устанавливаем курсор в нулевой столбец первой строки lcd.print(» CIRCUIT DIGEST»);//печатаем строку lcd.setCursor(,1);// устанавливаем курсор в нулевой столбец второй строки lcd.print(«http://www.circuitdigest.com/»);//печатаем строку delay(750);//задержка на 0.75 сек lcd.scrollDisplayLeft();// переключаем данные на ЖК дисплее lcd.setCursor(,);// устанавливаем курсор в нулевой столбец первой строки } |
How To Program For LCD
#include <LiquidCrystal.h>
Define which Arduino’s pin connected to six LCD’s pins: RS, EN, D4, D4, D6, D7
const int RS = 11, EN = 12, D4 = 2, D5 = 3, D6 = 4, D7 = 5;
One of the advantages of the library is that Arduino’s pin connected to LCD is settable. This makes it flexible when you connect Arduino with LCD and other sensors/actuators.
Declare a LiquidCrystal object:
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
Set up the LCD’s number of columns and rows.
lcd.begin(16, 2);
Move cursor to the desired position (column_index, row_index)
lcd.setCursor(column_index, row_index);
Print a message to the LCD.
lcd.print(«Hello World!»);
There are many things more that we can do with LCD (see Do More with LCD part)
Элементы платы
Дисплей
Дисплей MT-16S2H-I умеет отображать все строчные и прописные буквы латиницы и кириллицы, а также типографские символы. Для любителей экзотики есть возможность создавать собственные иконки.
Экран выполнен на жидкокристаллической матрице, которая отображает 2 строки по 16 символов. Каждый символ состоит из отдельного знакоместа 5×8 пикселей.
Контроллер дисплея
Матрица индикатора подключена к встроенному чипу КБ1013ВГ6 с драйвером расширителя портов, которые выполняют роль посредника между экраном и микроконтроллером.
Контроллер КБ1013ВГ6 аналогичен популярным чипам зарубежных производителей HD44780 и KS0066, что означает совместимость со всеми программными библиотеками.
I²C-расширитель
Для экономии пинов микроконтроллера на плате дисплея также распаян дополнительный преобразователь интерфейсов INF8574A: микросхема позволит общаться экрану и управляющей плате по двум проводам через интерфейс I²C.
Контакты подключения
На плате дисплея выведено 18 контактов для подведения питания и взаимодействия с управляющей электроникой.
Вывод | Обозначение | Описание |
---|---|---|
1 | GND | Общий вывод (земля) |
2 | VCC | Напряжение питания (5 В) |
3 | VO | Управление контрастностью |
4 | RS | Выбор регистра |
5 | R/W | Выбор режима записи или чтения |
6 | E | Разрешение обращений к индикатору (а также строб данных) |
7 | DB0 | Шина данных (8-ми битный режим)(младший бит в 8-ми битном режиме) |
8 | DB1 | Шина данных (8-ми битный режим) |
9 | DB2 | Шина данных (8-ми битный режим) |
10 | DB3 | Шина данных (8-ми битный режим) |
11 | DB4 | Шина данных (8-ми и 4-х битные режимы)(младший бит в 4-х битном режиме) |
12 | DB5 | Шина данных (8-ми и 4-х битные режимы) |
13 | DB6 | Шина данных (8-ми и 4-х битные режимы) |
14 | DB7 | Шина данных (8-ми и 4-х битные режимы) |
15 | LED+ | Питания подсветки (+) |
16 | LED– | Питания подсветки (–) |
17 | SDA | Последовательная шина данных |
18 | SCL | Последовательная линия тактированния |
Обратите внимания, что физические контакты подсветки экрана и , также интерфейс шины I²C и расположены не в порядком соотношении с другими пинами экрана.
Питание
Экран совместим со всеми контроллерами с логическим напряжением от 3,3 до 5 вольт. Но для питания самого индикатора (пин VCC) необходимо строго 5 вольт
Если в вашем проекте нет линии 5 вольт, обратите внимание на дисплей текстовый экран 16×2 / I²C / 3,3 В.
Интерфейс передачи данных
Дисплей может работать в трёх режимах:
- 8-битный режим — в нём используются и младшие и старшие биты (-)
- 4-битный режим — в нём используются только младшие биты (-)
- I²C режим — данные передаются по протоколу I²C/TWI. Адрес дисплея .
Использовать восьмибитный и четырёхбитный режим в данном дисплее не целесообразно. Ведь главное достоинство этой модели именно возможность подключения через I²C.
Если всё-таки есть необходимость использовать 4-битный или 8-битный режим, читайте документацию на текстовый экран 16×2.
Объединение питания
Для подключения питания к дисплею необходимо пять контактов:
Вывод | Обозначение | Описание |
---|---|---|
1 | GND | Общий вывод (земля) |
2 | VCC | Напряжение питания (5 В) |
3 | VO | Управление контрастностью |
15 | LED+ | Питания подсветки (+) |
16 | LED– | Питания подсветки (–) |
Но если запаять перемычки и на обратной стороне дисплея, количество контактов питания можно сократить до трёх, объединив цепь питания и подсветки дисплея.
Мы взяли этот шаг на себя и спаяли перемычки самостоятельно.
Выбор адреса
Используя шину можно подключить несколько дисплеев одновременно, при этом количество занятых пинов останется прежним.
Для общения с каждым дисплеем отдельно, необходимо установить в них разные адреса. Для смены адреса на обратной стороне дисплея установлены контактные площадки , и .
Капнув припоем на контактные площадки, мы получим один из семи дополнительных адресов:
- нет припоя, соответственно нет электрического контакта.
- есть припой, соответственно есть электрический контакт.
J2 | J1 | J0 | Адрес |
---|---|---|---|
L | L | L | 0x38 |
L | L | H | 0x39 |
L | H | L | 0x3A |
L | H | H | 0x3B |
H | L | L | 0x3C |
H | L | H | 0x3D |
H | H | L | 0x3E |
H | H | H | 0x3F |
Подключение дисплея 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 (ШИМ).
Шаг 1. О проекте
Дисплеи LCD 1602 размера, созданные на базе HD44780 контроллера, в наши дни всё ещё остаются одними из самых доступных, простых и востребованных, чтобы разрабатывать какие бы то ни было электронные устройства.
Неудивительно, что их можно увидеть как в простых, собранных буквально на коленке агрегатах, так и в более серьезных промышленных, например автоматах для приготовления кофе. Именно с таким дисплеем и собираются наиболее популярные модули и шилды по тематике Arduino, например LCD I2C модуль и LCD Keypad Shield.
В следующих шагах подробно с изображениями рассказываем как подключить LCD к Arduino и отобразить на дисплее нужную информацию.
Подключение двух дисплеев по I2C
По умолчанию у всех дисплеев 1602 с модулем I2C адрес — «0x27», но можно изменить адрес текстового экрана и узнать его через сканер iic шины. Таким образом, если у вас есть необходимость подключить к одному микроконтроллеру несколько дисплеев 1602, то следует изменить адреса устройств, что бы не было совпадений. Давайте рассмотрим, каким образом изменить IIC адрес жидкокристаллического дисплея.
Текстовый дисплей 16×2 с модулем I2C
Если перевернуть дисплей и посмотреть на IIC модуль (смотри фото выше), то там можно заметить контакты, обозначенные, как «A0», «A1» и «A2». Если по умолчанию LCD имеет адрес «0x27» на шине IIC, то замкнув перемычку «A0», адрес дисплея сменится на «0x26». Таким образом, к одной шине можно подключить несколько дисплеев, не забыв указать их адреса в скетче — смотри следующий пример кода.
Скетч. Подключение нескольких LCD 1602 к шине i2c
Подключение к Ардуино двух дисплеев 16×2 по I2C
Перед загрузкой следующего скетча, сначала соберите схему с двумя дисплеями и просканируйте шину IIC. Это необходимо сделать, чтобы убедится в том, что плата Arduino «видит» оба устройства на шине. А также перепроверить правильность адресов. После этого можно загружать следующий код, который позволит управлять сразу двумя дисплеями с модулями IIC от одного микроконтроллера Arduino Uno.
#include <Wire.h> // библиотека для шины I2C #include <LiquidCrystal_I2C.h> // библиотека для 16x2 I2C LiquidCrystal_I2C LCD1(0x27, 16, 2); // присваиваем имя первому дисплею LiquidCrystal_I2C LCD2(0x26, 16, 2); // присваиваем имя второму дисплею void setup() { LCD1.init(); // инициализация первого дисплея LCD2.init(); // инициализация второго дисплея LCD1.backlight(); // включение подсветки LCD2.backlight(); // включение подсветки } void loop() { // прокручиваем надпись на первом дисплее LCD1.setCursor(1, 0); LCD1.print("I LOVE ARDUINO"); LCD1.scrollDisplayLeft(); // прокручиваем надпись на втором дисплее LCD2.setCursor(1, 0); LCD2.print("HELLO WORLD"); LCD2.scrollDisplayRight(); delay(300); }
Суть соединения дисплея с Ардуино
Display для Аrduino – это одно из самых простых устройств, которое можно использовать для отображения результатов проектов. Однако есть два различных типа данного устройства: графические и символьные. В этой статье используется персональный экран, так как он легче всего работает. Кроме того, в зависимости от размера экрана, существуют разные типы:
- 16×2 символьный – 16 колонок и 2 строки;
- 20×4 символов – 20 колонок и 4 строки.
Они также доступны в разных цветах:
- Зеленые с черными символами.
- Синие с белыми символами.
- Красные с черными символами.
Тем не менее, зеленые и синие экраны являются наиболее распространенными. Другие цвета встречаются редко. В этом уроке используется Аrduino display с синим символом 20×4. Микропроцессор взаимодействует с экраном через четыре линии передачи данных. Мы задействуем цифровые контакты на микроконтроллере, чтобы взаимодействовать с дисплеем и отображать на нем то, что мы хотим.
Подсветка на ЖК-дисплее активируется, когда дается питание 5 В от микроконтроллера до 15 на мониторе и заземляющим штырем 16. Кроме того, для регулировки контрастности сенсорного дисплея для Ардуино нужен потенциометр 10K.
Скетч и библиотека для работы с дисплеем
Функция | Назначение |
LCD5110(SCK, MOSI, DC, RST, CS) | Объявление дисплея с указанием пинов подключения. |
InitLCD() | Инициализация дисплея с опциональным указанием контрастности (0-127), по умолчанию используется значение 70. |
setContrast(contrast) | Изменение контрастности (0-127). |
enableSleep() | Переводит экран в спящий режим. |
disableSleep() | Выводит экран из спящего режима. |
clrScr() | Очищает экран. |
clrRow(row, , ) | Очищает выбраную строку (номер row), от позиции start до end (опционально). |
invert(true), invert(false) | Включает и выключает инверсию содержимого LCD экрана. |
print(string, x, y) | Выводит строку символов (string) с заданными координатами (x, y); вместо x-координаты можно использовать LEFT, CENTER и RIGHT; высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8. |
printNumI(num, x, y, , ) | Выводит целое число (num) на экран на заданной позиции (x, y); опционально: length – количество символов, резервируемых для числа; filler – символ для заполнения «пустот», если число меньше желаемой длины length (по умолчанию это пробел ” “). |
printNumF(num, dec, x, y, , , ) | Выводит число (num) с плавающей запятой; dec – число знаков после запятой; опционально: divider – знак десятичного разделителя, по умолчанию точка “.”, length и filler – по аналогии с предыдущей функцией. |
setFont(name) | Выбирает шрифт; встроенные шрифты – SmallFont, MediumNumbers и BigNumbers. |
invertText(true), invertText(false) | Инвертирует текст, выведенный с помощью функций print, printNumI и printNumF (вкл./выкл.). |
drawBitmap(x, y, data, sx, sy) | Выводит картинку на экран по необходимым координатам (x, y); data – массив, содержащий картинку; sx и sy – ширина и высота рисунка. |
Рассмотрим работу с дисплеем с помощью данной библиотеки на примере простого скетча:
#include <LCD5110_Basic.h> LCD5110 LCD(7, 6, 5, 4, 3); //обьявляем дисплей с указанием пинов подключения extern uint8_t SmallFont[]; //указываем наличие массива со шрифтом SmallFont в библиотеке extern uint8_t MediumNumbers []; //указываем наличие массива со шрифтом MediumNumbers в библиотеке void setup() { LCD.InitLCD(); //инициализируем дисплей } void loop() { LCD.disableSleep(); //выводим дисплей из режима сна LCD.clrScr(); //очищаем дисплей LCD.setFont(SmallFont); //устанавливаем шрифт SmallFont LCD.print(“Hello World!”, CENTER, 2); //выводим “Hello World!” на второй строчке с равнением по центру LCD.setFont(MediumNumbers); // устанавливаем шрифт MediumNumbers for (int i=0; i<=5; i++) { LCD.clrScr(); //очищаем экран LCD.print(i, CENTER, 20); //выводим значение i по центру 20 строчки delay(1000); } LCD.enableSleep(); //вводим дисплей в режим сна на время длительной паузы delay(5000); }
После того как мы рассмотрели базовые функции библиотеки, остановимся более подробно на функции drawBitmap и рассмотрим особенности вывода изображений на экран.
Для начала нам понадобится интересующее изображение в формате .bmp.
Далее необходимо скачать программу Image Generate от Alex_EXE по адресу https://alex-exe.ru/programm/image-generate/. В окне программы устанавливаем необходимое разрешение нашего изображения на дисплее (должно быть меньше, чем 84 пикселя по горизонтали и 48 по вертикали), нажимаем «установить новый размер».
Нажимаем «установить новый размер»
После этого нажимаем «Картинка», «Открыть», выбираем наш файл, жмем «преобразовать».
Жмем «преобразовать»
Нажимаем «Применить».
Нажимаем «Применить»
Теперь жмем на кнопку «Массив» и копируем появившийся массив в новый скетч.
Теперь жмем на кнопку «Массив» и копируем появившийся массив в новый скетч
#include <LCD5110_Basic.h> LCD5110 LCD(7, 6, 5, 4, 3); //обьявляем дисплей с указанием пинов подключения static const char lcd_image_mas = {} //массив с изображением void setup() { LCD.InitLCD(); //инициализируем дисплей } void loop() { LCD.clrScr(); //очищаем дисплей LCD.drawBitmap(18, 0, lcd_image_mas, 48, 48); //выводим изображение из массива размером 48х48 пикселей начиная с точки 18х0 LCD.enableSleep(); //вводим дисплей в режим сна while(1); }
Генерация пользовательских символов для 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));
Подключение ЖК экрана к Ардуино по I2C
Для подключения необходимы сама плата Ардуино, дисплей, макетная плата, соединительные провода и потенциометр.
Если вы используете специальный отдельный i2c переходник, то нужно сначала припаять его к модулю экрана. Ошибиться там трудно, можете руководствоваться такой схемой.
Жидкокристаллический монитор с поддержкой i2c подключается к плате при помощи четырех проводов – два провода для данных, два провода для питания.
- Вывод GND подключается к GND на плате.
- Вывод VCC – на 5V.
- SCL подключается к пину A5.
- SDA подключается к пину A.
И это все! Никаких паутин проводов, в которых очень легко запутаться. При этом всю сложность реализации i2C протокола мы можем просто доверить библиотекам.