Как получить координаты 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 , кстати, функция чтения тача интересно выглядит (у меня почти также работает) :
Shared pins - видите ? Ещё и с выставлением HIGH.
И здесь https://github.com/prenticedavid/MCUFRIEND_kbv/blob/master/examples/TouchScreen_Calibr_kbv/TouchScreen_Calibr_kbv.ino то же самое :
Паинт
Спасибо, но что-то я сомневаюсь (судя по набору библиотек), что это именно тот скетч, который упоминает d3moman.
буду следить внимательно, у меня аналогичная задача, тыкнуть пальчиком в область примерно 1х1 см чтобы отработала определённая функция
Извините парни, с работы на форуме не сижу. Сейчас скину
Очень страное решение завести экран и тач на одни пины...очень странная экономия.
Вот.Вот этот код по идее выводит координаты на экран + включает ПЕИНТ.
Координаты кстати выводит странные, минимум по х - 176, по y -1180 вроде
Да, то, что надо.
Теперь осталось выкинуть всё лишнее (вся соль в строках 223 - 244), сейчас недосуг, завтра займусь.
тыкнуть пальчик в участок это это?
243
тыкнуть пальчик в участок это это?
В смысле "что означают эти строки, и для чего они нужны" ?
Вот урезанный скетч, (проверить его работоспособность мне не на чем) хорошо бы его попробовать на железе.
Монитор последовательного порта опять же неплохо запустить.
В процессе адаптации скетча под конкретный экран от почти всех строк 85-146 можно будет избавиться.
тыкнуть пальчик в участок это это?
В смысле "что означают эти строки, и для чего они нужны" ?
Начинаю работать над собой, полёт моей мысли уже никто не понимает )))
Поясняю - вопрос - что делает команда map в этих строках и для чего
Прочитал пояснение, вопрос снят
У меня как раз ILI9341 но библиотеки другие
Спасибо! Все работает.
Только иногда показывает по y чуть больше точек чем положено) 324-326
Не удивляйтесь, это же дешевый резистивный тачскрин, у него показания плавают от температуры, напряжения, времени, направления ветра и цены за баррель..