touch screen, как поменять
- Войдите на сайт для отправки комментариев
Втр, 03/11/2015 - 13:19
всем привет,имеется код, основа для возможно будующего меню типа вкл/откл лампочку или на подобии, но есть проблема с координатами сенсора.
при setRotation 0 отсчет координат как положенно, с левого верхнего угла. но когда меняю setRotation 1 отсчет оси y ведется с правого верхнего угла.
подскажите как исправитьможно? целый вечер пытался разобраться, но без результата(
#include <Adafruit_GFX.h> // Core graphics library
#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
#define YP A1 // must be an analog pin, use "An" notation!
#define XM A2 // must be an analog pin, use "An" notation!
#define YM 7 // can be a digital pin
#define XP 6 // can be a digital pin
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
/******************* UI details */
#define BUTTON_X 60 //отступ от х
#define BUTTON_Y 20 //отступ от у
#define BUTTON_W 90 //ширина кнопки
#define BUTTON_H 35 //высота кнопки
#define BUTTON_SPACING_X 20 //отступ между кнопками по х
#define BUTTON_SPACING_Y 10 //отступ между кнопками по у
#define BUTTON_TEXTSIZE 2 //размер текста
#define STATUS_X 10
#define STATUS_Y 65
#define TS_MINX 150
#define TS_MINY 130
#define TS_MAXX 920
#define TS_MAXY 900
int ledPin = 13;
MCUFRIEND_kbv tft;
Adafruit_GFX_Button buttons[7];
char buttonlabels[7][7] = {"On", "1", "2", "3", "4", "5", "6"};
uint16_t buttoncolors[7] = {GREEN, GREEN, GREEN,
BLUE, BLUE, BLUE, BLUE };
void setup(void) {
Serial.begin(9600);
Serial.println(F("TFT LCD test"));
pinMode(ledPin, OUTPUT);
tft.reset();
tft.begin(0x9488);
tft.fillScreen(BLACK);
tft.setRotation(0);
// create buttons row hzl, соl колонки
for (uint8_t row=0; row<7; row++) {
for (uint8_t col=0; col<1; col++) {
buttons[col + row*1].initButton(&tft, BUTTON_X+col*(BUTTON_W),
BUTTON_Y+row*(BUTTON_H+BUTTON_SPACING_Y), // x, y, w, h, outline, fill, text
BUTTON_W, BUTTON_H, WHITE, buttoncolors[col+row*1], WHITE,
buttonlabels[col + row*1], BUTTON_TEXTSIZE);
buttons[col + row*1].drawButton();
}
}
tft.drawRect(0, 0, 120, 320, RED);
tft.drawRect(1, 1, 118, 318, RED);
}
#define MINPRESSURE 10
#define MAXPRESSURE 1000
void loop(void) {
/* TSPoint p;
p = ts.getPoint();
*/
TSPoint p = ts.getPoint();
// if sharing pins, you'll need to fix the directions of the touchscreen pins
//pinMode(XP, OUTPUT);
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
//pinMode(YM, OUTPUT);
if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
// scale from 0->1023 to tft.width
p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);
p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);
// go thru all the buttons, checking if they were pressed
for (uint8_t b=0; b<7; b++) {
if (buttons[b].contains(p.x, p.y)) {
buttons[b].press(true); // tell the button it is pressed
} else {
buttons[b].press(false); // tell the button it is NOT pressed
}
}
// now we can ask the buttons if their state has changed
for (uint8_t b=0; b<7; b++) {
if (buttons[b].justReleased()) {
buttons[b].drawButton(); // draw normal
}
if (buttons[b].justPressed()) {
buttons[b].drawButton(true); // draw invert!
// if a numberpad button, append the relevant # to the textfield
if (b >= 3) {/*
if (textfield_i < TEXT_LEN) {
textfield[textfield_i] = buttonlabels[b][0];
textfield_i++;
textfield[textfield_i] = 0; // zero terminate
}*/
}
//Serial.println(textfield);
//tft.print(textfield); печать в окно
if (b == 0) { //led 0
Serial.print("led on");
digitalWrite(ledPin, HIGH); // выключаем LED
}
if (b == 1) {
}
if (b == 2) {
Serial.print("led off");
digitalWrite(ledPin, LOW); // включаем LED
}
delay(200); // UI debouncing
}
}
}
И еще, как редактировать тему?
Крутить можно по 4 сторонам, то есть функция поворота может принимать 4 значения: 0, 1, 2 и 3. Ещё нужно настроить тач на точность касания, в примере это записано, по умолчанию значение при инициализации тача заданно 300, нужно измерить мультиметром сопротивление своего тача, между иксами в омах и вписать его.
Serial.print("\n"); Serial.print("\tX = "); Serial.print( p.x, DEC); Serial.print("\tY = "); Serial.print( p.y, DEC); тогда будет видно где нажато а где кнопкасопротивение касания можно посмoтреть тут Serial.print("\tPressure = "); Serial.println(p.z); b , и выставить наиболее удобный диапазон
крутить то можно, так надо и ТАЧ вместе и экранчиком поворачивать
куда это вставлять?,что то не разобрался я
Serial.print("\n"); Serial.print("\tX = "); Serial.print( p.x, DEC); Serial.print("\tY = "); Serial.print( p.y, DEC);мне не поможет, видеть то я вижу где срабатывает, а вот как точку отсчета координат на другой угол поставить при повороте я не знаю,
как вариант
#define LCDROTATION 1
tft.setRotation(LCDROTATION);
и для каждого значения rotation свой код будет
// в моем случае я патаюсь настроит в положении экрана Rotation 1. если закоментировать любую одну стоку то все работает,в паре эти настройки не работают, HELPPPPPPPPP
#if LCDROTATION == 0 //rot1 #elif LCDROTATION == 1 if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { p.x = tft.height()-(map(p.y, TS_MINX, TS_MAXX, tft.height(), 0)); p.y = tft.width()-(map(p.x, TS_MINX, TS_MAXX, 0, tft.width())); Serial.print("X = "); Serial.print(p.x); Serial.print("\tY = "); Serial.print(p.y); Serial.print("\tPressure = "); Serial.println(p.z) } } #elif LCDROTATION == 2 //rot2 #elif LCDROTATION == 3 //rot3 #endifне ужели никто не знает как перевернуть тач?(
не ужели никто не знает как перевернуть тач?(
Ксожалению тач имеет жесткую ориентацию. Пеевернуть можно изображение на самом экране с помощью команды ротация экрана. Это связано с тем что выводы тача жестко привязаны к пинам шилда. При работе с тачем приходится мыслить виртуально ротация(0) Хa=Хt Ya=Yt, ротация(1) Xa=Yt , Ya =Xt итд. Почитайте все что вам писали в предыдущих постах внимательней и вы все поимете.