Как получить координаты x,y с тача?
- Войдите на сайт для отправки комментариев
Втр, 15/11/2016 - 00:55
Всем привет, заказал экранчик на уно с китая, вот как у парня с этой темы
http://arduino.ru/forum/apparatnye-voprosy/zhk-ekran-i-ego-podklyuchenie...
Библиотека подошла та же, что и ему посоветовали.
Вопрос, как получить координаты нажатия на тачскрин?
вот кусок кода моего:
// UTFT_Demo_320x240 (C)2012 uCtronics // web: http://www.uctronics.com // UTFT_Demo_320x240 is derived from // UTFT_Demo_320x240 (C)2010 Henning Karlsen // web: http://www.henningkarlsen.com/electronics // to fit for our 3.2 inch TFT LCD shield for Arduino/Maple/Chipkit // // This program is a demo of how to use most of the functions // of the library with a supported display modules. // // This demo was made for modules with a screen resolution // of 320x240 pixels. // // This program requires the UTFT library (8bit mode) // and the code is compatible with both UNO and Mega board. // No code modification required. // // if I want to use a GLUE class that implements the UTFT API // with the Adafruit classes, I MUST include those headers // because the Arduino Java does not look at nested includes ! #include <Adafruit_GFX.h> #include <UTFTGLUE.h> // class methods are in here UTFTGLUE myGLCD(0x0154,A2,A1,A3,A4,A0); #include <MCUFRIEND_kbv.h> MCUFRIEND_kbv tft; // hard-wired for UNO shields anyway. #include <TouchScreen.h> #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif uint8_t YP = A1; // must be an analog pin, use "An" notation! uint8_t XM = A2; // must be an analog pin, use "An" notation! uint8_t YM = 7; // can be a digital pin uint8_t XP = 6; // can be a digital pin uint8_t SwapXY = 0; uint16_t TS_LEFT = 920; uint16_t TS_RT = 150; uint16_t TS_TOP = 940; uint16_t TS_BOT = 120; //char *name = "Unknown controller"; // For better pressure precision, we need to know the resistance // between X+ and X- Use any multimeter to read it // For the one we're using, its 300 ohms across the X plate TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); TSPoint tp; #define MINPRESSURE 20 #define MAXPRESSURE 1000 // Declare which fonts we will be using #if !defined(SmallFont) extern uint8_t SmallFont[]; //.kbv GLUE defines as GFXFont ref #endif void setup() { randomSeed(analogRead(5)); //.kbv Due does not like A0 pinMode(A0, OUTPUT); //.kbv mcufriend have RD on A0 digitalWrite(A0, HIGH); // Setup the LCD myGLCD.InitLCD(); // myTouch.InitTouch(); myGLCD.setFont(SmallFont); } void loop() { // Clear the screen and draw the frame myGLCD.clrScr(); myGLCD.setColor(255, 0, 0); myGLCD.fillRect(0, 120, 319, 107); myGLCD.setColor(64, 64, 64); myGLCD.fillRect(0, 226, 319, 239); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(255, 0, 0); myGLCD.print("* hello *", CENTER, 110); myGLCD.setBackColor(64, 64, 64); myGLCD.setColor(255,255,0); delay(3000); uint16_t xpos, ypos; //screen coordinates tp = ts.getPoint(); //tp.x, tp.y are ADC values //myGLCD.print(String tp, CENTER, 238); while(1) { if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) { myGLCD.print("PRESSED!", CENTER, 238); } } delay(3000); }
Сам по себе тач работает без вопросов - проверял демками, мини графический редактор работает
Безусловный и оттого бесконечный цикл
while(1)(строки 94-100) совершенно Вам не нужен. Ну или переместите строку 92 внутрь цикла (и после 98-й строки добавьте паузу и затем break;), тогда это хоть какой-то смысл обретёт.Координаты нажатия на тачскрин - это tp.x и tp.y.
убрал while, не реагирует все равно, надпись PRESSED от нажатия не появляется
1. Покажите результирующий скетч.
2. У меня была когда-то проблема с чтением подобного тача, решилась добавлением двух pinMode() после чтения, правда библиотеки немного другие использовал :
UPD: Обратите внимание
и экран, и тач попеременно используют А1 и А2
Честно говоря не совсем догнал, что Вы хотели сказать.
upd:
думаете, ничего не показывает, потому как экранчик переходит из режима чтения тача в вывод изображения только в след. итерации loop?
Скетч не сильно изменился, но вот -
Ладно, зайдём с другой стороны : примеры из библиотеки TouchScreen пробовали запускать ?
Да, я же писал - примеры запускал, графический редактор работает, выбирает цвета, рисует стиком.
Калибровку делал, нажатия отрабатывает верно, где жму там и рисует
Я внимательно читаю всё, что Вы пишете, вопрос мой о примерах из библиотеки TouchScreen, там два простейших скетча, на экране они вообще ничего не рисуют, выводят x,y,z в посл.порт. Попробуйте по ним разобраться с тачем в чистом, так сказать, виде. Когда получится - добавите в скетч вывод на дисплей и т.д.
Отчитываюсь - запустил touchscreendemo, работает, но хреново.
Через раз мягко говоря, пару значений выдает, а потом хоть раздави этот дисплей - ничего. Вот такая странность. Хотя рисовал в "пейнте" без вопросов
Мда, я в затруднении..
А тестером сопротивление меряли?, там в скетче интересно так написано
ох, может быть там надо куда то параметры калибровки забивать?
Я в исходниках "пейнта" и пытался копаться) в скетче оттуда половина кода скопипащено))
Дело в том, что я для TFT-дисплеев использую связку Adafruit_GFX + Adafruit_TFTLCD + TouchScreen, поэтому по Вашему варианту (Adafruit_GFX + UTFTGLUE + MCUFRIEND_kbv + TouchScreen) дать конкретный совет вряд ли смогу.
Ну у меня не завелся просто Adafruit к сожалению. И пропатченный тоже. Ладно, спасибо за помощь, еще помучаю, и тогда либо другой экран либо клавиатура вместо тача.
Если "пейнт" работает, то железо стопроцентно здоровое. Просто найдите разгадку в исходнике скетча.
Имею сегодня время и вдохновение, выложите пожалуйста сюда исходник этого самого "пейнта", или ссылку на него.
Вот здесь https://github.com/prenticedavid/MCUFRIEND_kbv/blob/master/examples/UTouch_Calibr_kbv/UTouch_Calibr_kbv.ino , кстати, функция чтения тача интересно выглядит (у меня почти также работает) :
void readResistiveTouch(void) { tp = myTouch.getPoint(); pinMode(YP, OUTPUT); //restore shared pins pinMode(XM, OUTPUT); digitalWrite(YP, HIGH); digitalWrite(XM, HIGH); }Shared pins - видите ? Ещё и с выставлением HIGH.
И здесь https://github.com/prenticedavid/MCUFRIEND_kbv/blob/master/examples/TouchScreen_Calibr_kbv/TouchScreen_Calibr_kbv.ino то же самое :
void readResistiveTouch(void) { tp = myTouch.getPoint(); pinMode(YP, OUTPUT); //restore shared pins pinMode(XM, OUTPUT); digitalWrite(YP, HIGH); //because TFT control pins digitalWrite(XM, HIGH); }Паинт
Спасибо, но что-то я сомневаюсь (судя по набору библиотек), что это именно тот скетч, который упоминает d3moman.
буду следить внимательно, у меня аналогичная задача, тыкнуть пальчиком в область примерно 1х1 см чтобы отработала определённая функция
Извините парни, с работы на форуме не сижу. Сейчас скину
Очень страное решение завести экран и тач на одни пины...очень странная экономия.
Вот.Вот этот код по идее выводит координаты на экран + включает ПЕИНТ.
Координаты кстати выводит странные, минимум по х - 176, по y -1180 вроде
// the regular Adafruit "TouchScreen.h" library only works on AVRs // different mcufriend shields have Touchscreen on different pins // and rotation. // Run the UTouch_calibr_kbv sketch for calibration of your shield #include <Adafruit_GFX.h> // Core graphics library //#include <Adafruit_TFTLCD.h> // Hardware-specific library //Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); #include <MCUFRIEND_kbv.h> MCUFRIEND_kbv tft; // hard-wired for UNO shields anyway. #include <TouchScreen.h> #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif // These are the pins for some typical shields! // S6D0154: YP=A1, XM=A2, YM=7, XP=6 // ST7783 : YP=A2, XM=A1, YM=6, XP=7 // ILI9320: YP=A2, XM=A3, YM=8, XP=9 // ILI9325: YP=A1, XM=A2, YM=7, XP=6 // ILI9325BG: YP=A2, XM=A1, YM=6, XP=7 // ILI9341: YP=A2, XM=A1, YM=7, XP=6 // ILI9488: YP=A1, XM=A2, YM=7, XP=6 // R65109V: YP=A2, XM=A1, YM=6, XP=7 // most mcufriend shields use these pins and Portrait mode: uint8_t YP = A1; // must be an analog pin, use "An" notation! uint8_t XM = A2; // must be an analog pin, use "An" notation! uint8_t YM = 7; // can be a digital pin uint8_t XP = 6; // can be a digital pin uint8_t SwapXY = 0; uint16_t TS_LEFT = 920; uint16_t TS_RT = 150; uint16_t TS_TOP = 940; uint16_t TS_BOT = 120; char *name = "Unknown controller"; // For better pressure precision, we need to know the resistance // between X+ and X- Use any multimeter to read it // For the one we're using, its 300 ohms across the X plate TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); TSPoint tp; #define MINPRESSURE 20 #define MAXPRESSURE 1000 #define SWAP(a, b) {uint16_t tmp = a; a = b; b = tmp;} int16_t BOXSIZE; int16_t PENRADIUS = 3; uint16_t identifier, oldcolor, currentcolor; uint8_t Orientation = 0; //PORTRAIT // Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF void show_Serial(void) { Serial.print(F("Found ")); Serial.print(name); Serial.println(F(" LCD driver")); Serial.print(F("ID=0x")); Serial.println(identifier, HEX); Serial.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); Serial.println("Calibration is: "); Serial.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); Serial.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); Serial.print("Wiring is: "); Serial.println(SwapXY ? "SWAPXY" : "PORTRAIT"); Serial.println("YP=" + String(YP) + " XM=" + String(XM)); Serial.println("YM=" + String(YM) + " XP=" + String(XP)); } void show_tft(void) { tft.setCursor(0, 0); tft.setTextSize(2); tft.print(F("Found ")); tft.print(name); tft.println(F(" LCD")); tft.setTextSize(1); tft.print(F("ID=0x")); tft.println(identifier, HEX); tft.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); tft.println("Calibration is: "); tft.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); tft.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); tft.print("\nWiring is: "); if (SwapXY) { tft.setTextColor(CYAN); tft.setTextSize(2); } tft.println(SwapXY ? "SWAPXY" : "PORTRAIT"); tft.println("YP=" + String(YP) + " XM=" + String(XM)); tft.println("YM=" + String(YM) + " XP=" + String(XP)); tft.setTextSize(2); tft.setTextColor(RED); tft.setCursor((tft.width() - 48) / 2, (tft.height() * 2) / 4); tft.print("EXIT"); tft.setTextColor(YELLOW, BLACK); tft.setCursor(0, (tft.height() * 6) / 8); tft.print("Touch screen for loc"); while (1) { tp = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); pinMode(XP, OUTPUT); pinMode(YM, OUTPUT); if (tp.z < MINPRESSURE || tp.z > MAXPRESSURE) continue; if (tp.x > 450 && tp.x < 570 && tp.y > 450 && tp.y < 570) break; tft.setCursor(0, (tft.height() * 3) / 4); tft.print("tp.x=" + String(tp.x) + " tp.y=" + String(tp.y) + " "); } } void setup(void) { uint16_t tmp; tft.begin(9600); tft.reset(); identifier = tft.readID(); // if (identifier == 0) identifier = 0x9341; if (0) { } else if (identifier == 0x0154) { name = "S6D0154"; TS_LEFT = 914; TS_RT = 181; TS_TOP = 957; TS_BOT = 208; } else if (identifier == 0x7783) { name = "ST7781"; TS_LEFT = 865; TS_RT = 155; TS_TOP = 942; TS_BOT = 153; SwapXY = 1; } else if (identifier == 0x7789) { name = "ST7789V"; YP = A2; XM = A1; YM = 7; XP = 6; TS_LEFT = 906; TS_RT = 169; TS_TOP = 161; TS_BOT = 919; } else if (identifier == 0x9320) { name = "ILI9320"; YP = A3; XM = A2; YM = 9; XP = 8; TS_LEFT = 902; TS_RT = 137; TS_TOP = 941; TS_BOT = 134; } else if (identifier == 0x9325) { name = "ILI9325"; TS_LEFT = 900; TS_RT = 103; TS_TOP = 96; TS_BOT = 904; } else if (identifier == 0x9325) { name = "ILI9325 Green Dog"; TS_LEFT = 900; TS_RT = 130; TS_TOP = 940; TS_BOT = 130; } else if (identifier == 0x9327) { name = "ILI9327"; TS_LEFT = 899; TS_RT = 135; TS_TOP = 935; TS_BOT = 79; SwapXY = 1; } else if (identifier == 0x9329) { name = "ILI9329"; TS_LEFT = 143; TS_RT = 885; TS_TOP = 941; TS_BOT = 131; SwapXY = 1; } else if (identifier == 0x9341) { name = "ILI9341 BLUE"; TS_LEFT = 920; TS_RT = 139; TS_TOP = 944; TS_BOT = 150; SwapXY = 0; } else if (identifier == 0) { name = "ILI9341 DealExtreme"; TS_LEFT = 893; TS_RT = 145; TS_TOP = 930; TS_BOT = 135; SwapXY = 1; } else if (identifier == 0 || identifier == 0x9341) { name = "ILI9341"; TS_LEFT = 128; TS_RT = 911; TS_TOP = 105; TS_BOT = 908; SwapXY = 1; } else if (identifier == 0x9486) { name = "ILI9486"; TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158; } else if (identifier == 0x9488) { name = "ILI9488"; TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158; } else if (identifier == 0xB509) { name = "R61509V"; TS_LEFT = 889; TS_RT = 149; TS_TOP = 106; TS_BOT = 975; SwapXY = 1; } else { name = "unknown"; } switch (Orientation) { // adjust for different aspects case 0: break; //no change, calibrated for PORTRAIT case 1: tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = TS_RT, TS_RT = TS_TOP, TS_TOP = tmp; break; case 2: SWAP(TS_LEFT, TS_RT); SWAP(TS_TOP, TS_BOT); break; case 3: tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = TS_RT, TS_RT = TS_BOT, TS_BOT = tmp; break; } Serial.begin(9600); ts = TouchScreen(XP, YP, XM, YM, 300); //call the constructor AGAIN with new values. tft.begin(identifier); show_Serial(); tft.setRotation(Orientation); tft.fillScreen(BLACK); show_tft(); BOXSIZE = tft.width() / 6; tft.fillScreen(BLACK); tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN); tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN); tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE); tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA); tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); currentcolor = RED; delay(1000); } void loop() { uint16_t xpos, ypos; //screen coordinates tp = ts.getPoint(); //tp.x, tp.y are ADC values // if sharing pins, you'll need to fix the directions of the touchscreen pins pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); pinMode(XP, OUTPUT); pinMode(YM, OUTPUT); // digitalWrite(XM, HIGH); // digitalWrite(YP, HIGH); // we have some minimum pressure we consider 'valid' // pressure of 0 means no pressing! if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) { // is controller wired for Landscape ? or are we oriented in Landscape? if (SwapXY != (Orientation & 1)) SWAP(tp.x, tp.y); // scale from 0->1023 to tft.width i.e. left = 0, rt = width // most mcufriend have touch (with icons) that extends below the TFT // screens without icons need to reserve a space for "erase" // scale the ADC values from ts.getPoint() to screen values e.g. 0-239 xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); // are we in top color box area ? if (ypos < BOXSIZE) { //draw white border on selected color box oldcolor = currentcolor; if (xpos < BOXSIZE) { currentcolor = RED; tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 2) { currentcolor = YELLOW; tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 3) { currentcolor = GREEN; tft.drawRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 4) { currentcolor = CYAN; tft.drawRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 5) { currentcolor = BLUE; tft.drawRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 6) { currentcolor = MAGENTA; tft.drawRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, WHITE); } if (oldcolor != currentcolor) { //rub out the previous white border if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); if (oldcolor == GREEN) tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN); if (oldcolor == CYAN) tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN); if (oldcolor == BLUE) tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE); if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA); } } // are we in drawing area ? if (((ypos - PENRADIUS) > BOXSIZE) && ((ypos + PENRADIUS) < tft.height())) { tft.fillCircle(xpos, ypos, PENRADIUS, currentcolor); } // are we in erase area ? if (ypos > tft.height() - 10) { // press the bottom of the screen to erase tft.fillRect(0, BOXSIZE, tft.width(), tft.height() - BOXSIZE, BLACK); } } }Да, то, что надо.
Теперь осталось выкинуть всё лишнее (вся соль в строках 223 - 244), сейчас недосуг, завтра займусь.
тыкнуть пальчик в участок это это?
243тыкнуть пальчик в участок это это?
В смысле "что означают эти строки, и для чего они нужны" ?
Вот урезанный скетч, (проверить его работоспособность мне не на чем) хорошо бы его попробовать на железе.
Монитор последовательного порта опять же неплохо запустить.
#include <Adafruit_GFX.h> // Core graphics library #include <MCUFRIEND_kbv.h> MCUFRIEND_kbv tft; // hard-wired for UNO shields anyway. #include <TouchScreen.h> #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif // most mcufriend shields use these pins and Portrait mode: uint8_t YP = A1; // must be an analog pin, use "An" notation! uint8_t XM = A2; // must be an analog pin, use "An" notation! uint8_t YM = 7; // can be a digital pin uint8_t XP = 6; // can be a digital pin uint8_t SwapXY = 0; uint16_t TS_LEFT = 920; uint16_t TS_RT = 150; uint16_t TS_TOP = 940; uint16_t TS_BOT = 120; char *name = "Unknown controller"; // For better pressure precision, we need to know the resistance // between X+ and X- Use any multimeter to read it // For the one we're using, its 300 ohms across the X plate TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); TSPoint tp; uint16_t xpos, ypos; // screen coordinates #define MINPRESSURE 20 #define MAXPRESSURE 1000 #define SWAP(a, b) {uint16_t tmp = a; a = b; b = tmp;} uint16_t identifier; uint8_t Orientation = 0; //PORTRAIT // Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF void show_Serial(void) { Serial.print(F("Found ")); Serial.print(name); Serial.println(F(" LCD driver")); Serial.print(F("ID=0x")); Serial.println(identifier, HEX); Serial.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); Serial.println("Calibration is: "); Serial.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); Serial.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); Serial.print("Wiring is: "); Serial.println(SwapXY ? "SWAPXY" : "PORTRAIT"); Serial.println("YP=" + String(YP) + " XM=" + String(XM)); Serial.println("YM=" + String(YM) + " XP=" + String(XP)); } void show_tft(void) { tft.fillScreen(BLACK); tft.setTextColor(WHITE, BLACK); tft.setCursor(0, 0); tft.setTextSize(2); tft.println("tp.x=" + String(tp.x) + " tp.y=" + String(tp.y) + " tp.z=" + String(tp.z)); tft.print("xpos=" + String(xpos) + " ypos=" + String(ypos)); } void setup(void) { uint16_t tmp; tft.begin(9600); tft.reset(); identifier = tft.readID(); // if (identifier == 0) identifier = 0x9341; if (0) { } else if (identifier == 0x0154) { name = "S6D0154"; TS_LEFT = 914; TS_RT = 181; TS_TOP = 957; TS_BOT = 208; } else if (identifier == 0x7783) { name = "ST7781"; TS_LEFT = 865; TS_RT = 155; TS_TOP = 942; TS_BOT = 153; SwapXY = 1; } else if (identifier == 0x7789) { name = "ST7789V"; YP = A2; XM = A1; YM = 7; XP = 6; TS_LEFT = 906; TS_RT = 169; TS_TOP = 161; TS_BOT = 919; } else if (identifier == 0x9320) { name = "ILI9320"; YP = A3; XM = A2; YM = 9; XP = 8; TS_LEFT = 902; TS_RT = 137; TS_TOP = 941; TS_BOT = 134; } else if (identifier == 0x9325) { name = "ILI9325"; TS_LEFT = 900; TS_RT = 103; TS_TOP = 96; TS_BOT = 904; } else if (identifier == 0x9325) { name = "ILI9325 Green Dog"; TS_LEFT = 900; TS_RT = 130; TS_TOP = 940; TS_BOT = 130; } else if (identifier == 0x9327) { name = "ILI9327"; TS_LEFT = 899; TS_RT = 135; TS_TOP = 935; TS_BOT = 79; SwapXY = 1; } else if (identifier == 0x9329) { name = "ILI9329"; TS_LEFT = 143; TS_RT = 885; TS_TOP = 941; TS_BOT = 131; SwapXY = 1; } else if (identifier == 0x9341) { name = "ILI9341 BLUE"; TS_LEFT = 920; TS_RT = 139; TS_TOP = 944; TS_BOT = 150; SwapXY = 0; } else if (identifier == 0) { name = "ILI9341 DealExtreme"; TS_LEFT = 893; TS_RT = 145; TS_TOP = 930; TS_BOT = 135; SwapXY = 1; } else if (identifier == 0 || identifier == 0x9341) { name = "ILI9341"; TS_LEFT = 128; TS_RT = 911; TS_TOP = 105; TS_BOT = 908; SwapXY = 1; } else if (identifier == 0x9486) { name = "ILI9486"; TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158; } else if (identifier == 0x9488) { name = "ILI9488"; TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158; } else if (identifier == 0xB509) { name = "R61509V"; TS_LEFT = 889; TS_RT = 149; TS_TOP = 106; TS_BOT = 975; SwapXY = 1; } else { name = "unknown"; } switch (Orientation) { // adjust for different aspects case 0: break; //no change, calibrated for PORTRAIT case 1: tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = TS_RT, TS_RT = TS_TOP, TS_TOP = tmp; break; case 2: SWAP(TS_LEFT, TS_RT); SWAP(TS_TOP, TS_BOT); break; case 3: tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = TS_RT, TS_RT = TS_BOT, TS_BOT = tmp; break; } Serial.begin(9600); ts = TouchScreen(XP, YP, XM, YM, 300); //call the constructor AGAIN with new values. tft.begin(identifier); tft.setRotation(Orientation); tft.fillScreen(BLACK); show_Serial(); tft.setTextColor(WHITE, BLACK); tft.setCursor(0, 0); tft.setTextSize(2); tft.print("PRESS TOUCHSCREEN..."); } void loop() { tp = ts.getPoint(); // тач можно представить себе как три переменных сопротивления, считываем их значения в tp.x, tp.y и tp.z // общие пины возвращаем в нужное экрану состояние pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); pinMode(XP, OUTPUT); pinMode(YM, OUTPUT); if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) { // если с ориентацией экрана ничего не планируется делать, // то от этой строки потом можно будет избавиться if (SwapXY != (Orientation & 1)) SWAP(tp.x, tp.y); // а теперь считанные значения (от 0 до 1023) наших "переменных сопротивлений" // превращаем в некие координаты экрана (X от 0 до tft.width()), (Y от 0 до tft.height()) // чем точнее для данного экземпляра экрана прописаны TS_LEFT,TS_RT,TS_TOP,TS_BOT, // тем точнее будет превращение. xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); show_tft(); Serial.print("X = "); Serial.print(xpos); Serial.print(" Y = "); Serial.print(ypos); } }В процессе адаптации скетча под конкретный экран от почти всех строк 85-146 можно будет избавиться.
тыкнуть пальчик в участок это это?
В смысле "что означают эти строки, и для чего они нужны" ?
Начинаю работать над собой, полёт моей мысли уже никто не понимает )))
Поясняю - вопрос - что делает команда map в этих строках и для чего
Прочитал пояснение, вопрос снят
У меня как раз ILI9341 но библиотеки другие
Спасибо! Все работает.
Только иногда показывает по y чуть больше точек чем положено) 324-326
Не удивляйтесь, это же дешевый резистивный тачскрин, у него показания плавают от температуры, напряжения, времени, направления ветра и цены за баррель..