Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

TFT Shield для Arduino Nano - запуск

Компоненты и расходные материалы

Arduino Nano R3
× 1
2,8 "TFT SPI 320x240
× 1
TFT-экран для Arduino Nano
× 1

Об этом проекте

История

Вряд ли найдется человек, который не видел и не знает, что такое цветной дисплей. И, наверное, многие сделали (или хотели бы сделать) какой-то проект на Arduino с использованием цветного дисплея. Более того, такие дисплеи сегодня очень распространены и доступны по цене. Существует множество дисплеев, различающихся разрешением, размером экрана, интерфейсом. Я хотел бы остановиться на одном из таких дисплеев. Нас будет интересовать дисплей с интерфейсом SPI, разрешением 320x240 пикселей и размером диагонали экрана 2,8 "(а также 2,4" и 3,2 "). Интерфейс SPI очень удобен для подключения к микроконтроллеру, поскольку имеет небольшое количество сигнальных линий. А скорость SPI позволяет быстро обновлять содержимое экрана. В целом плюсов масса. Но есть и неудобные моменты. Например, необходимо дополнительно согласовать логические уровни. в случае подключения дисплея к платам Arduino с питанием 5 В. Для быстрого и удобного подключения одного из этих дисплеев (с интерфейсом SPI) к Arduino Nano мы воспользуемся небольшой платой - TFT-экраном.>

Этот щит является второй (облегченной для Arduino Nano) версией TFT Shield для Arduino Uno, о которой вы можете прочитать здесь, здесь и здесь.

Краткое описание экрана TFT:

  • Размер доски 64х49 мм,
  • 30-контактный разъем для подключения Arduino Nano,
  • 14-контактный разъем для подключения TFT-дисплея 320x240 с интерфейсом SPI (включая сенсорный экран),
  • Разъем для карты microSD,
  • Разъем для модуля Bluetooth (HC-06),
  • 20-контактный разъем для камеры OV7670 (и др.),
  • Разъем Mini USB, а также отдельный 2-контактный разъем для питания 5В.

Итак, приступим.

Сборка

Сборка досок очень проста. Но перед установкой необходимо внимательно прочитать обозначения контактов. Сначала необходимо установить плату Arduino Nano, как показано на фото. После этого подключается дисплей, который можно подключить как с одной стороны платы ( способ 1 ) и другой ( метод 2 ). После этого вы можете подключить питание с помощью кабеля mini USB. Ниже представлены фотографии.

Метод 1:

Метод 2:

После сборки можно переходить к загрузке скетчей, но перед этим не забудьте установить необходимую библиотеку для работы с экраном TFT. Библиотека находится по ссылке:https://github.com/YATFT/YATFT.

Демо 1. Графика и текст.

