Conflitto tra grafica e touchscreen su display 4" 480x320

Mi trovo nell'ultima fase del percorso di realizzazione di un termostato con parte mobile trasmettitore alimentato a batteria e dotato di power gating , e parte fissa ricevitore dotato di display a 4" con 480x320 pix un driver ST7796S ed il gestore touch XPT2046. Mi trovo di fronte al problema, sperando che sia l'ultimo, di realizzare due o tre pulsanti touch per impostare la temperatura di regolazione, l'isteresi del sistema di riscaldamento ed una correzione della temperatura trasmessa dal sensore BME280. Ho scelto una via apparentemente semplice ma che conduce però ad un conflitto tra la funzione grafica e quella touchscreen, che non so come risolvere.
Lo sketch che ho scritto è di prova. Esso è basato sulle librerie SPI.h, Adafruit_GFX.h, Adafruit_ST7796S_kbv.h e XPT2046_Touchscreen.h, e contiene alcune semplici istruzioni grafiche ed altre, ugualmente semplici, per verificare la risposta al tocco da parte dello schermo.
Ebbene lo sketch che ho riportato, così com'è non funziona, né come grafica né come touch. Ma esso funziona come grafica se commento la linea "//ts.begin();", e funziona come touch se decommento questa linea e commento la linea "//tft.begin();". Una possibile interpretazione è che grafica e touch non vadano bene insieme, ma io non arrivo oggi a quel livello.
I collegamenti tra i pin del display ed i pin digitali dell'ESP32 sono riportati nella tabella:

Funzione TFT Funzione Touch
Segnale PIN Segnale PIN
TFT_CLK 18 T_CLK 18
TFT_MISO 19 T_DO 19
TFT_MOSI 23 T_DIN 23
T_CS 21
T_IRQ 26
TFT_DC 4
TFT_CS 15
TFT_RST 2

