Общие сведения:
Цветной графический дисплей 2.8 и цветной графический дисплей 2.8 с TouchScreen — дисплеи, разработанные нашей компанией специально для работы с Arduino UNO / MEGA.
Благодаря поддержке огромного количества цветов (более 260 тысяч), а так же библиотекам UTFT и TouchScreen, вы сможете выводить на дисплеи разноцветные фигуры, анимацию, а так же текст (цвет и форму которого вы тоже сможете выбрать).
Дисплеи оснащены преобразователем уровней, благодаря чему вы можете подключать их как к 3В, так и к 5В логике!
Данные дисплеи поддерживают возможность регулировки яркости подсветки, а конструкция их такова, что они удобно устанавливаются в ПВХ-конструктор даже без дополнительной фиксации. Впрочем, если вам понадобится дополнительная жёсткость, то для этого на дисплеях имеется 4 крепёжных петли.
Видео:
Спецификация:
Дисплей без сенсорной панели
- Разрешение: 320x240 точек;
- Цветопередача: 262 тысячи цветов;
- Диагональ: 2.8 дюйма;
- Интерфейс подключения: SPI;
- Крепёжные отверстия: М3;
- Размер: 75мм х 65мм;
Дисплей с сенсорной панелью
- Разрешение: 320x240 точек;
- Цветопередача: 262 тысячи цветов;
- Диагональ: 2.8 дюйма;
- Тип сенсора:резистивный;
- Интерфейс подключения: SPI;
- Крепёжные отверстия: ⌀ 3мм;
- Размер: 75мм х 65мм;
Подключение:
Для удобства подключения к Arduino воспользуйтесь Trema Shield, Trema Power Shield, Motor Shield или Trema Set Shield.
Выводы дисплея без сенсорной панели | Выводы Arduino |
GND (обязательно) | GND |
VCC (обязательно) | 5V |
D/C (обязательно) | Любой вывод |
RST (обязательно) | Любой вывод |
CS (обязательно) | Любой вывод |
SCK (обязательно) | Любой вывод |
MOSI (обязательно) | Любой вывод |
LED (регулировка яркости, опционально) | Любой вывод |
MISO (опционально) | Любой вывод |
Выводы дисплея с сенсорной панелью | Выводы Arduino |
GND (обязательно) | GND |
VCC (обязательно) | 5V |
D/C (обязательно) | Любой вывод |
RST (обязательно) | Любой вывод |
CS (обязательно) | Любой вывод |
SCK (обязательно) | Любой вывод |
MOSI (обязательно) | Любой вывод |
LED (регулировка яркости, опционально) | Любой вывод |
MISO (опционально) | Любой вывод |
YU (Y+) (обязательно) | Любой аналоговый вывод |
XR (X-) (обязательно) | Любой аналоговый вывод |
YD (Y-) (обязательно) | Любой вывод |
XL (X+) (обязательно) | Любой вывод |
Далее, в примерах подключения и в примерах скетчей будет выполнено подключение согласно следующей таблиц:
Выводы дисплея | Выводы Arduino |
GND | GND |
VCC | 5V |
D/C | 4 |
RST | 5 |
CS | 6 |
SCK | 7 |
MOSI | 8 |
LED | 9 |
MISO | 10 (кроме примера с SD картой) |
YU (Y+) | А0 |
XR (X-) | А1 |
YD (Y-) | А2 |
XL (X+) | А3 |
Модуль удобно подключать 3 способами, в зависимости от ситуации:
Способ - 1 : Используя проводной шлейф и Piranha UNO
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO
Дисплей без сенсорной панели
Дисплей с сенсорной панелью
Способ - 2 : Используя проводной шлейф и Shield
Используя 3-х проводные шлейфы "Мама — Мама", к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.
Дисплей без сенсорной панели
Дисплей с сенсорной панелью
Способ - 3 : Используя проводной шлейф и Arduino Mega
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Arduino MEGA
Дисплей без сенсорной панели
Дисплей с сенсорной панелью
Питание:
Данный дисплей питается от постоянного источника напряжения 5В.
Библиотеки для работы с дисплеями:
Для работы с дисплеями существует несколько библиотек, каждая из которых может вам пригодится в разных проектах. Опишем кратко каждую из них:
- Библиотека UTFT для работы с цветными графическими дисплеями (описание функций и примеры смотрите тут)
- Библиотека TouchScreen для работы с сенсорными экранами (описание функций и примеры смотрите тут)
Форм-фактор:
Данный дисплей выпущен в нашем новом формате, который был специально спроектирован с учётом размеров и расположения отверстий в ПВХ-конструкторе, благодаря чему дисплей легко и удобно в нём закрепить.
Помимо этого, мы разработали специально для данных дисплеев крепёжную пластину, которая так же подходит к нашим ПВХ-корпусам Set Box и Set Box XL.
Подробнее о дисплее:
На нашей Wiki имеются статьи, в которых мы очень подробно разобрали все особенности работы с дисплеями того или иного типа. Ниже вы найдёте ссылки на эти статьи:
- Информацию о том, как работать с графическим дисплеем вы найдёте тут.
- Информацию о том, как работать с графическим дисплеем с touchscreen вы найдёте тут.
Координатная сетка
Начало координатной сетки лежит в верхнем левом углу как показано на рисунках ниже.
Примеры:
Вывод текста на дисплей
// подключаем библиотеку UTFT #include <UTFT.h> // Определяем выводы используемые для // управления дисплеем 2.8" TFT 320x240 UNO: #define dispMISO 8 #define dispSCK 7 #define dispCS 6 #define dispRST 5 #define dispDC 4 // подключаем шрифты extern uint8_t SmallFont[]; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFont[]; // объявляем объект myGLCD класса библиотеки UTFT указывая тип дисплея UTFT myGLCD(TFT01_24SP, dispMISO, dispSCK, dispCS, dispRST, dispDC); void setup(){ // инициируем дисплей myGLCD.InitLCD(); } void loop(){ // стираем всю информацию с дисплея myGLCD.clrScr(); // устанавливаем маленький шрифт myGLCD.setFont(SmallFont); // устанавливаем белый цвет текста myGLCD.setColor(VGA_WHITE); // выводим текст на дисплей (выравнивание по ширине - // центр дисплея, координата по высоте 50 точек) myGLCD.print("iarduino.ru | SmallFont", CENTER, 50); // устанавливаем большой шрифт myGLCD.setFont(BigFont); // устанавливаем синий цвет текста myGLCD.setColor(VGA_BLUE); // выводим текст на дисплей (выравнивание по ширине - // центр дисплея, координата по высоте 100 точек) myGLCD.print("BigFont", CENTER, 100); // выводим текст на дисплей (выравнивание по ширине - // центр дисплея, координата по высоте 115 точек) myGLCD.print("iarduino.ru", CENTER, 115); // устанавливаем шрифт имитирующий семисегментный индикатор myGLCD.setFont(SevenSegNumFont); // устанавливаем пурпурный цвет текста myGLCD.setColor(VGA_FUCHSIA); // выводим текст на дисплей (выравнивание по ширине - // центр дисплея, координата по высоте 150 точек) myGLCD.print("1234567890", CENTER, 150); // ждём 20 секунд delay(20000); }
Вывод фигур на дисплей
// подключаем библиотеку UTFT #include <UTFT.h> // Определяем выводы используемые для // управления дисплеем 2.8" TFT 320x240 UNO: #define dispMISO 8 #define dispSCK 7 #define dispCS 6 #define dispRST 5 #define dispDC 4 // объявляем объект myGLCD класса библиотеки UTFT указывая тип дисплея UTFT myGLCD(TFT01_24SP, dispMISO, dispSCK, dispCS, dispRST, dispDC); void setup(){ // инициируем дисплей myGLCD.InitLCD(); myGLCD.clrScr(); } void loop(){ int n = random(7); int j = random(239); for (int i = random(239); i > 0; i--) { // Устанавливаем цвет RGB myGLCD.setColor(i, -i, j); switch (n) { case 0: // Рисуем прямоугольник myGLCD.drawRect(i*j, i, i*j+i, i+j); break; case 1: // Заполняем прямоугольник myGLCD.fillRect(i*j, i, i*j+5, i+5); case 2: // Рисуем круг myGLCD.drawCircle(i*j, i, i/5); break; case 3: // Заполняем круг myGLCD.fillCircle(i*j, i, 5); break; case 4: // Рисуем прямоугольник myGLCD.drawRoundRect(i*j, i, i*j+10, i+10); break; case 5: // Рисуем прямоугольник myGLCD.drawLine(i*j, i, i*j+i, i+j); break; default: break; } } }
Вывод изображения часов на дисплей
// Подключаем библиотеки: #include "UTFT.h" // Подключаем библиотеку для работы с дисплеем // Определяем выводы используемые для управления дисплеем 2.8" TFT 320x240 UNO: const uint8_t RS = 8; // const uint8_t WR = 7; // const uint8_t CS = 6; // const uint8_t RST = 5; // const uint8_t SER = 4; // UTFT myGLCD(TFT01_24SP, RS, WR, CS, RST, SER); // Создаём объект для работы с дисплеем // НАСТРОЙКИ ДИСПЛЕЯ extern uint8_t SmallFont[]; // подключаем маленький шрифт extern uint8_t BigFont[]; // подключаем большой шрифт extern uint8_t SevenSegNumFont[]; // подключаем шрифт имитирующий семисегментный индикатор uint32_t TIMER_DISPLAY; // таймер для вывода времени игры трека на дисплей uint8_t HOURS = 0; // переменная для секунд uint8_t MINUTES = 0; // переменная для минут uint8_t SECONDS = 0; // переменная для секунд void setup(void) { // Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек // НАСТРОЙКА LCD-ДИСПЛЕЯ myGLCD.InitLCD(); // инициируем дисплей myGLCD.setBackColor (VGA_WHITE); // устанавливаем цвет заливки фона шрифта myGLCD.setColor (VGA_RED); // устанавливаем красный цвет текста myGLCD.clrScr(); // стираем всю информацию с дисплея myGLCD.fillScr (VGA_WHITE); // указываем цвет заливки экрана // ВЫВОД ДВОЕТОЧИЯ myGLCD.setColor (VGA_BLACK); // устанавливаем чёрный цвет текста myGLCD.fillCircle(120, 157, 4); // рисуем точку в указанных координатах с радиусом 4 myGLCD.fillCircle(120, 172, 4); // рисуем точку в указанных координатах с радиусом 4 myGLCD.fillCircle(215, 157, 4); // рисуем точку в указанных координатах с радиусом 4 myGLCD.fillCircle(215, 172, 4); // рисуем точку в указанных координатах с радиусом 4 myGLCD.setFont (BigFont); // устанавливаем большой шрифт myGLCD.print("iArduino Clock", CENTER, 20); // выводим текст в указанных координатах myGLCD.print("Day: Monday", CENTER, 70); // выводим текст в указанных координатах myGLCD.print("Date: 22.04.19", CENTER, 100); // выводим текст в указанных координатах myGLCD.print("H", 63, 200); // выводим текст в указанных координатах myGLCD.print("M", 158, 200); // выводим текст в указанных координатах myGLCD.print("S", 253, 200); // выводим текст в указанных координатах } void loop() { if (millis() - TIMER_DISPLAY > 1000) { // выполняем 1 раз в 1000мс TIMER_DISPLAY = millis(); // обновляем счётчик SECONDS++; // увеличиваем значение секунд на 1 каждую 1000мс if (SECONDS > 59) { // если значение секунд превысило значение 59, то SECONDS = 0; // сбрасываем значение секунд в 0 и MINUTES++; // увеличиваем значение минут на 1 } if (MINUTES > 60) { // если значение минут превысило 59, то MINUTES = 0; // сбрасываем значение минут в 0 и HOURS++; // увеличиваем значение часов на 1 } myGLCD.setFont (SevenSegNumFont); // устанавливаем шрифт с 7-сегментного дисплея myGLCD.printNumI(HOURS, 40, 140, 2, '0'); // выводим часы myGLCD.printNumI(MINUTES, 135, 140, 2, '0'); // выводим минуты myGLCD.printNumI(SECONDS, 230, 140, 2, '0'); // выводим секунды } }
Создание программы для рисования, которая использует TouchScreen
// Подключаем библиотеки: #include "UTFT.h" // Подключаем библиотеку для работы с дисплеем #include "TouchScreen.h" // Подключаем библиотеку для работы с TouchScreen // Определяем выводы используемые для управления дисплеем 2.8" TFT 320x240 UNO: const uint8_t RS = 8; // const uint8_t WR = 7; // const uint8_t CS = 6; // const uint8_t RST = 5; // const uint8_t SER = 4; // // Определяем выводы используемые для чтения данных с TouchScreen: const uint8_t YP = A0; // Вывод Y+ должен быть подключен к аналоговому входу const uint8_t XM = A1; // Вывод X- должен быть подключен к аналоговому входу const uint8_t YM = A2; // Вывод Y- const uint8_t XP = A3; // Вывод X+ // Определяем экстремумы для значений считываемых с аналоговых входов при определении точек нажатия на TouchScreen: const int tsMinX = 100; // соответствующий точке начала координат по оси X const int tsMinY = 120; // соответствующий точке начала координат по оси Y const int tsMaxX = 950; // соответствующий максимальной точке координат по оси X const int tsMaxY = 915; // соответствующий максимальной точке координат по оси Y const int mipPress = 10; // соответствующий минимальной степени нажатия на TouchScreen const int maxPress = 1000; // соответствующий максимальной степени нажатия на TouchScreen const uint8_t pen_radius = 3; // указываем размер точки, которая будет появляться при рисовании // Создаём объекты библиотек: UTFT myGLCD(TFT01_24SP, RS, WR, CS, RST, SER); // Создаём объект для работы с дисплеем TouchScreen ts = TouchScreen(XP, YP, XM, YM); // Создаём объект для работы с TouchScreen void setup(void) { // Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек myGLCD.InitLCD(); // Инициируем работу с TFT дисплеем myGLCD.clrScr(); // Чистим экран дисплея myGLCD.setColor(VGA_WHITE); // Указываем белый цвет myGLCD.drawLine(0, 0, 40, 40); // Рисуем линию myGLCD.drawLine(40, 0, 0, 40); // Рисуем линию myGLCD.setColor(VGA_RED); // Указываем красный цвет myGLCD.fillRect(0, 40, 40, 80); // Рисуем квадрат myGLCD.setColor(VGA_GREEN); // Указываем зелёный цвет myGLCD.fillRect(0, 80, 40, 120); // Рисуем квадрат myGLCD.setColor(VGA_YELLOW); // Указываем жёлтый цвет myGLCD.fillRect(0, 120, 40, 160); // Рисуем квадрат myGLCD.setColor(VGA_PURPLE); // Указываем фиолетовый цвет myGLCD.fillRect(0, 160, 40, 200); // Рисуем квадрат myGLCD.setColor(VGA_BLUE); // Указываем синий цвет myGLCD.fillRect(0, 200, 40, 240); // Рисуем квадрат } // void loop() { // // Считываем показания с TouchScreen: TSPoint p = ts.getPoint(); // Считываем координаты и интенсивность нажатия на TouchScreen в структуру p // Возвращаем режим работы выводов: pinMode(XM, OUTPUT); // Возвращаем режим работы вывода X- в значение «выход» для работы с дисплеем pinMode(YP, OUTPUT); // Возвращаем режим работы вывода Y+ в значение «выход» для работы с дисплеем // Если зафиксировано нажатие на TouchScreen, то ... if (p.z > mipPress && p.z < maxPress) { // Если степень нажатия достаточна для фиксации координат TouchScreen p.x = map(p.x, tsMinX, tsMaxX, 0, 320); // Преобразуем значение p.x от диапазона tsMinX...tsMaxX, к диапазону 0...320 p.y = map(p.y, tsMinY, tsMaxY, 0, 240); // Преобразуем значение p.y от диапазона tsMinY...tsMaxY, к диапазону 0...240 if (p.x <= 40) { // Если нажатие было в зоне выбора цветов, то if (p.y < 40 ) { // Если нажатие было в зоне кнопки "очищение экрана", то myGLCD.clrScr(); // Чистим экран дисплея myGLCD.setColor(VGA_WHITE); // Указываем цвет myGLCD.drawLine(0, 0, 40, 40); // Рисуем линию myGLCD.drawLine(40, 0, 0, 40); // Рисуем линию myGLCD.setColor(VGA_RED); // Указываем цвет myGLCD.fillRect(0, 40, 40, 80); // Рисуем квадрат myGLCD.setColor(VGA_GREEN); // Указываем цвет myGLCD.fillRect(0, 80, 40, 120); // Рисуем квадрат myGLCD.setColor(VGA_YELLOW); // Указываем цвет myGLCD.fillRect(0, 120, 40, 160); // Рисуем квадрат myGLCD.setColor(VGA_PURPLE); // Указываем цвет myGLCD.fillRect(0, 160, 40, 200); // Рисуем квадрат myGLCD.setColor(VGA_BLUE); // Указываем цвет myGLCD.fillRect(0, 200, 40, 240); // Рисуем квадрат } else if (p.y > 40 && p.y <= 80 ) { // Если нажатие было в зоне красного квадрата, то myGLCD.setColor(VGA_RED); // Устанавливаем цвет } else if (p.y > 80 && p.y <= 120 ) { // Если нажатие было в зоне зелёного квадрата, то myGLCD.setColor(VGA_GREEN); // Устанавливаем цвет } else if (p.y > 120 && p.y <= 160 ) { // Если нажатие было в зоне жёлтого квадрата, то myGLCD.setColor(VGA_YELLOW); // Устанавливаем цвет } else if (p.y > 160 && p.y <= 200 ) { // Если нажатие было в зоне фиолетового квадрата, то myGLCD.setColor(VGA_PURPLE); // Устанавливаем цвет } else if (p.y > 200 && p.y <= 240 ) { // Если нажатие было в зоне синего квадрата, то myGLCD.setColor(VGA_BLUE); // Устанавливаем цвет } } if (p.x - pen_radius > 40) { // Если нажатие было в зоне рисования, то myGLCD.fillCircle(p.x, p.y, pen_radius); // Прорисовываем окружность диаметром 3 пикселя с центром в точке координат, считанных с TouchScreen } } }
Регулировка яркости подсветки:
Как подключить
Вывод LED подключается к любому выводу ARDUINO, который поддерживает ШИМ (выводы со знаком "~" тильды на шелкографии платы). Яркость регулируется изменением процента заполнения ШИМ. Например, вызов analogWrite(dispLED, 128) установит половину яркости.
Пример работы подсветки дисплея (при использовании датчика освещённости)
// Подключаем библиотеку для работы с дисплеем #include "UTFT.h" // Определяем выводы используемые для // управления дисплеем 2.8" TFT 320x240 UNO: #define dispLED 9 #define dispMISO 8 #define dispSCK 7 #define dispCS 6 #define dispRST 5 #define dispDC 4 #define LIGHT_SENS A0 // переменная для значений с датчика освещённости uint16_t LIGHT_SENS_VAL; // переменная для значений яркости дисплея uint16_t LED_VAL; // объявляем объект myGLCD класса библиотеки UTFT указывая тип дисплея UTFT myGLCD(TFT01_24SP, dispMISO, dispSCK, dispCS, dispRST, dispDC); void setup(void) { // конфигурируем вывод регулировки подсветки как ВЫХОД pinMode(dispLED, OUTPUT); // НАСТРОЙКА LCD-ДИСПЛЕЯ // инициируем дисплей myGLCD.InitLCD(); // устанавливаем цвет заливки фона шрифта myGLCD.setBackColor (VGA_WHITE); } void loop() { // считываем значение с датчика освещённости LIGHT_SENS_VAL = analogRead(LIGHT_SENS); // переопределяем диапазон значений для ШИМ-сигнала LED_VAL = map(LIGHT_SENS_VAL, 0, 1023, 0, 255); // выводим значение ШИМ-сигнала analogWrite(dispLED, LED_VAL); }
Работа с SD-картами:
Используя в связке с дисплеем модуль SD-карт, вы можете выводить анимацию и изображения, которые физически не могут быть размещены в памяти микроконтроллера.
Как подключить
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO
В данном примере Адаптер карт microSD подключается к Piranha UNO следующим образом:
Выводы Адаптера | Выводы Arduino |
INS | - |
MISO | 12 |
GND | GND |
VCC | 5V |
MOSI | 11 |
SCK | 13 |
SS(CS) | 10 |
Дисплей без сенсорной панели
Дисплей с сенсорной панелью
Пример работы
Вывод на дисплей и плавная смена 2 изображений.
#include "SPI.h" // подключаем библиотеку SPI для общения с SD-картой по шине SPI #include "SdFat.h" // подключаем библиотеку SdFat для работы с SD-картой #include "UTFT.h" // подключаем библиотеку UTFT для работы с дисплеем #include "UTFT_SdRaw.h" // подключаем библиотеку UTFT_SdRaw для вывода изображений с SD-карты на дисплей #define SD_CHIP_SELECT SS // определяем константу SD_CHIP_SELECT которой присваиваем номер вывода Arduino подключённого к линии выбора CS шины SPI SD-карты (номер используемый по умолчанию хранится в константе SS) // UTFT myGLCD(TFT01_24SP, 8, 7, 6, 5, 4); // объявляем объект myGLCD класса библиотеки UTFT указывая тип дисплея TFT01_24SP и номера выводов Arduino к которым подключён дисплей: SDI/MOSI, SCK, CS, RESET, DC/RS. Можно использовать любые выводы Arduino. SdFat mySD; // объявляем объект mySD класса библиотеки SdFat для работы с его функциями и методами UTFT_SdRaw myFiles(&myGLCD); // объявляем объект myFiles класса библиотеки UTFT_tinyFAT с передачей ссылки на объект myGLCD класса библиотеки UTFT // void setup() { // myGLCD.InitLCD(); // инициируем дисплей myGLCD.clrScr(); // стираем всю информацию с дисплея while (!mySD.begin(SD_CHIP_SELECT)) {} // инициируем работу с SD картой, ожидая завершения инициализации в цикле while (не даём войти в loop пока нет карты) } // // void loop() { // myFiles.load(0, 0, 320, 240, "image_320x240_a.raw"); // выводим на дисплей картинку начиная с координаты 0,0 размером 320,240 из файла image_320x240_a.raw delay(2000); // ждём 2 секунды myFiles.load(0, 0, 320, 240, "image_320x240_b.raw"); // выводим на дисплей картинку начиная с координаты 0,0 размером 320,240 из файла image_320x240_b.raw delay(2000); // ждём 2 секунды }
Применение:
- Вывод текста, изображений, анимации;
- Создание управления проектами с помощью touchscreen;
Обсуждение