Adafruit 2.8" LCD Display mit Touch

Hallo

ich hab das oben genannte Display. Nach anfänglichen Schwierigkeiten hab ich mittlerweile sowohl die Touch Abfrage wie auch eine Anzeige auf dem Display hinbekommen. Nur bei einem Problem steck ich fest, ich will auf eine Touchreaktion eine Anzeige auf das Display zaubern und das klappt einfach nicht, hier erst mal der Code:

// IMPORTANT: Adafruit_TFTLCD LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
// SEE RELEVANT COMMENTS IN Adafruit_TFTLCD.h FOR SETUP.

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

#include <stdint.h>
#include "TouchScreen.h"

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// These are the pins for the shield!
#define YP A1  // must be an analog pin, use "An" notation!
#define XM A2  // must be an analog pin, use "An" notation!
#define YM 7   // can be a digital pin
#define XP 6   // can be a digital pin

#define MINPRESSURE 1
#define MAXPRESSURE 1000

// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD:
// For the Arduino Uno, Duemilanove, Diecimila, etc.:
//   D0 connects to digital pin 8  (Notice these are
//   D1 connects to digital pin 9   NOT in order!)
//   D2 connects to digital pin 2
//   D3 connects to digital pin 3
//   D4 connects to digital pin 4
//   D5 connects to digital pin 5
//   D6 connects to digital pin 6
//   D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).

// Assign human-readable names to some common 16-bit color values:
#define	BLACK   0x0000
#define	BLUE    0x001F
#define	RED     0xF800
#define	GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// If using the shield, all control and data lines are fixed, and
// a simpler declaration can optionally be used:
// Adafruit_TFTLCD tft;

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
int touchdetect;
int touchx;
int touchy;

void setup(void) {
  Serial.begin(9600);
  Serial.println(F("Christian LCD"));

  tft.reset();

  uint16_t identifier = 0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.setCursor(0, 0);
  tft.setTextSize(3);
  tft.println("System ready");
}

void loop(void) {  
  if(touchdetect == 1) // weglassen
  { // weglassen
    uint16_t identifier = 0x9341;
    tft.begin(identifier);
    tft.fillScreen(BLACK);
    tft.setRotation(2);
    tft.setCursor(0, 0);
    tft.setTextSize(3);
    tft.println("Touch detect");
    touchdetect = 0;
    delay(1000);
  } // weglassen
  TSPoint p = ts.getPoint();
  // we have some minimum pressure we consider 'valid'
  // pressure of 0 means no pressing!
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
     Serial.print("X = "); Serial.print(p.x);
     Serial.print("\tY = "); Serial.print(p.y);
     Serial.print("\tPressure = "); Serial.println(p.z);
     touchdetect = 1;
     touchx = p.x;
     touchy = p.y;
//mehr Infos in Beschreibung
  }

}

Wenn ich die 3 Zeilen mit “// weglassen” am Ende weglasse oder auskommentiere dann zeigt er mit auch “Touch detect” auf dem Display an (logischerweise dann natürlich sofort und nicht erst wenn ich den Bildschirm berühre). Nur wenn ich das auf eine Touchreaktion (so wie es oben im Code ist) anzeigen lassen will wird der Bildschirm einfach leer und der Text erscheint nicht. Hab auch schon bei “//mehr Infos in Beschreibung” mit delays gearbeitet weil ich vermutet hab, das sich der Touch mit der Ausgabe überschneidet aber auch dies hat leider nicht geklappt.
Im Seriellen Monitor sehe ich die Ausgabe die mit ausgegeben wird, wenn ich den Touch berühre

Jemand einen schlauen Tipp für mich?

edit: durch probieren bin ich wohl hinter das Problem gekommen, sobald eine Toucheingabe registriert wurde klappt schreiben auf das Display (zumindest Text, ein reset z.b. funktioniert) nicht mehr, die Frage ist nur warum und wie behebe ich das? Auch Neuinitialisieren des Displays hilft nicht, man muss es neu starten

mfg

Chris

hi

hab es jetzt hinbekommen, ich initialisiere einfach das Display komplett neu, nicht schön aber funktioniert erst mal. Wenn jemand eine bessere Lösung zur Hand hat, gerne ansagen :slight_smile:

Hier der angepasste Touch detect Abschnitt:

  if(touchdetect == 1 && p.z < MINPRESSURE)
  {
    Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
    tft.reset();
    uint16_t identifier = 0x9341;
    tft.begin(identifier);
    tft.fillScreen(BLACK);
    tft.setRotation(2);
    tft.setCursor(0, 0);
    tft.setTextSize(3);
    tft.setTextColor(YELLOW);
    Serial.println("write on display"); 
    tft.println("Touch detect");
    
    tft.print("X=");
    tft.println(touchx);
    
    tft.print("Y=");
    tft.println(touchy);
    
    
    delay(1000);
    tft.fillScreen(BLACK);
    tft.setCursor(0, 0);
    tft.println("System ready");
    touchdetect = 0;
  }

Achja und wenn noch jemand weiß, warum die Farben bei mir invertiert sind, nehm ich die Lösung dazu auch gerne an, Yellow ist z.b. blau.

Hi kannst du mal bitte den Kompletten Code hochladen