Schnelleinstieg Touchscreen am Arduino mit TFT_320QFT

Aktuell sind preiswerte TFT-Tochscreens unter der Bezeichnung TFT_320QVT verfügbar.
Diese passen gut zu einem Arduino-Mega, benötigen aber ein zusätliches Shield zur Pegelanpassung.
Ich verwende ein "TFT LCD Mega Shield V2.2" ohne Firmenbezeichnung, dieses enthält Pegelwandler und einen
Spannungsregler zur Bereitstellung der 3,3 Volt Betriebsspannung für das Touchscreen-Board.
Einen Schaltplan für das "TFT LCD Mega Shield V2.2" habe ich nicht gefunden, es scheint bis auf
den Spannungsregler dem Shield "TFT LCD Mega Shield V2.0" der Firma "elecfreaks" zu entsprechen.

Das verwendete TFT-Board der Firma "sainSmart" kann mit der UTFT-Bibliothek von Henning Carlsen angesprochen werden.
Leider unterstützt die aktuelle Library nicht den auf dem Board verwendeten Touchscreen-Controller XPT2046.
Die Firma "sainSmart" empfiehlt die Verwendung einer veralteten Version der Library.

Da für mich die Verwendung einer veralteten Bibliothek nicht in Frage kommt, habe ich ein Skript zum Test der Touch-Funktion erstellt.
Dieses Skript ist nicht optimiert, sondern verwendet Standard-Funktionen der Arduino-Bibliothek.
Im Skript werden die von der USB-Schnittstelle gelesenen Daten auf dem TFT ausgegeben.
Eine einzelne vom Touchscreen gelesene Koordinate (x,y,z1,z2) wird fortlaufend als Zahlenwert auf die USB-Schnittstelle ausgegeben.
In der Funktion read_Touch() kann eingestellt werden, welcher Wert vom Touchscreen gelesen werden soll.
Zur Darstellung der Koordinate bzw. Eingabe der Daten kann der serielle Monitor der Arduino-IDE verwendet werden.
Zur Optimierung können mehrere aufeinanderfolgende Lesevorgänge verschachtelt werden. Details findet man im Datenblatt des XPT2046
Eine Anpassung der Funktion read_Touch() an eigene Zwecke ist nun kein Problem mehr.

				
#include <UTFT.h>
// #include <URTouch.h>

int bg[] = { 0, 0, 255 };
int fg[] = { 255, 255, 255 };

// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];

UTFT myGLCD(SSD1289,38,39,40,41);   // Remember to change the model parameter to suit your display module!
// URTouch myTouch(6,5,4,3,2);

byte initres;
byte res;
byte input;

void setup()
{ 
  Serial.begin(115200);
  Serial.println("Init LCD...");

  myGLCD.InitLCD(LANDSCAPE);
  myGLCD.clrScr();
  myGLCD.setColor(0, 255, 0);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.setFont(SmallFont);
  myGLCD.print("LCD init done.", CENTER, 0);
  
  myGLCD.print((char*)"Open the Serial Monitor", CENTER, 128); 
  myGLCD.print((char*)"and see touchscreen data!", CENTER, 144);
  myGLCD.setFont(BigFont);
  myGLCD.setBackColor(bg[0], bg[1], bg[2]);
}

#define TP_CLK 6
#define TP_CS 5
#define TP_DIN 4 
#define TP_BUSY 7
#define TP_DOUT 3
#define TP_IRQ 2

void clk() {
  digitalWrite(TP_CLK,HIGH);
  digitalWrite(TP_CLK,LOW);  
}
void read_Touch() {
  byte a2(0), a1(0), a0(1);  // single: 0,0,1 -> x  / 1,0,1 -> y / 0,1,1 -> z1 / 1,0,0 -> z2 
  pinMode(TP_CS,OUTPUT);
  pinMode(TP_CLK,OUTPUT);
  pinMode(TP_DOUT,INPUT_PULLUP);
  pinMode(TP_DIN,OUTPUT);
  pinMode(TP_BUSY,INPUT_PULLUP);
  pinMode(TP_IRQ,INPUT_PULLUP);

  digitalWrite(TP_CLK,LOW);
  digitalWrite(TP_CS,LOW);
  digitalWrite(TP_DIN,HIGH); // START
  clk();
  digitalWrite(TP_DIN,a2); // A2
  clk();
  digitalWrite(TP_DIN,a1); // A1
  clk();
  digitalWrite(TP_DIN,a0); // A0
  clk();
  digitalWrite(TP_DIN,HIGH); // MODE HIGH : Low Res
  clk();
  digitalWrite(TP_DIN,HIGH); // HIGH : Single Ended / LOW : Differential reference
  clk();
  digitalWrite(TP_DIN,LOW); // HIGH : Reference on / LOW : off
  clk();
  digitalWrite(TP_DIN,LOW); // HIGH : ADC on / LOW : off
  clk();
  clk();
  while(digitalRead(TP_BUSY)==HIGH);
  int val = 0;
  for(byte ct=0; ct<8; ++ct) {
    val *= 2;
    if (digitalRead(TP_DOUT)==HIGH) val += 1;
    clk();
  }
  digitalWrite(TP_CS,HIGH);
  Serial.println(val);
}

char buf[32];
int pos = 0;

void loop()
{
  if(Serial.available()){
    int ib = Serial.read();
    if (ib != '\n') {
      if (ib == '\r')
        pos = 0;
      else if (pos<32-1) {
        buf[pos++] = ib;
        buf[pos] = 0;
      }
    }
    myGLCD.print("                  ",CENTER,160);
    myGLCD.print(buf, CENTER,160);
  }
  read_Touch();
}