Touch non funziona ILI 9432 e con ESP32 DEVKIT V1

Sto usando questo semplice sketch:

  /*
   *  31 marzo 2025
   *  ESP32 DOIT DEVKIT V1
   *  Disegna il bottone ma non sente il Touch
   */
  #include "SPI.h"
  #include "Adafruit_GFX.h"
  #include "Adafruit_ILI9341.h"
  #include <XPT2046_Touchscreen.h> 
  
  #define TFT_DC  2     
  #define TFT_CS  15    
  #define TFT_MOSI  13  
  #define TFT_MISO  12  
  #define TFT_CLK 14    
  #define TFT_RST 21     
  #define TOUCH_CS 33  
  #define TOUCH_IRQ 34   
  
  Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
  
  XPT2046_Touchscreen ts(TOUCH_CS, TOUCH_IRQ);
  
  void setup() {
    tft.begin();
    ts.begin();
    tft.setRotation(3);
    tft.fillScreen(ILI9341_BLACK);
    tft.fillRect(50, 160, 100, 50, ILI9341_RED);
    tft.setCursor(60, 175); // colonna, riga
    tft.setTextColor(ILI9341_WHITE);
    tft.setTextSize(2);
    tft.println("Bottone");
  }
  
  void loop() {
    if (ts.touched()) {
      TS_Point p = ts.getPoint();
      if (p.x >= 50 && p.x <= 150 && p.y >= 160 && p.y <= 210) {
        tft.fillRect(50, 160, 100, 50, ILI9341_GREEN);
        tft.setCursor(60, 175); // colonna, riga
        tft.println("Premuto");
      }
    }
  }

Mi disegna il bottone con scritto dentro "Bottone" ma se lo premo non cambia nel colore verde e con scritto premuto.
Ho verificato i collegamenti e sono corretti.
Ho provato a cambiare su altri pin, le due porte "TOUCH", ma il risultato non cambia.
Forse uso delle porte sbagliate per il Touch?

Prova ad inizializzare in modo esplicito la SPI usata dal touch, ovviamente adeguando la definizione dei pin che stai usando.

SPIClass              tsSpi = SPIClass(VSPI);
XPT2046_Touchscreen   ts(XPT2046_CS, XPT2046_IRQ);

void setup() {
  .......
  tsSpi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS); 
  ts.begin(tsSpi);            
  ts.setRotation(2);    // Se dovesse servire
  ........

Ho cercato di capire le modifiche che mi hai suggerito.
Ho fatto le modifiche allo sketch, ma mi da degli errori che non so come rimediare.
Lo sketch modificato è cosi:

  /*
   *  31 marzo 2025
   *  ESP32 DOIT DEVKIT V1
   *  Disegna il bottone ma non sente il Touch
   */
  #include "SPI.h"
  #include "Adafruit_GFX.h"
  #include "Adafruit_ILI9341.h"
  #include <XPT2046_Touchscreen.h> 
  
  #define XPT2046_DC  2     
  #define XPT2046_CS  15    
  #define XPT2046_MOSI  13  
  #define XPT2046_MISO  12  
  #define XPT2046_CLK 14    
  #define XPT2046_RST 21     
  #define XPT2046_CS 33  
  #define XPT2046_IRQ 34 
  
  //Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
  
  SPIClass  tsSpi = SPIClass(VSPI);
  XPT2046_Touchscreen ts(XPT2046_CS, XPT2046_IRQ);
  
  void setup() {
    tsSpi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS); 
    ts.begin(tsSpi); 
    ts.setRotation(3);
    ts.fillScreen(ILI9341_BLACK);
    ts.fillRect(50, 160, 100, 50, ILI9341_RED);
    ts.setCursor(60, 175); // colonna, riga
    ts.setTextColor(ILI9341_WHITE);
    ts.setTextSize(2);
    ts.println("Bottone");
  }
  
  void loop() {
    if (ts.touched()) {
      TS_Point p = ts.getPoint();
      if (p.x >= 50 && p.x <= 150 && p.y >= 160 && p.y <= 210) {
        ts.fillRect(50, 160, 100, 50, ILI9341_GREEN);
        ts.setCursor(60, 175); // colonna, riga
        ts.println("Premuto");
      }
    }
  }

L'errore che mi da è questo:

Arduino:1.8.19 (Mac OS X), Scheda:"DOIT ESP32 DEVKIT V1, 80MHz, 921600, None, Disabled"

/Users/ezio/Desktop/Pulsante/Pulsante.ino: In function 'void setup()':
Pulsante:29:8: error: 'class XPT2046_Touchscreen' has no member named 'fillScreen'
     ts.fillScreen(ILI9341_BLACK);
        ^~~~~~~~~~
Pulsante:30:8: error: 'class XPT2046_Touchscreen' has no member named 'fillRect'
     ts.fillRect(50, 160, 100, 50, ILI9341_RED);
        ^~~~~~~~
