====== Цветной графический TFT-экран 240×320 ======
Используйте [[amp>product/tft-color-display-320x240?utm_source=man&utm_campaign=tft&utm_medium=wiki|цветной графический TFT-дисплей]] для отображения текста и графических элементов: иконок, картинок, графиков, кадров анимации.{{ :продукты:tft-lcd-240x320:tft01-22sp_overvew.jpg?nolink |}}
===== Видеообзор =====
{{youtube>EYP4E9p1-co?large}}
===== Подключение и настройка =====
{{:продукты:magic-fogg.png?nolink |}}**//Внимание!//**
Дисплей работает от источника питания 5 вольт, а работа логики — 3,3 вольта. Если вы используете Arduino c 5-вольтовой логикой, то подключайте управляющие пины дисплея к Arduino через резистивные делители. В противном случае TFT-экран может выйти из строя. Для плат с 3,3 вольтовой логикой резистивные делители не нужны.
В качестве примера возьмём управляющую платформу Arduino Uno. Общение с TFT-экраном происходит через шину SPI. Подключаем управляющие пины к Arduino через делители напряжения, чтобы не повредить дисплей. Руководствуйтесь схемой ниже:
{{ :продукты:tft-lcd-240x320:display_scheme.png?nolink |}}
Для облегчения работы с TFT-экраном используйте библиотеку [[https://github.com/amperka/UTFT|UTFT]], которая включает в себя разнообразные готовые примеры. Библиотека подходит как для работы с контроллерами, основанными на AVR-платформе, так и с контроллерами на ARM-платформе.
===== Работа с дисплеем =====
==== Вывод текста ====
Прошейте Arduino скетчем приведённым ниже. В результате на экране вы должны увидеть надпись «HelloWorld».
// библиотека для работы с дисплеем
#include
// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера пинов
// к которым подключаются линии SCK, SDI (MOSI), D/C, RESET, CS
UTFT myGLCD(TFT01_22SP, 9, 8, 12, 11, 10);
// объявления встроенного шрифта
extern uint8_t BigFont[];
void setup()
{
// инициализируем дисплей
myGLCD.InitLCD();
// очищаем экран
myGLCD.clrScr();
// выбираем тип шрифта
myGLCD.setFont(BigFont);
// печатаем «Hello, world!» в центре верхней строки дисплея
myGLCD.print("Hello, world!", CENTER, 0);
}
void loop()
{
}
Метод ''InitLCD'' – инициализирует дисплей и задает горизонтальную или вертикальную ориентацию. В качестве параметра указывается идентификатор ориентации. Будучи заданной без параметров команда устанавливает горизонтальную ориентацию. Если указать параметр PORTRAIT или 0 – будет выбрана вертикальная ориентация, если указать LANDSCAPE или 1 – горизонтальная.
Метод ''clrScr'' – очищает дисплей, стирая всю отображаемую на дисплее информацию и заливает его черным цветом. Параметров не имеет.
Метод ''print'' – выводит на дисплей текст, содержимое символьной переменной или объекта типа String. В качестве параметров передаются выводимый текст, координаты верхнего левого угла области печати.
Эта команда предназначена для вывода текстовой информации. Координаты печати ''X'' и ''Y'' задаются в пикселях и могут быть переданы как явно, так и через целочисленные переменные или выражения. Существуют также три предопределенных идентификатора, предназначенные для использования в качестве координаты ''X'':
* ''LEFT'' – текст выравнивается по левой границе дисплея
* ''CENTER'' – текст выравнивается по центру дисплея
* ''RIGHT'' – текст выравнивается по правой границе дисплея
=== Встроенные шрифты ===
Библиотека ''UTFT'' позволяет работать с подгружаемыми шрифтами. Шрифты хранятся в виде массивов данных, которые размещаются в отдельных файлах и подключаются к тексту программы. Исходная библиотека включает 3 шрифта.
* SmallFont – 95 символов 8×12
* BigFont – 95 символов 16×16
* SevenSegNumFont – 10 цифровых символов 32×50
Выводим текст с разными шрифтами и изменяем их ориентацию на дисплее:
// библиотека для работы с дисплеем
#include
// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера пинов
// к которым подключаются линии SCK, SDI (MOSI), D/C, RESET, CS
UTFT myGLCD(TFT01_22SP, 9, 8, 12, 11, 10);
// объявления встроенных шрифтов
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
void setup()
{
}
void loop()
{
// инициализируем дисплей с вертикальной ориентацией
myGLCD.InitLCD(0);
// очищаем экран
myGLCD.clrScr();
// выбираем большой шрифт
myGLCD.setFont(BigFont);
// печатаем строку в центре верхней строки дисплея
myGLCD.print("TFT01_22SP", CENTER, 0);
// выбираем большой шрифт
myGLCD.setFont(SmallFont);
// печатаем строку в указанной строке позиции
myGLCD.print("Hello from Amperka!", CENTER, 50);
// выбираем семисегментный шрифт
myGLCD.setFont(SevenSegNumFont);
// печатаем строку в указанной строке позиции
myGLCD.print("12345", CENTER, 100);
// ждём 1 секунду
delay(1000);
// инициализируем дисплей с горизонтальной ориентацией
myGLCD.InitLCD(1);
// очищаем экран
myGLCD.clrScr();
// выбираем большой шрифт
myGLCD.setFont(BigFont);
// печатаем строку в центре верхней строки дисплея
myGLCD.print("Hello, user!", CENTER, 0);
// выбираем большой шрифт
myGLCD.setFont(SmallFont);
// печатаем строку в указанной строке позиции
myGLCD.print("The screen is 2.2 diagonal", CENTER, 50);
// выбираем семисегментный шрифт
myGLCD.setFont(SevenSegNumFont);
// печатаем строку в указанной строке позиции
myGLCD.print("67890", CENTER, 100);
// ждём 1 секунду
delay(1000);
}
=== Система кодирования цветов ===
У каждого метода, отвечающего за цветность, есть три параметра: R, G, B. Допустимые значения для параметров – от 0 до 255. Задавайте уровень каждого цвета вручную или используйте готовые идентификаторы:
^ Идентификатор цвета ^ Цвет ^
| VGA_SILVER | серебряный |
| VGA_GRAY | серый |
| VGA_WHITE | белый |
| VGA_MAROON | красно-коричневый |
| VGA_RED | красный |
| VGA_PURPLE | пурпурный |
| VGA_FUCHSIA | фуксия |
| VGA_GREEN | зеленый |
| VGA_LIME | лайм |
| VGA_NAVY | темно-синий |
| VGA_BLUE | синий |
| VGA_TEAL | сине-зеленый |
| VGA_AQUA | морская волна |
Добавим красок в строку «HelloWorld» и выведем несколько цветовых вариантов.
// библиотека для работы с дисплеем
#include
// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера пинов
// к которым подключаются линии SCK, SDI (MOSI), D/C, RESET, CS
UTFT myGLCD(TFT01_22SP, 9, 8, 12, 11, 10);
// объявления встроенного шрифта
extern uint8_t BigFont[];
void setup()
{
// инициализируем дисплей с вертикальной ориентацией
myGLCD.InitLCD(0);
// очищаем экран
myGLCD.clrScr();
// выбираем большой шрифт
myGLCD.setFont(BigFont);
// устанавливаем красный цвет «чернил» для печати и рисования
myGLCD.setColor(VGA_RED);
// печатаем строку в указанной строке позиции
myGLCD.print("Hello, World!", CENTER, 0);
// устанавливаем синий цвет «чернил» для печати и рисования
myGLCD.setColor(VGA_BLUE);
// печатаем строку в указанной строке позиции
myGLCD.print("Hello, World!", CENTER, 36);
// устанавливаем зелёный цвет «чернил» для печати и рисования
myGLCD.setColor(VGA_GREEN);
// печатаем строку в указанной строке позиции
myGLCD.print("Hello, World!", CENTER, 72);
// устанавливаем серебряный цвет «чернил» для печати и рисования
myGLCD.setColor(VGA_SILVER);
// печатаем строку в указанной строке позиции
myGLCD.print("Hello, World!", CENTER, 108);
}
void loop()
{
}
=== Поворот строки ===
Опциональный параметр метода ''print'' позволяет печатать строки под углом от 0 до 359 градусов. Вращение задается относительно координат печати (левый верхний угол). Нулевое значение угла приводит к горизонтальной печати, далее, по мере увеличения угла, происходит вращение текста по часовой стрелке на заданный угол. Приведенный ниже пример позволяет получить необычный графический эффект:
// библиотека для работы с дисплеем
#include
// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера пинов
// к которым подключаются линии SCK, SDI (MOSI), D/C, RESET, CS
UTFT myGLCD(TFT01_22SP, 9, 8, 12, 11, 10);
// объявления встроенного шрифта
extern uint8_t BigFont[];
void setup()
{
// инициализируем дисплей с вертикальной ориентацией
myGLCD.InitLCD(0);
// очищаем экран
myGLCD.clrScr();
// выбираем большой шрифт
myGLCD.setFont(BigFont);
// устанавливаем зелёный цвет «чернил» для печати и рисования
myGLCD.setColor(VGA_GREEN);
}
void loop()
{
// каждый цикл печатаем строку с поворотам на 20 градусов
for (int deg = 0; deg < 360; deg += 20) {
String text = "Amperka";
myGLCD.print(text, 120, 160, deg);
}
}
Методы печати не определяют выход за пределы дисплея. Так что за максимальной длиной строки придется следить самостоятельно. Если строка окажется слишком длинной, её «хвост» будет выводится поверх уже напечатанного текста.
==== Вывод геометрических фигур ====
Программно вывод геометрических фигур реализован через методы библиотеки ''UTFT'', которые используют попиксельный вывод, массив 240x320 точек.
^ Метод ^ Описание ^ Параметры ^
| ''drawPixel(x, y)'' | Вывод пикселя | x, y координата пикселя |
| ''drawLine(x1, y1 ,x2 ,y2)'' | Вывод линии | x1, y1 и x2, y2 координаты начальной и конечной точки линии |
| ''drawRect(x1, y1 ,x2 ,y2)'' | Вывод прямоугольника | x1, y1 и x2, y2 координаты двух противоположных углов |
| ''drawFillRect(x1, y1 ,x2 ,y2)'' | Вывод закрашенного прямоугольника | x1, y1 и x2, y2 координаты двух противоположных углов |
| ''drawCircle(x, y, r)'' | Вывод окружности | x, y координаты центра окружности, r радиус |
| ''drawfillCircle(x, y, r)'' | Вывод закрашенной окружности | x, y координаты центра окружности, r радиус |
Выведем их на экран.
// библиотека для работы с дисплеем
#include
// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера пинов
// к которым подключаются линии SCK, SDI (MOSI), D/C, RESET, CS
UTFT myGLCD(TFT01_22SP, 9, 8, 12, 11, 10);
void setup()
{
// инициализируем дисплей с вертикальной ориентацией
myGLCD.InitLCD(0);
// очищаем экран
myGLCD.clrScr();
}
void loop()
{
// устанавливаем чёрный цвет «чернил» для печати и рисования
myGLCD.setColor(0, 0, 0);
// вывод закрашенного прямоугольника
myGLCD.fillRect(1, 1, 240, 320);
// выводим 5 прямоугольников разными цветами
for (int i = 1; i < 6; i++) {
switch (i) {
case 1:
myGLCD.setColor(255, 0, 255);
break;
case 2:
myGLCD.setColor(255, 0, 0);
break;
case 3:
myGLCD.setColor(0, 255, 0);
break;
case 4:
myGLCD.setColor(0, 0, 255);
break;
case 5:
myGLCD.setColor(255, 255, 0);
break;
}
myGLCD.fillRect(40+(i*20), 30+(i*20), 100+(i*20), 90+(i*20));
}
delay(2000);
// устанавливаем чёрный цвет «чернил» для печати и рисования
myGLCD.setColor(0, 0, 0);
// вывод закрашенного прямоугольника
myGLCD.fillRect(1, 1, 240, 320);
// выводим 5 прямоугольников разными цветами
for (int i = 1; i < 6; i++) {
switch (i) {
case 1:
myGLCD.setColor(255, 0, 255);
break;
case 2:
myGLCD.setColor(255, 0, 0);
break;
case 3:
myGLCD.setColor(0, 255, 0);
break;
case 4:
myGLCD.setColor(0, 0, 255);
break;
case 5:
myGLCD.setColor(255, 255, 0);
break;
}
myGLCD.fillCircle(170-(i*20), 60+(i*20), 30);
}
delay(2000);
}
Мы рассмотрели команды рисования графических примитивов. Кстати, для библиотеки ''UTFT'' существует дополнение UTFT_Geometry, которое позволяет выводить на дисплей треугольники (контурные и заполненные), дуги окружностей и сектора кругов.
==== Вывод изображений ====
Метод ''drawBitmap'' позволяет выводить на дисплей специально подготовленное растровое изображение. В качестве параметров задаются координаты верхнего левого угла изображения, его размеры и имя массива, в котором хранится закодированное изображение. Опциональный параметр scale позволяет управлять масштабированием изображения при выводе на дисплей.
Подготовим изображение для вывода на дисплей. Нам понадобиться графический редактор [[http://gimp.org|GIMP]] и утилита ''ImageConverter565'', которая поставляется вместе с библиотекой и располагается в папке Tools.
* В графическом редакторе GIMP откройте картинку, которую хотите отобразить на дисплее.
* Преобразуйте картинку до размеров дисплея, не больше чем 240x320. Советуем изменить только один параметр, второй автоматически откалибруется сам. Это позволит сохранить пропорции изображения.
* Теперь выставьте размер холста 240x320. Если всё сделано правильно, картинка не должна выходить за пределы холста.
* Сохраните изображение в формате .jpeg и откройте в программе ImageConverter565.
* Изображение размером 240x320 пикселей займет непозволительно много места в памяти контроллера, поэтому мы уменьшим его в 2 раза (120x160 пикселей) и воспользуемся масштабированием. Для этого установите флаг «Reduce size to» и задайте требуемые размеры картинки (120x160).
* В переключателе «Save As» выберем «.c»
* Для AVR-платформы, в переключателе «Target Board» выберем «AVR», для ARM-платформу — «ARM/PIC32»
* В поле «Array Name» задайте имя картинки и нажмите «Save».
В результате работы конвертера вы получите файл с расширением «.c», в котором будет храниться информация о картинке и закодированное изображение. Поместите этот файл в папку Вашего проекта и объявите в программе массив при помощи спецификатора ''extern'' так же, как мы это делали для шрифтов. Только в квадратных скобках обязательно нужно указать размер массива в 16-ричном формате. Это значение находится в первом элементе массива, его можно посмотреть открыв полученный в результате конвертирования файл в любом текстовом редакторе.
Не забудьте после копирования и подключения массива закрыть и снова открыть файл программы. При этом файл массива откроется на соседней вкладке рядом с текстом программы.
Теперь выведем изображение на дисплей:
// библиотека для работы с дисплеем
#include
// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера пинов
// к которым подключаются линии SCK, SDI (MOSI), D/C, RESET, CS
UTFT myGLCD(TFT01_22SP, 9, 8, 12, 11, 10);
// объявления встроенного шрифта
extern uint8_t BigFont[];
// объявления двух массив изображений
extern unsigned int amperka[0x400];
extern unsigned int raspberry[0x400];
void setup()
{
// инициализируем дисплей с горизонтальной ориентацией
myGLCD.InitLCD();
}
void loop()
{
// закрашиваем дисплей белым цветом
myGLCD.fillScr(255, 255, 255);
int x = 0;
for (int s = 0; s < 4; s++) {
x += (s*32);
myGLCD.drawBitmap(x, 0, 32, 32, amperka, s+1);
}
x = 0;
for (int s = 4; s > 0; s--) {
myGLCD.drawBitmap(x, 224-(s*32), 32, 32, raspberry, s);
x += (s*32);
}
delay(1000);
}
===== Характеристики =====
* Наименование: TFT01-22SP
* Контроллер: ILI9340C
* Диагональ: 2,2 дюйма
* Напряжение питание: 5 В
* Напряжение сигналов: 3,3 В
* Разрешение: 320×240 (RGB)
* Интерфейс: SPI
* Дополнительно: разъём для SD-карты
* Размер экрана: 48×37 мм
* Размер модуля: 67×40 мм
===== Ресурсы =====
* [[amp>product/tft-color-display-320x240?utm_source=man&utm_campaign=tft&utm_medium=wiki|Цветной графический TFT-экран 320×240 / 2,2”]] в магазине.
* [[https://github.com/amperka/UTFT|Библиотека для работы с Arduino]]
===== Заметки на полях =====
* При длительной работе в закрытом корпусе возможен нагрев экрана. Нагрев можно уменьшить, если отключить подсветку экрана, или делать её менее яркой при помощи PWM через какой-нибудь транзистор в те моменты, когда экран не используется.