touch screen, как поменять

an4ous
Offline
Зарегистрирован: 21.09.2015
всем привет,имеется код, основа для возможно будующего меню типа вкл/откл лампочку или на подобии, но есть проблема с координатами сенсора.
при 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
    }
  }
  
}

 

an4ous
Offline
Зарегистрирован: 21.09.2015

И еще, как редактировать тему?

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Крутить можно по 4 сторонам, то есть функция поворота может принимать 4 значения: 0, 1, 2 и 3. Ещё нужно настроить тач на точность касания, в примере это записано, по умолчанию значение при инициализации тача заданно 300, нужно измерить мультиметром сопротивление своего тача, между иксами в омах и вписать его.

MagicianT
Offline
Зарегистрирован: 03.10.2015
Что-бы разобраться, добавьте 
        Serial.print("\n");

        Serial.print("\tX = ");
        Serial.print( p.x, DEC);
        Serial.print("\tY = ");
        Serial.print( p.y, DEC);     


тогда будет видно где нажато а где кнопка

 

an4ous
Offline
Зарегистрирован: 21.09.2015

сопротивение касания можно посмoтреть тут Serial.print("\tPressure = "); Serial.println(p.z); b , и выставить наиболее удобный диапазон

крутить то можно, так надо и ТАЧ вместе и экранчиком поворачивать

 

куда это вставлять?,что то не разобрался я

<span style= class="string">"font-family:Verdana, Geneva, Arial, sans-serif;font-size:12px;line-height:1.5em; class="plain"></span>
а 
        Serial.print("\n");

        Serial.print("\tX = ");
        Serial.print( p.x, DEC);
        Serial.print("\tY = ");
        Serial.print( p.y, DEC); 

 

мне не поможет, видеть то я вижу где срабатывает, а вот как точку отсчета координат на другой угол поставить при повороте я не знаю,

an4ous
Offline
Зарегистрирован: 21.09.2015

как вариант

#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

 

an4ous
Offline
Зарегистрирован: 21.09.2015

не ужели никто не знает как перевернуть тач?(

diger67
Offline
Зарегистрирован: 25.07.2015

an4ous пишет:

не ужели никто не знает как перевернуть тач?(

Ксожалению тач имеет жесткую ориентацию. Пеевернуть можно изображение на самом экране с помощью команды ротация экрана. Это связано с тем что выводы тача жестко привязаны к пинам шилда. При работе с тачем приходится мыслить виртуально ротация(0) Хa=Хt Ya=Yt, ротация(1) Xa=Yt , Ya =Xt итд. Почитайте все что вам писали в предыдущих постах внимательней и вы все поимете.