В этой главе приводится пример работы с текстом, графикой и сенсорным экраном. Для удобства рекомендуется сначала запрограммировать плату Arduino Nano отдельно, а затем собрать устройство (но вы также можете запрограммировать плату как часть устройства). Эскиз для работы с текстом и графикой:

  / ****************************************** *********************************** ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ И ДОКУМЕНТАЦИЯ ПРЕДОСТАВЛЯЮТСЯ «КАК ЕСТЬ» БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ * ВИДОМ, ЯВНЫМ ИЛИ ПОДРАЗУМЕВАЕМЫМ, ВКЛЮЧАЯ БЕЗ ОГРАНИЧЕНИЙ ЛЮБУЮ ГАРАНТИЮ * ТОВАРНОЙ ПРИГОДНОСТИ, НАИМЕНОВАНИЯ, НЕДОСТАТОЧНОСТИ НАРУШЕНИЙ И ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ * ЦЕЛИ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОР ИЛИ ЕГО ЛИЦЕНЗИАРЫ НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ИЛИ * ОБЯЗАНЫ ПО КОНТРАКТУ, НЕБРЕЖНОСТИ, СТРОГОЙ ОТВЕТСТВЕННОСТИ, ВКЛАДУ, * НАРУШЕНИЮ ГАРАНТИЙ ИЛИ ДРУГИМ ЮРИДИЧЕСКИМ ПРИВЕДЕННЫМ ТЕОРИЯМ, КАКИМ-ЛИБО ПРЯМЫМ ИЛИ КОСВЕННЫМ * УБЫТКАМ ИЛИ КОСВЕННЫМ УБЫТКАМИ , * КОСВЕННЫЙ, КАРАТЕЛЬНЫЙ ИЛИ КОСВЕННЫЙ УБЫТК, ПОТЕРЯ ПРИБЫЛИ ИЛИ УТЕРЯ ДАННЫХ, * СТОИМОСТЬ ЗАКУПКИ ТОВАРОВ, ТЕХНОЛОГИЙ, УСЛУГ ИЛИ ЛЮБЫХ * ПРЕТЕНЗИЙ ТРЕТЬИХ СТОРОН (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ​​ЛЮБОЙ ДРУГОЙ ЗАЩИТЫ ИЛИ ИЛИ ИХ ЗАЩИТЫ) . ************************************************ ***************************** / # include  // Аппаратно-зависимая библиотека # include  // Включить библиотеку Adafruit-GFX # include  // Включить шрифты Adafruit # include  #include  YATFT tft (0); uint32_t total_time; uint16 Цвет [4] ={BRIGHTBLUE, BRIGHTGREEN, BRIGHTRED, BRIGHTYELLOW}; uint16_t Gray [7] ={GREY0, GRAY1, GRAY2, GRAY3, GRAY4, GR AY5, СЕРЫЙ6}; / ****************************************** ********************************* / void ClearScreen (void) {tft.SetColor (ЧЕРНЫЙ); // Установить цвет шрифта tft.ClearDevice (); // Заполняем весь экран} void setup () {Serial.begin (115200); // инициализируем последовательный порт Serial.println ("Arduino TFT_shield, пример 1!"); tft.begin (); // инициализируем отображение} void loop () {uint16_t x, y, x2, y2, mask_gray; uint16_t i; Очисти экран(); // Шрифты Serial.print ("1) Просмотр шрифтов ("); total_time =миллис (); tft.SetColor (ЯРКО-СИНИЙ); tft.SetFont (ПУСТО); tft.OutTextXY (5, 5, «Демонстрация работы с TFT-дисплеем.»); tft.SetColor (ЯРКО-ЗЕЛЕНЫЙ); tft.SetFont (&FreeSerif9pt7b); tft.OutTextXY (5, 20, «В примере используются шрифты от Adafruit.»); tft.SetFont (&FreeSerifItalic24pt7b); tft.SetColor (BRIGHTCYAN); tft.OutTextXY (5, 45, "3,5 ''"); tft.SetColor (ЯРКОСТЬ); tft.OutTextXY (90, 45, «QVGA»); tft.SetColor (BRIGHTMAGENTA); tft.OutTextXY (230, 45, «дисп.»); tft.SetColor (ЯРКО-ЖЕЛТЫЙ); tft.SetFont (&FreeSans24pt7b); tft.OutTextXY (5, 100, «А Р Д У И Н О + Т Ф Т»); tft.SetFont (ПУСТО); для (я =0; я <7; я ++) {tft.SetColor (Серый [я]); tft.OutTextXY (5, 170 + 10 * i, «Демонстрация работы с TFT дисплеем.»); } PrintTotalTime (); задержка (3000); Очисти экран(); // Круг Serial.print ("2) Рисуем круг ("); total_time =миллис (); tft.SetColor (ЯРКОСТЬ); for (i =10; i > 1; i + =10) {tft.DrawCirc (GetMaxX ()>> 1, GetMaxY ()>> 1, i); } PrintTotalTime (); задержка (1000); // DrawFillCircle и DrawFillRect Serial.print ("3) Рисуем FillCircle и FillRect ("); total_time =миллис (); tft.SetColor (ЯРКОСТЬ); tft.DrawFillCirc (GetMaxX ()>> 1, GetMaxY ()>> 1,110); tft.SetColor (BRIGHTCYAN); tft.DrawFillRect (GetMaxX () / 2-77, GetMaxY () / 2-77, GetMaxX () / 2 + 77, GetMaxY () / 2 + 77); tft.SetColor (ЯРКО-ЗЕЛЕНЫЙ); tft.DrawFillCirc (GetMaxX ()>> 1, GetMaxY ()>> 1,77); tft.SetColor (BRIGHTMAGENTA); tft.DrawFillRect (GetMaxX () / 2-54, GetMaxY () / 2-54, GetMaxX () / 2 + 54, GetMaxY () / 2 + 54); tft.SetColor (ЯРКО-СИНИЙ); tft.DrawFillCirc (GetMaxX ()>> 1, GetMaxY ()>> 1,54); tft.SetColor (ЯРКО-ЖЕЛТЫЙ); tft.DrawFillRect (GetMaxX () / 2-37, GetMaxY () / 2-37, GetMaxX () / 2 + 37, GetMaxY () / 2 + 37); PrintTotalTime (); задержка (1000); Очисти экран(); // Дуга Serial.print ("4) Рисуем дугу ("); total_time =миллис (); Очисти экран(); tft.SetColor (ЯРКО-СИНИЙ); tft.DrawArc ((GetMaxX ()>> 1) -60, (GetMaxY ()>> 1) -60, (GetMaxX ()>> 1) +60, (GetMaxY ()>> 1) +60,20, 30,0xFF); tft.SetColor (ЯРКО-ЗЕЛЕНЫЙ); tft.DrawArc ((GetMaxX ()>> 1) -40, (GetMaxY ()>> 1) -40, (GetMaxX ()>> 1) +40, (GetMaxY ()>> 1) +40,20, 30,0xFF); tft.SetColor (ЯРКОСТЬ); tft.DrawArc ((GetMaxX ()>> 1) -20, (GetMaxY ()>> 1) -20, (GetMaxX ()>> 1) +20, (GetMaxY ()>> 1) +20,20, 30,0xFF); PrintTotalTime (); задержка (1000); Serial.print ("5) Нарисовать FillBevel ("); total_time =миллис (); tft.SetColor (ЯРКО-СИНИЙ); tft.DrawFillBevel ((GetMaxX ()>> 1) -60, (GetMaxY ()>> 1) -60, (GetMaxX ()>> 1) +60, (GetMaxY ()>> 1) +60,30); tft.SetColor (ЯРКО-ЗЕЛЕНЫЙ); tft.DrawFillBevel ((GetMaxX ()>> 1) -40, (GetMaxY ()>> 1) -40, (GetMaxX ()>> 1) +40, (GetMaxY ()>> 1) +40,30); tft.SetColor (ЯРКОСТЬ); tft.DrawFillBevel ((GetMaxX ()>> 1) -20, (GetMaxY ()>> 1) -20, (GetMaxX ()>> 1) +20, (GetMaxY ()>> 1) +20,30); PrintTotalTime (); задержка (1000); Очисти экран(); Serial.print ("6) Нарисовать дугу ("); total_time =миллис (); для (я =0; я <4; я ++) {tft.SetColor (Цвет [я]); tft.DrawArc ((GetMaxX ()>> 1), (GetMaxY ()>> 1) -50, (GetMaxX ()>> 1), (GetMaxY ()>> 1) + 50,50,60,0x11 <<я); } для (я =0; я <4; я ++) {tft.SetColor (Цвет [я]); tft.DrawArc ((GetMaxX ()>> 1), (GetMaxY ()>> 1) -30, (GetMaxX ()>> 1), (GetMaxY ()>> 1) + 30,35,45,0x11 <<я); } для (я =0; я <4; я ++) {tft.SetColor (Цвет [я]); tft.DrawArc ((GetMaxX ()>> 1), (GetMaxY ()>> 1), (GetMaxX ()>> 1), (GetMaxY ()>> 1), 20,30,0x11 < 

