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.