Pulsante:31:8: error: 'class XPT2046_Touchscreen' has no member named 'setCursor'
     ts.setCursor(60, 175); // colonna, riga
        ^~~~~~~~~
Pulsante:32:8: error: 'class XPT2046_Touchscreen' has no member named 'setTextColor'
     ts.setTextColor(ILI9341_WHITE);
        ^~~~~~~~~~~~
Pulsante:33:8: error: 'class XPT2046_Touchscreen' has no member named 'setTextSize'
     ts.setTextSize(2);
        ^~~~~~~~~~~
Pulsante:34:8: error: 'class XPT2046_Touchscreen' has no member named 'println'
     ts.println("Bottone");
        ^~~~~~~
/Users/ezio/Desktop/Pulsante/Pulsante.ino: In function 'void loop()':
Pulsante:41:12: error: 'class XPT2046_Touchscreen' has no member named 'fillRect'
         ts.fillRect(50, 160, 100, 50, ILI9341_GREEN);
            ^~~~~~~~
Pulsante:42:12: error: 'class XPT2046_Touchscreen' has no member named 'setCursor'
         ts.setCursor(60, 175); // colonna, riga
            ^~~~~~~~~
Pulsante:43:12: error: 'class XPT2046_Touchscreen' has no member named 'println'
         ts.println("Premuto");
            ^~~~~~~
exit status 1
'class XPT2046_Touchscreen' has no member named 'fillScreen'

Non so cosa fare.

Questo è quello che può succedere quando non si usano nomi variabili che sono chiari ed espliciti e si procede solo con il copia e incolla senza fare attenzione a quello che si scrive nello sketch.

  • tft è l'oggetto di tipo Adafruit_ILI9341 che gestisce il display TFT (e non andava commentato);
  • tsSpi è l'oggetto di tipo SPIClass che si occupa del bus SPI (se non specificato viene usato quello di default con i pin di default);
  • ts è l'oggetto di tipo XPT2046_Touchscreen che si occupa della gestione del touscreen (a cui diciamo in modo esplicito di usare tsSpi cosi come lo abbiamo definito).

Tu hai fatto un mischione nel setup(), compresa l'assegnazione dei pin, quindi è normale che non compili!

#define XPT2046_CLK    xx    // Pin T_CLK del touch
#define XPT2046_MISO   xx    // Pin T_DO del touch
#define XPT2046_MOSI   xx    // Pin T_DIN del touch
#define XPT2046_CS     xx    // Pin T_CS del touch


Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
SPIClass  tsSpi = SPIClass(VSPI);
XPT2046_Touchscreen ts(TOUCH_CS , TOUCH_IRQ);

void setup() {
    tsSpi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS); 
    ts.begin(tsSpi);            
    ts.setRotation(3);
    tft.begin();
    tft.setRotation(3);
    // Tutto il resto come prima

La spiegazione che hai scritto è chiara, ma tieni presente che per me sono cose nuove.
Ho rimesso a posto i #define.
Ho copiato pari pari il tuo esempio e quando lo compilo mi da questo errore:

/Users/ezio/Desktop/Pulsante/Pulsante.ino: In function 'void setup()':
Pulsante:25:17: error: 'XPT2046_CLK' was not declared in this scope
     tsSpi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
                 ^~~~~~~~~~~

Allora ho notato che nei #define sono scritti diversamente, li ho modificati e compila lo schetch.
Ho inoltre eliminato dal ESP32 i collegamenti che non vengono utilizzati ( TFT_RST, TFT_DC).
Caricato in memoria visualizza il display bianco.

Ho ricollegato tutti i pin come da #define e aggiunto nel void (loop) un Serial.print per verificare se sente il Touch ma non entra nell'if.
Adesso disegna il bottone sul display ma non sente il touch.
Più di cosi non so cosa fare.
Questo é lo sketch aggiornato con le ultime modifiche:

  /*
   *  1 aprile 2025
   *  ESP32 DOIT DEVKIT V1
   *  Disegna il bottone ma non sente il Touch
   */
  #include "SPI.h"
  #include "Adafruit_GFX.h"
  #include "Adafruit_ILI9341.h"
  #include <XPT2046_Touchscreen.h> 
  
  #define TFT_DC  2     
  #define TFT_CS  15    
  #define TFT_MOSI  13  
  #define TFT_MISO  12  
  #define TFT_CLK 14    
  #define TFT_RST 21     
  #define XPT2046_CS 33  
  #define XPT2046_IRQ 36 
  
  Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
  SPIClass  tsSpi = SPIClass(VSPI);
  XPT2046_Touchscreen ts(XPT2046_CS , XPT2046_IRQ);
  
  void setup() {
    Serial.begin(115200);
    tsSpi.begin(TFT_CLK, TFT_MISO, TFT_MOSI, TFT_CS); 
    ts.begin(tsSpi); 
    ts.setRotation(3);
    tft.begin();
    tft.setRotation(3);
    tft.fillScreen(ILI9341_BLACK);
    tft.fillRect(50, 160, 100, 50, ILI9341_RED);
    tft.setCursor(60, 175); // colonna, riga
    tft.setTextColor(ILI9341_WHITE);
    tft.setTextSize(2);
    tft.println("Bottone");
  }
  
  void loop() {
    if (ts.touched()) {
      TS_Point p = ts.getPoint();
      if (p.x >= 50 && p.x <= 150 && p.y >= 160 && p.y <= 210) {
        tft.fillRect(50, 160, 100, 50, ILI9341_GREEN);
        tft.setCursor(60, 175); // colonna, riga
        tft.println("Premuto");
        Serial.println(" premuto");
      }
    }
  }