Некоторые скриншоты:

Демонстрация 2. Сенсорный экран.

  / ****************************************** *********************************** ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ И ДОКУМЕНТАЦИЯ ПРЕДОСТАВЛЯЮТСЯ «КАК ЕСТЬ» БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ * ВИДОМ, ЯВНЫМ ИЛИ ПОДРАЗУМЕВАЕМЫМ, ВКЛЮЧАЯ БЕЗ ОГРАНИЧЕНИЙ ЛЮБУЮ ГАРАНТИЮ * ТОВАРНОЙ ПРИГОДНОСТИ, НАИМЕНОВАНИЯ, НЕДОСТАТОЧНОСТИ НАРУШЕНИЙ И ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ * ЦЕЛИ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОР ИЛИ ЕГО ЛИЦЕНЗИАРЫ НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ИЛИ * ОБЯЗАНЫ ПО КОНТРАКТУ, НЕБРЕЖНОСТИ, СТРОГОЙ ОТВЕТСТВЕННОСТИ, ВКЛАДУ, * НАРУШЕНИЮ ГАРАНТИЙ ИЛИ ДРУГИМ ЮРИДИЧЕСКИМ ПРИВЕДЕННЫМ ТЕОРИЯМ, КАКИМ-ЛИБО ПРЯМЫМ ИЛИ КОСВЕННЫМ * УБЫТКАМ ИЛИ КОСВЕННЫМ УБЫТКАМИ , * КОСВЕННЫЙ, КАРАТЕЛЬНЫЙ ИЛИ КОСВЕННЫЙ УБЫТК, ПОТЕРЯ ПРИБЫЛИ ИЛИ УТЕРЯ ДАННЫХ, * СТОИМОСТЬ ЗАКУПКИ ТОВАРОВ, ТЕХНОЛОГИЙ, УСЛУГ ИЛИ ЛЮБЫХ * ПРЕТЕНЗИЙ ТРЕТЬИХ СТОРОН (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ​​ЛЮБОЙ ДРУГОЙ ЗАЩИТЫ ИЛИ ИЛИ ИХ ЗАЩИТЫ) . ************************************************ ***************************** / # include  // Аппаратно-зависимая библиотека # include  // Включить библиотеку SPI # include  // Включить библиотеку сенсорного экрана # include  // Включить библиотеку Adafruit-GFX # include  // Включить шрифты Adafruit # include #include  // Сенсорный экран:MOSI =11, MISO =12, SCK =13, CS =2 # определить CS_PI N A0XPT2046_Touchscreen ts (CS_PIN, 255); YATFT tft (0); #define Y_BAR_TOP (GetMaxY () - 50) #define Y_BAR_BOT GetMaxY () / * При использовании щита все линии управления и данных фиксированы, и более простое объявление при желании можно использовать:* / uint16_t pos_x [] ={0,0,0,0}; uint16_t pos_y [] ={0,0,0,0}; uint8_t pos_x_cnt =0; uint8_t pos_y_cnt =0; uint16_t pos_x_mid =0; uint16_t pos_y_mid =0; uint16_t color_paint =WHITE; uint8_t buttons =0; uint16_t Color [4] ={BRIGHTBLUE, BRIGHTGREEN, BRIGHTRED, BRIGHTYELLOW}; uint16_t Gray [7] ={GRAY0, GRAY4, GRAY2 СЕРЫЙ5, СЕРЫЙ6}; / ******************************************* ************************************************* *** / void ClearScreen (void) {tft.SetColor (ЧЕРНЫЙ); // Установить цвет шрифта tft.ClearDevice (); // Заполняем весь экран} void setup () {Serial.begin (115200); // инициализируем последовательный порт Serial.println ("Arduino TFT_shield Example1!"); ts.begin (); // Запускаем Touchscreen SPI.end (); // Отключить SPI для корректной работы DB2 (SS) pin tft.begin (); // инициализируем отображение RefreshWindow ();} void loop () {uint16_t x, y; // Прикосновение // Когда вывод SS установлен как ВЫХОД, его можно использовать // как выходной порт общего назначения (он не влияет // на операции SPI). SPI.begin (); если (ts.touched ()) {TS_Point p =ts.getPoint (); Serial.print (F ("Давление =")); Серийный принт (p.z); Serial.print (F (", x =")); Серийный отпечаток (стр. X); Serial.print (F (", y =")); Серийный отпечаток (p.y); Serial.println (); задержка (3); // Задержка фильтрации SPI.end (); // Отключить SPI для корректной работы Вывод DB2 (SS) // Вычислить координаты x, y из кода ADC Serial.print (F ("Pressure =")); Серийный принт (p.z); Serial.print (F (", x =")); Серийный отпечаток (стр. X); Serial.print (F (",")); Serial.print (x); Serial.print (F (", y =")); Серийный отпечаток (p.y); Serial.print (F (",")); Serial.print (y); Serial.println (); если (p.x <350) p.x =350; если (p.x> 3850) p.x =3850; если (p.y <250) p.y =250; если (p.y> 3850) p.y =3850; x =(uint16_t) (320 л - ((uint32_t) p.x - 350 л) * 100 л / 1094 л); y =(uint16_t) (240L - ((uint32_t) p.y - 250L) * 100L / 1510L); // Фильтрация pos_x_mid =(pos_x [0] + pos_x [1] + pos_x [2] + pos_x [3]) / 4; pos_y_mid =(pos_y [0] + pos_y [1] + pos_y [2] + pos_y [3]) / 4; pos_x [pos_x_cnt ++] =x; pos_y [pos_y_cnt ++] =y; pos_x_cnt &=0x03; pos_y_cnt &=0x03; if (x> (pos_x_mid - 10) &&x <(pos_x_mid + 10) &&y> (pos_y_mid - 10) &&y <(pos_y_mid + 10)) {if (y> Y_BAR_TOP &&y  

