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 , и выставить наиболее удобный диапазон
крутить то можно, так надо и ТАЧ вместе и экранчиком поворачивать
куда это вставлять?,что то не разобрался я
мне не поможет, видеть то я вижу где срабатывает, а вот как точку отсчета координат на другой угол поставить при повороте я не знаю,
как вариант
#define LCDROTATION 1
tft.setRotation(LCDROTATION);
и для каждого значения rotation свой код будет
// в моем случае я патаюсь настроит в положении экрана Rotation 1. если закоментировать любую одну стоку то все работает,в паре эти настройки не работают, HELPPPPPPPPP
не ужели никто не знает как перевернуть тач?(
не ужели никто не знает как перевернуть тач?(
Ксожалению тач имеет жесткую ориентацию. Пеевернуть можно изображение на самом экране с помощью команды ротация экрана. Это связано с тем что выводы тача жестко привязаны к пинам шилда. При работе с тачем приходится мыслить виртуально ротация(0) Хa=Хt Ya=Yt, ротация(1) Xa=Yt , Ya =Xt итд. Почитайте все что вам писали в предыдущих постах внимательней и вы все поимете.