chiedo aiuto con schermo tft

salve ragazzi sto impazzendo nel provare a configurare questo ( https://www.amazon.it/Display-LCD-Schermo-480x320-Arduino/dp/B07KK4NV3V/ref=sr_1_fkmr2_2?__mk_it_IT=ÅMÅŽÕÑ&dchild=1&keywords=schermo+lcd+tft+da3%2C5&qid=1587060852&sr=8-2-fkmr2), un tizio nelle recensione suggerisce la libreria MCUFRIEND_kbv 2.9.8 , dunque la scarico e la provo ma non va.
dunque cerco altro e mi imbatto in questa MCUFRIEND_kbv-master che funziona bene (almeno gli esempi )
,visto che qualsiasi cosa io provi a cambiare mi da errore...
dunque quello che io dovrei fare e inserire una serie di "tasti"che mi portino a dei sotto menù e che mi permettano di visualizzare i dati forniti dai vai sensoripresenti nellaserradi idroponica e compiere azioni di conseguenza quindi vorrei raggiungere un livello di interattivitàconloschermo che mi permetta di nondoverlo collegare più al pc .

...spero in qualche risposta e grazie in anticipo

ciao

cosa modifichi rispetto agli esempi? che errori ti da?

mi dice che non trova la libreria adafruit quindi provo a riaggiungerla ma mi dice che la libreria è già presente .... magari domani provo ad aggiungere una foto del codice d'errore

trovato l errore mi diceva che avevo troppe librerie con gli stessi file ,quindi ho fatto pulizia e ho ricominciato …
faccio la prova presente negli esempi provando a modificare la rotazione sul display o le distanze o i colori(roba molto semplice) , mi esegue tutto ma il touch rimane sulla posizione verticale con cui lo sketch è nato

posto qui sotto lo schema modificato così potete suggerirmi cosa cambiare …

(Code tags please </> on the menu. Thank you. Moderator)

#if 1

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#define MINPRESSURE 20
#define MAXPRESSURE 1000

// ALL Touch panels and wiring is DIFFERENT
// copy-paste results from TouchScreen_Calibr_native.ino
const int XP=8,XM=A2,YP=A3,YM=9; //320x480 ID=0x9486
const int TS_LEFT=166,TS_RT=915,TS_TOP=913,TS_BOT=97;


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

Adafruit_GFX_Button on_btn, off_btn;

int pixel_y, pixel_x;     //Touch_getXY() updates global vars
bool Touch_getXY(void)
{
   TSPoint p = ts.getPoint();
   pinMode(YP, OUTPUT);      //restore shared pins
   pinMode(XM, OUTPUT);
   digitalWrite(YP, HIGH);   //because TFT control pins
   digitalWrite(XM, HIGH);
   bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
   if (pressed) {
       pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
       pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
   }
   return pressed;
}

#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 setup(void)
{
   Serial.begin(9600);
   uint16_t ID = tft.readID();
   Serial.print("TFT ID = 0x");
   Serial.println(ID, HEX);
   Serial.println("Calibrate for your Touch Panel");
   if (ID == 0xD3D3) ID = 0x9486; // write-only shield
   tft.begin(ID);
   tft.setRotation(1);            //PORTRAIT
   tft.fillScreen(CYAN);
   on_btn.initButton(&tft,  80, 200, 100, 40, BLACK,MAGENTA, BLACK, "ON", 2);
   off_btn.initButton(&tft, 200, 200, 100, 40, BLACK, MAGENTA, BLACK, "OFF", 2);
   on_btn.drawButton(false);
   off_btn.drawButton(false);
   tft.fillRect(80, 80, 130, 80, RED);
}

/* two buttons are quite simple
*/
void loop(void)
{
   bool down = Touch_getXY();
   on_btn.press(down && on_btn.contains(pixel_y, pixel_x));
   off_btn.press(down && off_btn.contains(pixel_y, pixel_x));
   if (on_btn.justReleased())
       on_btn.drawButton();
   if (off_btn.justReleased())
       off_btn.drawButton();
   if (on_btn.justPressed()) {
       on_btn.drawButton(true);
       tft.fillRect(40, 80, 160, 80, BLUE);
   }
   if (off_btn.justPressed()) {
       off_btn.drawButton(true);
       tft.fillRect(40, 80, 160, 80, RED);
   }
}
#endif

ciao…purtroppo non ho modo di provare il programma…non mi è chiaro il "il touch rimane sulla posizione verticale con cui lo sketch è nato "
puoi spiegare?

dunque lo sketch nasce impostato in "set.rotation(0) " cioè in una visualizzazione verticale ,ho provato dunque a ruotare il tutto cambiando lo 0 con un 1 e quindi spostare il tutto in maniera orizzontale .
Il risultato ottenuto è una rotazione da parte della grafica dei pulsanti ,mentre le coordinate dei punti in cui il monitor percepisce il tocco per dare il comando ai tasti è rimasta sempre al punto di origine (cioè in verticale )

nessuno riesce ad aiutarmi?

Guardando la libreria TouchScreen di Adafruit non mi pare sia possibile "ruotare" le coordinate del touch
Però ci sono due funzioni readTouchY() e readTouchX()
se lo schermo è ruotato di 90, penso basta invertirli, usi readTouchY per la X e readTouchX per Y

ciao,

@nid69ita: non vorrei sbagliare ma c'è la funzione tft.setRotation(1); dove tft è un'istanza della MCUFRIEND_kbv.h; questa funzione ha al suo interno, tra le tante cose, lo switch:

    switch (rotation) {
    case 0:                    //PORTRAIT:
        val = 0x48;             //MY=0, MX=1, MV=0, ML=0, BGR=1
        break;
    case 1:                    //LANDSCAPE: 90 degrees
        val = 0x28;             //MY=0, MX=0, MV=1, ML=0, BGR=1
        break;
    case 2:                    //PORTRAIT_REV: 180 degrees
        val = 0x98;             //MY=1, MX=0, MV=0, ML=1, BGR=1
        break;
    case 3:                    //LANDSCAPE_REV: 270 degrees
        val = 0xF8;             //MY=1, MX=1, MV=1, ML=1, BGR=1
        break;

dove rotation è, diciamo, il valore in ingresso.

@kiki91: cerca l'esempio "aspect_kbv" e verifica se fa quello che vorresti

PS: dimenticavo...hai dato una letta al file mcufriend_how_to.txt per vedere se tutte le impostazioni sono corrette per il tuo sistema?

ciao @ORSO2001 l esempio “aspect_kbv” mi fa vedere sullo schermo una serie di scritte in loop che ruotano in tutte e quattro i sensi ,ma non ho modo di interagire con il touch, quindi ha solo la funzione che io riesco a replicare spostando "set.rotation"da 0 a 1 …

1. The Arduino Library Manager should find and install MCUFRIEND_kbv library

2. Install the Adafruit_GFX library if not already in your User libraries.

3. Insert your Mcufriend style display shield into UNO.   Only 28-pin shields are supported.

4. Build any of the Examples from the File->Examples->Mcufriend_kbv menu.  e.g. graphictest_kbv.ino

5. Most of them will write some text to the Serial window (9600 baud).   The BMP examples require you to copy the pictures from the bitmaps/ folder to your microSD (root directory)

6. This library is only intended for UNO and these specific Shields.   It will work on a MEGA2560 but not very fast.

7. The constructor takes no arguments (because it only works with these shields)

8. The examples are the standard Adafruit ones.   You can see my edits by searching for "kbv"

9. Any Adafruit sketch should work with the MCUFRIEND_kbv constructor() but should allow extra ID values
An Adafruit constructor(cs, rs, wr, rd, rst) IGNORES any arguments.   i.e. it only uses the shield control pins

MCUFRIEND_kbv inherits all the methods from 
the Adafruit_GFX class: https://learn.adafruit.com/adafruit-gfx-graphics-library/overview 
and Print class: https://www.arduino.cc/en/Serial/Print

The only "new" methods are hardware related: 
vertScroll(), readGRAM(), readPixel(), setAddrWindow(), pushColors(), readID(), begin()
readReg(), pushCommand(), WriteCmdData() access the controller registers

10. It currently supports UNO shields with "mcufriend.com" pcbs with controllers:
HX8347-A 240x320  ID=0x8347 #define SUPPORT_8347A *** Untested ***
HX8347-D 240x320  ID=0x4747 #define SUPPORT_8347D
HX8347-G 240x320  ID=0x7575 #define SUPPORT_8347D
HX8347-I 240x320  ID=0x9595 #define SUPPORT_8347D
HX8352-A 240x400  ID=0x5252 #define SUPPORT_8352A
HX8352-B 240x400  ID=0x0065 #define SUPPORT_8352B
HX8357-B 320x480  ID=0x8357 (shares init with 8357-D)
HX8357-C 320x480  ID=0x9090 (ID has changed from 0x8357)
HX8357-D 320x480  ID=0x0099 #define SUPPORT_8357D_GAMMA
HX8367-A 240x320  ID=0x6767 #define SUPPORT_8347D
ILI9225  176x220  ID=0x9225 #define SUPPORT_9225 
ILI9226  176x220  ID=0x9226 #define SUPPORT_9225 
ILI9302  240x320  ID=0x9302 
ILI9320  240x320  ID=0x9320
ILI9325  240x320  ID=0x9325
ILI9326  240x400  ID=0x9326 #define SUPPORT_9326_5420
ILI9327  240x400  ID=0x9327
ILI9328  240x320  ID=0x9328 
ILI9329  240x320  ID=0x9329 
ILI9331  240x320  ID=0x9331 
ILI9335  240x320  ID=0x9335 
ILI9338  240x320  ID=0x9338 
ILI9340  240x320  ID=0x9340 
ILI9341  240x320  ID=0x9341 
ILI9342  320x240  ID=0x9342 #define SUPPORT_9342 
ILI9481  320x480  ID=0x9481  
ILI9486  320x480  ID=0x9486
ILI9487  320x480  ID=0x9487
ILI9488  320x480  ID=0x9488 (weird 555 display :#define SUPPORT_9488_555) 
LGDP4532 240x320  ID=0x4532 #define SUPPORT_4532
LGDP4535 240x320  ID=0x4535 #define SUPPORT_4535
NT35310  320x480  ID=0x5310 (hardware must be set for 8-bit parallel)
R61505   240x320  ID=0x1505 works like an ILI9320
R61505V  240x320  ID=0xB505
R61505W  240x320  ID=0xC505 
R61509V  240x400  ID=0xB509 #define SUPPORT_B509_7793
R61520   240x320  ID=0x1520 (no Vertical Scroll)
R61526A  240x320  ID=0x1526 (no Vertical Scroll) configure NVM with sketch
R61580   240x320  ID=0x1580 #define SUPPORT_1580 *** Untested ***
R61581   320x480  ID=0x1581
RM68090  240x320  ID=0x6809
RM68140  320x480  ID=0x6814 #define SUPPORT_68140
S6D0139  240x320  ID=0x0139 #define SUPPORT_0139 (no Band Scroll)
S6D0154  240x320  ID=0x0154 #define SUPPORT_0154
SPFD5408 240x320  ID=0x5408
SPFD5420 240x400  ID=0x5420 #define SUPPORT_9326_5420
SSD1963  800x480  ID=0x1963
SSD1289  240x320  ID=0x1289 #define SUPPORT_1289
ST7781   240x320  ID=0x7783 #define SUPPORT_7781 (no Vertical Scroll)
ST7789V  240x320  ID=0x7789
ST7793   240x400  ID=0x7793 #define SUPPORT_B509_7793
ST7796   320x480  ID=0x7796
UC8230   240x320  ID=0x8230 #define SUPPORT_8230
UNKNOWN  320x480  ID=0x1511 (scroll directions not correct)
UNKNOWN  240x320  ID=0x1602
UNKNOWN  240x320  ID=0xAC11
UNKNOWN  240x320  ID=0x2053 weird controller from BangGood (was ID=0x0000)
UNKNOWN  240x320  ID=0x8031 (no Vertical Scroll)

Most of these controllers are #define SUPPORT_xxxx by default.
You can save Flash memory on a Uno by commenting out the macro(s) in MCUFRIEND_kbv.cpp

11. It should run on a UNO, MEGA2560, LEONARDO, DUE, ZERO, M0-PRO, 
It also runs on NUCLEO-F103 and TEENSY3.2 with Sparkfun Adapter

12. These Mcufriend-style shields tend to have a resistive TouchScreen on A1, 7, A2, 6 but are not always the same rotation of direction.
   The TouchScreen_Calibr_native.ino sketch wiil diagnose Touch Pins, do Calibration, report to Serial Terminal.
The Calibration should work with the TouchScreen.h library from Adafruit.
You can always copy the local TouchScreen_kbv.h library from sketch to the global user libraries folder.

13. The graphictest_kbv.ino sketch runs the standard Adafruit tests and reports the execution time.
   The Scroll tests show each screen rotation, colours, scroll directions, colour inversion.
   Vertical scroll is up/down in Portrait modes.  Left/right in Landscape
   Band Scroll should just move the coloured Band.   ILI9320 style will always move the whole screen. 
   The text "SOFTWARE SCROLL" should move horizontally across the screen or report a readPixel() ERROR.

14. The scroll_kbv.ino sketch should scroll a window or subwindow for most chips.   Not all chips can scroll.

15. The readpixel_kbv.ino sketch should display memory in each aspect. 

16. The GLUE_Demo_320x240.ino sketch uses a "GLUE" class to display a UTFT sketch on supported mcufriend shields.   
   It is NOT perfect.   Please report any problems.    It is designed as a CONVENIENCE for legacy UTFT code.   
   Please use MCUFRIEND_kbv method()s in new code. 

17. If you do not have a standard Uno Shield, you can add a SPECIAL to the mcufriend_special.h
   Edit mcufriend_shield.h:  #define USE_SPECIAL
   Edit mcufriend_special.h: e.g. #define USE_MEGA_16BIT_SHIELD
   If your "special" is write-only,  the library can not read the ID.  It always returns 0xD3D3

18. Please run LCD_ID_readreg.ino to verify your non-standard wiring.  Paste the defines to a Forum message.

19. OPEN-SMART Shields have different wiring to regular Uno Shields:
   Edit mcufriend_shield.h:  #define USE_SPECIAL
   Edit mcufriend_special.h: #define USE_OPENSMART_SHIELD_PINOUT
   Edit MCUFRIEND_kbv.cpp:   #define SUPPORT_8352B

CHANGE HISTORY: is now in "mcufriend_history.txt"

qui ho riportato quello che mi dice il file mcufriend_how_to.txt ma onestamente non ho trovato nulla che mi potesse far arrivare ad una soluzione e non sono riuscito neanche a trovare tali indicazioni

 switch (rotation) {
    case 0:                    //PORTRAIT:
        val = 0x48;             //MY=0, MX=1, MV=0, ML=0, BGR=1
        break;
    case 1:                    //LANDSCAPE: 90 degrees
        val = 0x28;             //MY=0, MX=0, MV=1, ML=0, BGR=1
        break;
    case 2:                    //PORTRAIT_REV: 180 degrees
        val = 0x98;             //MY=1, MX=0, MV=0, ML=1, BGR=1
        break;
    case 3:                    //LANDSCAPE_REV: 270 degrees
        val = 0xF8;             //MY=1, MX=1, MV=1, ML=1, BGR=1
        break;

@nid69ita dove posso trovare le funzioni "readTouchY() e readTouchX()"per provare ad invertirle?

kiki91:
@nid69ita dove posso trovare le funzioni "readTouchY() e readTouchX()"per provare ad invertirle?

Libreria TouchScreen ma quella di Adafruit. Non so quale tu stai usando.

quando provi ad eseguire il tuo programma con i pulsanti...che ID ti stampa sul monitor seriale?

@ORSO2001 mi stampa come 0x9486

@nid69ita al momento le librerie a cui faccio riferimento sono queste

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>

ciao

ho riletto meglio quello che hai scritto …prima avevo capito male cosa ti serviva.

il problema è che l’istanza del TouchScreen, come dice nid69ita, non ha metodi per “ruotare” le coordinate…tu però hai una funzione che ti dice se è premuto il touch ed imposta x ed y…

provare a fare una cosa del genere…ho messo una define ROTATION da impostare a 0 od 1:

#if 1

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#define MINPRESSURE 20
#define MAXPRESSURE 1000
#define ROTATION 0 // se impostato ad 1 girato di 90°


// ALL Touch panels and wiring is DIFFERENT
// copy-paste results from TouchScreen_Calibr_native.ino
const int XP=8,XM=A2,YP=A3,YM=9; //320x480 ID=0x9486
const int TS_LEFT=166,TS_RT=915,TS_TOP=913,TS_BOT=97;


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

Adafruit_GFX_Button on_btn, off_btn;

int pixel_y, pixel_x;     //Touch_getXY() updates global vars
bool Touch_getXY(void)
{
   TSPoint p = ts.getPoint();
   pinMode(YP, OUTPUT);      //restore shared pins
   pinMode(XM, OUTPUT);
   digitalWrite(YP, HIGH);   //because TFT control pins
   digitalWrite(XM, HIGH);
   bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
   if (pressed) {
	   if(!ROTATION ){
       pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
       pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
	   }
	   else{
	   pixel_y = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //scambio tra y ed x
       pixel_x = map(p.y, TS_TOP, TS_BOT, 0, tft.height()); 
	   }
   }
   return pressed;
}

#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 setup(void)
{
   Serial.begin(9600);
   uint16_t ID = tft.readID();
   Serial.print("TFT ID = 0x");
   Serial.println(ID, HEX);
   Serial.println("Calibrate for your Touch Panel");
   if (ID == 0xD3D3) ID = 0x9486; // write-only shield
   tft.begin(ID);
   tft.setRotation(ROTATION );            //PORTRAIT
   tft.fillScreen(CYAN);
   on_btn.initButton(&tft,  80, 200, 100, 40, BLACK,MAGENTA, BLACK, "ON", 2);
   off_btn.initButton(&tft, 200, 200, 100, 40, BLACK, MAGENTA, BLACK, "OFF", 2);
   on_btn.drawButton(false);
   off_btn.drawButton(false);
   tft.fillRect(80, 80, 130, 80, RED);
}

/* two buttons are quite simple
*/
void loop(void)
{
   bool down = Touch_getXY();
   on_btn.press(down && on_btn.contains(pixel_y, pixel_x));
   off_btn.press(down && off_btn.contains(pixel_y, pixel_x));
   if (on_btn.justReleased())
       on_btn.drawButton();
   if (off_btn.justReleased())
       off_btn.drawButton();
   if (on_btn.justPressed()) {
       on_btn.drawButton(true);
       tft.fillRect(40, 80, 160, 80, BLUE);
   }
   if (off_btn.justPressed()) {
       off_btn.drawButton(true);
       tft.fillRect(40, 80, 160, 80, RED);
   }
}
#endif

seguendo lo sketch con le modifiche da te riportate , il risultato è una rotazione di 180° … siamo vicini alla soluzione ma non è ancora la modifica corretta …( potrebbe essere una soluzione installare altre librerie che prevedono una rotazione, o addirittura comprare un altro schermo? )

penso solo le coordinate...i pulsanti sono ruotati correttamente giusto?

ad ogni modo confermi che con questa modifica l'angolo in alto a SX (che dovrebbe avere coordinate 0x0) è divenuto l'angolo in basso a destra!?

si esatto

prova questo codice:

#if 1

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#define MINPRESSURE 20
#define MAXPRESSURE 1000
#define ROTATION 0 // se impostato ad 1 girato di 90°


// ALL Touch panels and wiring is DIFFERENT
// copy-paste results from TouchScreen_Calibr_native.ino
const int XP=8,XM=A2,YP=A3,YM=9; //320x480 ID=0x9486
const int TS_LEFT=166,TS_RT=915,TS_TOP=913,TS_BOT=97;


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

Adafruit_GFX_Button on_btn, off_btn;

int pixel_y, pixel_x;     //Touch_getXY() updates global vars
bool Touch_getXY(void)
{
   TSPoint p = ts.getPoint();
   pinMode(YP, OUTPUT);      //restore shared pins
   pinMode(XM, OUTPUT);
   digitalWrite(YP, HIGH);   //because TFT control pins
   digitalWrite(XM, HIGH);
   bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
   if (pressed) {
	   if(!ROTATION ){
       pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
       pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
	   }
	   else{
	   pixel_y = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
       pixel_x = map(p.y, TS_BOT, TS_TOP, 0, tft.height()); 
	   }
   }
   return pressed;
}

#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 setup(void)
{
   Serial.begin(9600);
   uint16_t ID = tft.readID();
   Serial.print("TFT ID = 0x");
   Serial.println(ID, HEX);
   Serial.println("Calibrate for your Touch Panel");
   if (ID == 0xD3D3) ID = 0x9486; // write-only shield
   tft.begin(ID);
   tft.setRotation(ROTATION );            //PORTRAIT
   tft.fillScreen(CYAN);
   on_btn.initButton(&tft,  80, 200, 100, 40, BLACK,MAGENTA, BLACK, "ON", 2);
   off_btn.initButton(&tft, 200, 200, 100, 40, BLACK, MAGENTA, BLACK, "OFF", 2);
   on_btn.drawButton(false);
   off_btn.drawButton(false);
   tft.fillRect(80, 80, 130, 80, RED);
}

/* two buttons are quite simple
*/
void loop(void)
{
   bool down = Touch_getXY();
   on_btn.press(down && on_btn.contains(pixel_y, pixel_x));
   off_btn.press(down && off_btn.contains(pixel_y, pixel_x));
   if (on_btn.justReleased())
       on_btn.drawButton();
   if (off_btn.justReleased())
       off_btn.drawButton();
   if (on_btn.justPressed()) {
       on_btn.drawButton(true);
       tft.fillRect(40, 80, 160, 80, BLUE);
   }
   if (off_btn.justPressed()) {
       off_btn.drawButton(true);
       tft.fillRect(40, 80, 160, 80, RED);
   }
}
#endif

eseguendo questo codice il risultato è che il touch è in posizione orizzontale mentre i tasti in posizione verticale , cambiando "#define ROTATION " da 0 a 1 la situazione si inverte ... quindi visualizzo i tasti in orizzontale ed il touch in verticale ... ( non so se mi sono spiegato bene) :sweat_smile:

se non ho capito male, parlo delle librerie, un conto è il posizionamento dei vari oggetti (pulsanti, testo etc) un conto è la mappatura dei pixel per il touch.
se è così dovrebbe essere sufficiente capire come gestire la map() della tua funzione Touch_getXY; quindi prova questo:

#if 1

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#define MINPRESSURE 20
#define MAXPRESSURE 1000
#define ROTATION 0 // se impostato ad 1 girato di 90°


// ALL Touch panels and wiring is DIFFERENT
// copy-paste results from TouchScreen_Calibr_native.ino
const int XP=8,XM=A2,YP=A3,YM=9; //320x480 ID=0x9486
const int TS_LEFT=166,TS_RT=915,TS_TOP=913,TS_BOT=97;


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

Adafruit_GFX_Button on_btn, off_btn;

int pixel_y, pixel_x;     //Touch_getXY() updates global vars
bool Touch_getXY(void)
{
   TSPoint p = ts.getPoint();
   pinMode(YP, OUTPUT);      //restore shared pins
   pinMode(XM, OUTPUT);
   digitalWrite(YP, HIGH);   //because TFT control pins
   digitalWrite(XM, HIGH);
   bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
   if (pressed) {
	   int pixel_y2, pixel_x2;  
	   pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
       pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
	   
	   	if(ROTATION == 0 ){
			// già calcolato
		}
	   
		if(ROTATION == 1 ){
	        pixel_x2 = pixel_y; //coordinate scambiate
            pixel_y2 = map(pixel_x,0,320,320,0);  // coordinate rimappate
			pixel_x = pixel_x2;
			pixel_y = pixel_y2;
		}

   }
   return pressed;
}

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define MAGENTA 0xF81F
#define CYAN    0x07FF
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

void setup(void)
{
   Serial.begin(9600);
   uint16_t ID = tft.readID();
   Serial.print("TFT ID = 0x");
   Serial.println(ID, HEX);
   Serial.println("Calibrate for your Touch Panel");
   if (ID == 0xD3D3) ID = 0x9486; // write-only shield
   tft.begin(ID);
   tft.setRotation(ROTATION );            //PORTRAIT
   tft.fillScreen(CYAN);
   on_btn.initButton(&tft,  80, 200, 100, 40, BLACK,MAGENTA, BLACK, "ON", 2);
   off_btn.initButton(&tft, 200, 200, 100, 40, BLACK, MAGENTA, BLACK, "OFF", 2);
   on_btn.drawButton(false);
   off_btn.drawButton(false);
   tft.fillRect(80, 80, 130, 80, RED);
}

/* two buttons are quite simple
*/
void loop(void)
{
   bool down = Touch_getXY();
   on_btn.press(down && on_btn.contains(pixel_y, pixel_x));
   off_btn.press(down && off_btn.contains(pixel_y, pixel_x));
   if (on_btn.justReleased())
       on_btn.drawButton();
   if (off_btn.justReleased())
       off_btn.drawButton();
   if (on_btn.justPressed()) {
       on_btn.drawButton(true);
       tft.fillRect(40, 80, 160, 80, BLUE);
   }
   if (off_btn.justPressed()) {
       off_btn.drawButton(true);
       tft.fillRect(40, 80, 160, 80, RED);
   }
}
#endif