Некоторые скриншоты:

Демо 3. Логическая игра «Колонны».

  / ****************************************** *********************************** ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ И ДОКУМЕНТАЦИЯ ПРЕДОСТАВЛЯЮТСЯ «КАК ЕСТЬ» БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ * ВИДОМ, ЯВНЫМ ИЛИ ПОДРАЗУМЕВАЕМЫМ, ВКЛЮЧАЯ БЕЗ ОГРАНИЧЕНИЙ ЛЮБУЮ ГАРАНТИЮ * ТОВАРНОЙ ПРИГОДНОСТИ, НАИМЕНОВАНИЯ, НЕДОСТАТОЧНОСТИ НАРУШЕНИЙ И ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ * ЦЕЛИ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОР ИЛИ ЕГО ЛИЦЕНЗИАРЫ НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ИЛИ * ОБЯЗАНЫ ПО КОНТРАКТУ, НЕБРЕЖНОСТИ, СТРОГОЙ ОТВЕТСТВЕННОСТИ, ВКЛАДУ, * НАРУШЕНИЮ ГАРАНТИЙ ИЛИ ДРУГИМ ЮРИДИЧЕСКИМ ПРИВЕДЕННЫМ ТЕОРИЯМ, КАКИМ-ЛИБО ПРЯМЫМ ИЛИ КОСВЕННЫМ * УБЫТКАМ ИЛИ КОСВЕННЫМ УБЫТКАМИ , * КОСВЕННЫЙ, КАРАТЕЛЬНЫЙ ИЛИ КОСВЕННЫЙ УБЫТК, ПОТЕРЯ ПРИБЫЛИ ИЛИ УТЕРЯ ДАННЫХ, * СТОИМОСТЬ ЗАКУПКИ ТОВАРОВ, ТЕХНОЛОГИЙ, УСЛУГ ИЛИ ЛЮБЫХ * ПРЕТЕНЗИЙ ТРЕТЬИХ СТОРОН (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ​​ЛЮБОЙ ДРУГОЙ ЗАЩИТЫ ИЛИ ИЛИ ИХ ЗАЩИТЫ) . ************************************************ ***************************** / # include  #include  #include  #include  // Базовая графическая библиотека # include  #include  #define CS_PIN A0 // MOSI =11, MISO =12, SCK =13XPouchT2046_T2046 (CS_PIN, 255); YATFT tft (0); / * При использовании экрана все линии управления и данных фиксированы, и при желании можно использовать более простое объявление :* / long randNumber; #define KEY_EMPTY 0 # define KEY_SWAP 1 #define KEY_FALL 2 # define KEY_LEFT 3 #define KEY_RIGHT 4 # define DISPLAY_MAX_X 320 #define DISPLAY_MAX_Y 240 # define MaxCol 8 #define MaxRow 17 #define SmeX 3 # define SmeX 3 #define razmer 15 # define LL 250 #define NumCol 6 # define MaxLevel 8 #define PeriodLevel 80 # define DISP_LEFT ((DISPLAY_MAX_X - MaxCol * razmer) / 2-2) #define DISP_RIGHT ((DISPLAY_MAX_X + MaxCol * razmer) / 2 + 2) #define DISP_TOP ((DISPLAY_MAX_Y - (MaxRow-4) * размер) / 2-2-10) #define DISP_BOT ((DISPLAY_MAX_Y + (MaxRow-4) * размер) / 2 + 2-10) uint8_t MasSt [MaxCol ] [MaxRow], MasTmp [MaxCol] [MaxRow], MasOld [MaxCol] [MaxRow], fignext [3]; uint8_t Level =1, OldLevel, tr, flfirst =1; uint16_t MasCol [] ={БЕЛЫЙ, ЧЕРНЫЙ, BRIGHTRED , BRIGHTBLUE, BRIGHTGREEN, BRIGHTYELLOW, BRIGHTMAGENTA, BRIGHTCYAN}; длинный счетчик без знака, Score =0, TScore =0, Record =0, OldRecord, OldScore, myrecord; uint16_t tempspeed; bool fl, Demo =true, myfl =false, Arbeiten =false, FlNew, FlZ =false; int8_t VAL, Mp, x, y; int8_t mmm [4] [2] ={ {-1,0}, {0, -1}, {1,0}, {0,1}}; uint16_t MasSpeed ​​[MaxLevel] ={500,450,400,350,300,250,200,100}; / ************ ************************************************* **** / void setup (void) {// инициализировать последовательный порт Serial.begin (115200); Serial.println ("Пример TFT_shield_Game1!"); ts.begin (); // Запускаем Touchscreen SPI.end (); tft.begin (); // инициализируем отображение randomSeed (analogRead (5)); tft.SetColor (БЕЛЫЙ); tft.ClearDevice (); tft.SetColor (КРАСНЫЙ); tft.SetFont (&FreeSerif9pt7b); tft.OutTextXY (20, 20, «УРОВЕНЬ»); tft.OutTextXY (240, 20, «ДАЛЕЕ»); tft.OutTextXY (20, 75, «ОЦЕНКА»); tft.OutTextXY (25, 130, «ВЕРХ»); FlNew =true; ViewStacan (); GetNext (); задержка (100); tft.SetColor (ЧЕРНЫЙ); tft.DrawLine (DISP_LEFT + 1, DISP_TOP + 0, DISP_LEFT + 1, DISP_BOT - 1); tft.DrawLine (DISP_LEFT + размер * MaxCol + 5-MaxCol, DISP_TOP + 0, DISP_LEFT + размер * MaxCol + 5-MaxCol, DISP_BOT - 1); tft.DrawLine (DISP_LEFT + 1, DISP_BOT - 1, DISP_LEFT + 1 + размер * MaxCol + 5-MaxCol-1, DISP_BOT - 1);} void loop (void) {if (Demo) ProcDemo (); else {если (Arbeiten) {mydelay (темп); фиговый ход (0,1); } иначе, если (mypush () ==KEY_SWAP) NewGame (); }} uint8_t mypush (void) {беззнаковый длинный tpr =millis (); uint8_t res =KEY_EMPTY; uint8_t button =0; статический uint8_t button_old; статический uint8_t cnt =0; button =Touch (); если (кнопка) {cnt =5; Serial.print ("Кнопка сканирования:"); Serial.print (кнопка, HEX); Serial.println (); if (button! =button_old) {если (button &0x01) res =KEY_SWAP; если (кнопка &0x02) res =KEY_FALL; если (кнопка &0x04) {}; если (кнопка &0x08) res =KEY_LEFT; если (кнопка &0x10) res =KEY_RIGHT; button_old =кнопка; }} если (! cnt) {button_old =button; } else {cnt--; } return (res); } void ViewQuad (uint8_t i, uint8_t j, uint8_t mycolor) {if (j <3) return; uint16_t wy =DISP_TOP + SmeY + (j-3) * размер - j; uint16_t wx =DISP_LEFT + SmeX + i * размер - i; если (mycolor! =0) {tft.SetColor (ЧЕРНЫЙ); tft.DrawRect (wx, wy, wx + размер-1, wy + размер-1); tft.SetColor (MasCol [mycolor]); tft.DrawFillRect (wx + 1, wy + 1, wx + 1 + размер-3, wy + 1 + размер-3); } еще {tft.SetColor (БЕЛЫЙ); tft.DrawFillRect (wx + 1, wy + 0, wx + 1 + размер-3, wy + 1 + размер-3); }} недействительным ViewStacan (недействительным) {char myStr2 [5]; uint8_t h =tft.GetTextHeight (&FreeMonoBoldOblique12pt7b); tft.SetFont (&FreeMonoBoldOblique12pt7b); если (OldScore! =Оценка || FlNew) {sprintf (myStr2, "% 05d", Оценка); int16_t w =tft.GetTextWidth (myStr2, &FreeMonoBoldOblique12pt7b); tft.SetColor (БЕЛЫЙ); tft.DrawFillRect (20,100,20 + w + 5,100 + h); tft.SetColor (ЗЕЛЕНЫЙ); tft.OutTextXY (20,100, myStr2); OldScore =Оценка; } if (OldRecord! =Запись || FlNew) {sprintf (myStr2, "% 05d", Запись); int16_t w =tft.GetTextWidth (myStr2, &FreeMonoBoldOblique12pt7b); tft.SetColor (БЕЛЫЙ); tft.DrawFillRect (20,155,20 + w + 5,155 + h); tft.SetColor (ЗЕЛЕНЫЙ); tft.OutTextXY (20,155, myStr2); OldRecord =Запись; } if (OldLevel! =Уровень || FlNew) {sprintf (myStr2, "% 01d", Уровень); int16_t w =tft.GetTextWidth (myStr2, &FreeMonoBoldOblique12pt7b); tft.SetColor (БЕЛЫЙ); tft.DrawFillRect (25,45,25 + w + 5,45 + h); tft.SetColor (ЗЕЛЕНЫЙ); tft.OutTextXY (25,45, myStr2); OldLevel =Уровень; } FlNew =false; for (byte j =3; j  =0 &&ny> =0 &&nx  1 || MasTmp [i] [j]> 2)) {MasTmp [nx] [ny] =3; MasTmp [i] [j] =3; } else if (mode ==3 &&MasTmp [nx] [ny] ==3) {if (MasTmp [i] [j]! =3) {MasTmp [i] [j] =3; fl =истина; }}}} void Sos (int i, int j, byte mode) {для (byte k =0; k <4; k ++) Sosed (i, j, mmm [k] [0], mmm [k] [1 ],Режим); } bool FindFull (void) {байт i, j, k; bool res; res =false; для (байт k =2; k <8; k ++) {ClearMas (MasTmp); for (j =3; j  1) Sos (i, j, 2); делать {fl =false; for (j =3; j  0) Sos (i, j, 3); } while (fl); for (j =3; j  0) {ViewStacan (); FlZ =истина; mydelay (500); } for (j =0; j  Макс.уровень) Уровень =Макс.уровень; } tempspeed =MasSpeed ​​[Уровень-1]; }} void MyScore (void) {TScore =0; while (FindFull ()) {if (TScore> 7) Score =Score + TScore + (TScore-8) * 2; иначе Score =Score + TScore; ViewStacan (); FlZ =истина; mydelay (1000); } FlZ =false;} недействительным ProcDemo (недействительным) {Score =0; GetNext (); для (байт j =3; j  MaxCol-1) return (false); if (dx! =0) if (MasSt [x + dx] [y + dy + 2] ==0) return (true); иначе возврат (ложь); if (dy> 0) {if (y + dy + 2> MaxRow-1 || MasSt [x + dx] [y + dy + 2]> 0) {if (y <3) gameover (); иначе fff =true; } else {для (байт i =0; i <3; i ++) MasSt [x] [y + 2-i + dy] =MasSt [x] [y + 2-i]; MasSt [x] [y] =0; y =y + dy; } если (fff) {MyScore (); GetNext (); } ViewStacan (); } return (true);} uint8_t Touch (void) {uint16_t x, y; uint8_t button =0; // Прикосновение // Когда вывод SS установлен как ВЫХОД, его можно использовать // как выходной порт общего назначения (он не влияет // на операции SPI). SPI.begin (); если (ts.touched ()) {TS_Point p =ts.getPoint (); задержка (3); // Задержка фильтрации SPI.end (); // Вычислить координаты x, y из кода ADC if (p.x <450) p.x =450; если (p.y <500) p.y =500; x =(uint16_t) (320 л - ((uint32_t) p.x - 450 л) * 10 л / 106 л); y =(uint16_t) (240L - ((uint32_t) p.y - 500L) * 10L / 140L); if (x <80) {// Левая кнопка =0x08; } else if (x> 240) {// Правая кнопка =0x10; } else if (y <120) {// Кнопка обмена =0x01; } еще кнопка =0x02; // Падение} SPI.end (); кнопка возврата;}  