I display TFT con touch sono fatti da due componenti principali accoppiati, m ciascuno con il proprio controller separato: il display vero e proprio che mostra le immagini ed il touch che gestisce l'input del tocco.

Se tsSpi è l'oggetto che si occupa della comunicazione SPI con il controller del touchscreen, per quale motivo lo inizializzi passandogli i piedini del display TFT ???? :face_with_raised_eyebrow:

Nel pezzo di codice che ti ho passato io ho inizializzato il bus SPI in questo modo
tsSpi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
perché non ho idea di quali piedini dell'ESP32 tu hai usato per collegare il touch ed infatti ho messo xx nel #define e nel commento ci ho scritto a quale pin del touch deve corrispondere.

Questo implica che li devi definire tu stesso in funzione dei collegamenti che hai fatto.

Penso di aver capito e ho modificato lo sketch cosi:

  /*
   *  3 aprile 2025
   *  ESP32 DOIT DEVKIT V1
   *  Disegna il bottone ma non sente il Touch
   */
  #include "SPI.h"
  #include "Adafruit_GFX.h"
  #include "Adafruit_ILI9341.h"
  #include <XPT2046_Touchscreen.h> 
  
  #define TFT_DC  2     
  #define TFT_CS  15    
  #define TFT_MOSI  13  
  #define TFT_MISO  12  
  #define TFT_CLK 14    
  #define TFT_RST 4     
  #define XPT2046_CS 33  
  #define XPT2046_IRQ 36
   //#define XPT2046_DO 39
  //#define XPT2046_DIN 32
  //#define XPT2046_CLK 25

  Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
  SPIClass  tsSpi = SPIClass(VSPI);
  XPT2046_Touchscreen ts(XPT2046_CS, XPT2046_IRQ);
  
  void setup() {
    Serial.begin(115200);
    tsSpi.begin(XPT2046_CS, XPT2046_IRQ); 
    ts.begin(tsSpi); 
    ts.setRotation(3);
    tft.begin();
    tft.setRotation(3);
    tft.fillScreen(ILI9341_BLACK);
    tft.fillRect(50, 160, 100, 50, ILI9341_RED);
    tft.setCursor(60, 175); // colonna, riga
    tft.setTextColor(ILI9341_WHITE);
    tft.setTextSize(2);
    tft.println("Bottone");
  }
  
  void loop() {
    if (ts.touched()) {
      TS_Point p = ts.getPoint();
      if (p.x >= 50 && p.x <= 150 && p.y >= 160 && p.y <= 210) {
        tft.fillRect(50, 160, 100, 50, ILI9341_GREEN);
        tft.setCursor(60, 175); // colonna, riga
        tft.println("Premuto");
      }
    }
  }

ma mi disegna solo il bottone e non mi sente il tocco.
Se inserisco anche gli altri tre piedini del Touch che ho aggiunto nei #define, mi da errore nella compilazione.
Allora ho messo solo il XPT2046_CS e XPT2046_IRQ.

No, non credo... io ti consiglio e scrivo una cosa e tu fai tutt'altro.
Non so più con quale parole esprimermi per renderlo più chiaro:

Ti posso assicurare, avendolo appena provato, che inizializzando la SPI con tutti i pin compila senza il minimo problema.

I pin nel mio esempio io li ho definiti in questo modo:

  #define XPT2046_CLK    xx    // Pin T_CLK del touch
  #define XPT2046_MISO   xx    // Pin T_DO del touch
  #define XPT2046_MOSI   xx    // Pin T_DIN del touch
  #define XPT2046_CS     xx    // Pin T_CS del touch

I pin nel tuo sketch sono invece definiti in questo modo:

  #define XPT2046_CS 33  
  #define XPT2046_IRQ 36
  #define XPT2046_DO 39
  #define XPT2046_DIN 32
  #define XPT2046_CLK 25

Se ti limiti a fare copia incolla dell'istruzione cosi come l'ho scritta senza andare nemmeno a guardare cosa c'è scritto, è normale che non compili.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.