Dalla tabella si desume che le funzioni grafica e touch usano lo stesso bus (
Lo sketch di prova è il seguente

 #include "SPI.h"
#include <XPT2046_Touchscreen.h> /* https://github.com/PaulStoffregen/XPT2046_Touchscreen */
#include "Adafruit_GFX.h" 
#include "Adafruit_ST7796S_kbv.h"
#define TFT_DC 4
#define TFT_CS 15
#define TFT_RST 2
#define TFT_MISO 19         
#define TFT_MOSI 23           
#define TFT_CLK 18
#define TOUCH_CS_PIN       21
#define TOUCH_IRQ_PIN      26
Adafruit_ST7796S_kbv tft = Adafruit_ST7796S_kbv(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
XPT2046_Touchscreen ts( TOUCH_CS_PIN, TOUCH_IRQ_PIN);
void setup() {
  Serial.begin( 115200 );
 ts.begin();
  ts.setRotation(1);
  tft.begin();
 tft.setRotation(1);
  Serial.println( "Touch screen ready." );




tft.fillScreen(ST7796S_BLACK);
  tft.drawRoundRect(0, 0, 480 , 320, 4, ST7796S_WHITE);
    tft.drawRoundRect(5, 5, 470 , 100, 4, ST7796S_RED);
    tft.drawRoundRect(5,108, 470 , 53, 4, ST7796S_GREEN);
    tft.drawRoundRect(5, 165, 122, 71, 4, ST7796S_YELLOW);
    tft.drawRoundRect(131, 165,184 ,71,4, ST7796S_CYAN);
}


TS_Point rawLocation;


void loop() {
    while ( ts.touched() )
    {
      rawLocation = ts.getPoint();
        Serial.print("x = ");
        Serial.print(rawLocation.x);
        Serial.print(", y = ");
        Serial.print(rawLocation.y);
        Serial.print(", z = ");
        Serial.println(rawLocation.z);   
    }
    
}

Non sono riuscito a caricare lo sketch come file .ino, ma non ci sono riuscito
Se qualcuno volesse darmi una mano sarei molto grato.

>nodar10: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice (... fosse anche UNA sola riga) all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo anche che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

... leggi con ATTENZIONE quanto ho scritto ... devi MODIFICARE non creare un nuovo post. Grazie.

Guglielmo

Posti una tabella con delle costanti ad esempio T_CLK e poi nel codice non c'e'
Perchè ?

Hai un link a quel display ? Per capire che è, shield, modulo, quanti e quali piedini ha etc.

Ciao nid69ita
Ti ringrazio per il tuo post.
Il display da 4 “ l’ho preso su Banggood al link:

https://it.aliexpress.com/item/4001122632293.html?spm=a2g0s.9042311.0.0.43634c4dxl9z6F
Io non ho fatto altro che collegare i pin del display ai pin dell’ESP32 così come è indicato nella mia tabella.
Al link riportato puoi vedere che sulle immagini del retro del display sono stampati i nomi dei segnali afferenti ai singoli pin, 7 per la funzione video e 5 per la funzione touch. Nel mio codice i segnali video sono preceduti dal prefisso “TFT”, così come nella mia tabella, mentre quelli touch sono già presenti sul modulo con il prefisso “T”. Altro non saprei dirti, se non enfatizzare lo strano fatto che le funzioni video e touch, attivate rispettivamente da “tft.begin() e ts.begin()”, funzionano bene separatamente, ma che insieme si annullano a vicenda.
Io, non essendo un drago della programmazione, non riesco ad intuire nel dettaglio quali azioni generano nello sketch i due comandi “tft.begin() e ts.begin()”. Ho anche pensato che i segnali CS che sono presenti per ambedue le funzioni potessero abilitare contemporaneamente l’uso del bus MISO/MOSI e quindi provocare un conflitto nel bus. Ho allora provato a dichiarare i pin 21 e 26 come “output” ed uno alla volta li ho settati “HIGH” con digitalWrite. Il risultato è che nulla cambia.
Quindi sono proprio disorientato.

Alla pagina della libreria touch, negli esempi vedo sempre prima il begin della libreria grafica e poi il begin della touch

prova ad invertire la sequenza

Ciao
Ho eseguito la prova indicata da te. Ancora non funziona, ma c’è una differenza di comportamento:
con la sequenza ts-begin e poi tft-begin lo schermo è totalmente bianco ed il monitor seriale mostra una serie interminabile di righe x=0,y=0,z=4095. Con la sequenza inversa il monitor seriale non cambia, ma sullo schermo appare una puntinatura come nei vecchi televisori con antenna non funzionante e con i pixel di vari colori.

Eventualmente prova a non usare il pin IRQ,
XPT2046_Touchscreen ts( TOUCH_CS_PIN);
Sono solo tentativi quelli che ti propongo, non saprei effettivamente dirti il motivo del perchè non va.
Una prova ulteriore che potresti fare è usare una Arduino Uno o Mega, sul sito della lib c'e' scritto che dovrebbe funzionare su ESP32, ma se vedi il file .h della lib ad un certo punto leggi:
...
elif defined(ESP32)
// TODO: should this also be ICACHE_RAM_ATTR ??
...
Qualche dubbio che sia stata provata bene su ESP32 mi viene.

Ho provato a scollegare il segnale IRQ ma non cambia nulla-
Nel mio shield personale ho provato anche a sostituire il display da 4" con un ILI9341 da 2.8", cosa possibile poichè hanno lo stesso identico pinout, ed ho adattato lo sketch a quest'ultimo display. Il comportamento è lo stesso, funzionano separatamente grafica e touch, ma non insieme. Quindi si può escludere che il problema risieda nel diaplay a 4" con driver ST7796S.
E' possibile secondo te che i pin dell'Esp32 che ho usato nel mio sketch, ma che recepii a suo tempo da uno sketch in rete, non siano opportuni per l'uso in questione?
Fare una prova con Arduino mi comporta una sostanziale modifica del mio shield. Ci penso su. Andrebbe bene anche un Arduino nano?

Si, Nano o Uno sono sempre stessa MCU. Era per capire se il problema possa essere la Esp32 che ha una MCU diversa.

P.S. per IRQ da non usare, non solo scollegare il pin, ma cambiare la chiamata al ts.

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