Некоторые скриншоты:

Демо-видео

Продолжение следует.

Спасибо за внимание!

Предыдущие статьи:

1) Уникальный TFT Shield для Arduino Uno - Start,

2) Уникальный экран TFT для Arduino Uno - OV7670 Cam Live View,

3) Уникальный экран TFT для Arduino Uno - Bluetooth-камера Arduino (ABC).

Следующие статьи:

4) Фотографии и видео в формате RGB на TFT SPI дисплее.

Обновление 01.04.2021:

И снова здравствуйте! Существует обновленная библиотека для серии экранов, которая в настоящее время состоит из двух экранов и двух коммутационных плат. Скетч составляется в зависимости от выбранной версии (от 1 до 4) и типа микроконтроллера (MegaAVR или ESP-32). Добавил фото, примеры. Более подробную информацию можно найти на https://github.com/Ekaburg/EkaTFT.

Код

Библиотека
https://github.com/YATFT/YATFT

Производственный процесс

  1. Растровая анимация на сенсорном экране TFT ILI9341
  2. Веб-контроллер DMX
  3. Arduino Spybot
  4. Цветы - Arduino Nano, CrazyCircuits, DFRobot
  5. Arduino Nano:управление двумя шаговыми двигателями с помощью джойстика
  6. НАЧАЛО:автономный терминал ARduino
  7. Портативный счетчик Гейгера с Arduino Nano
  8. Мониторинг температуры SMART для школ
  9. 8-битная библиотека портов ввода-вывода для Arduino
  10. BLUE_P:беспроводной экран программирования Arduino