Anfängerfrage Touch Display

Hallo zusammen,

ich möchte aktuell diverse Funktionen mit dem 2.8'' TFT LCD Shield an meinen Uno ausprobieren, jedoch scheitert es gerade bereits an einer eigentlich einfachen Eingabe :roll_eyes: Das LCD soll bloß bei einer Berührung des Displays die Farbe wechseln. Kann mir jemand sagen wo der Fehler im Code verborgen ist? Nach der ersten Berührung wechselt die Farbe, danach jedoch nicht mehr.

#include <Adafruit_TFTLCD.h>
#include <Adafruit_GFX.h>
#include <stdint.h>
#include <TouchScreen.h>

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0

#define LCD_RESET A4

#define YP A1
#define XM A2
#define YM 6
#define XP 5 

#define BLACK   0x0000
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
int z;

/////////////////////////////////////////////////////////////////////////////////////////////////////////

void setup(void) {
  Serial.begin(9600);

  tft.reset();
  uint16_t identifier = tft.readID();
  tft.begin(identifier);

  tft.fillScreen(BLACK);
  z = 1;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////

void loop() {
  TSPoint p = ts.getPoint();

    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
  
  if (p.z > ts.pressureThreshhold) {
     Serial.print("X = "); Serial.print(p.x);
     Serial.print("\tY = "); Serial.print(p.y);
     Serial.print("\tPressure = "); Serial.println(p.z);

     if (z == 1 || z == 0){
      if (z == 1) {
      tft.fillScreen(WHITE);
      z = 0;
     }
 
     else {
      tft.fillScreen(BLACK);
      z = 1;

      tft.setTextSize(3);
      tft.setTextColor(YELLOW);
      tft.setCursor(20, 20);
      tft.println("Funktioniert");
     }
  }   
}
}

Abgesehen von einem Prellen funktioniert Dein Programm bei mir.

Laß Dir mittels der seriellen Schnittstelle mal mehr Daten ausgeben, ob Du daran etwas erkennen kannst.

Über den seriellen Monitor bekomme ich die Werte für X, Y und Pressure nach der ersten Berührung angezeigt, danach passiert gar nichts mehr. Als wenn das Programm 'durchgelaufen' wäre.

Hab mal eine Endlosschleife mit while(1) {...} darum gelegt, hilft aber auch nichts. Es scheint in der If-Schleife irgendwie fest zu hängen

jorkan:
Über den seriellen Monitor bekomme ich die Werte für X, Y und Pressure nach der ersten Berührung angezeigt, danach passiert gar nichts mehr. Als wenn das Programm 'durchgelaufen' wäre.

Hab mal eine Endlosschleife mit while(1) {...} darum gelegt, hilft aber auch nichts. Es scheint in der If-Schleife irgendwie fest zu hängen

Das solltest du doch per serieller Ausgabe herausfinden, wo es hakt.

Im übrigen gibt es keine if-Schleife, nur eine if-Abfrage.

Das hab ich ja probiert indem ich mir an verschiedensten Stellen etwas habe ausgeben lassen über den Monitor. Fazit: Nach dem ersten Farbwechsel passiert nichts mehr..

Dann zeige doch mal den aktuellen Sketch mit den seriellen Ausgaben und zeige uns wo er die letzte Ausgabe macht.

Und bitte verwende dazu die Code-Tags.

void loop() {
    Serial.print("start");
    Serial.print("\tz = "); Serial.print(z);
    
    TSPoint p = ts.getPoint();

     Serial.print("\tX = "); Serial.print(p.x);
     Serial.print("\tY = "); Serial.print(p.y);
     Serial.print("\tPressure = "); Serial.println(p.z);
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
  
  if (p.z > 1) {
     Serial.print("X = "); Serial.print(p.x);
     Serial.print("\tY = "); Serial.print(p.y);
     Serial.print("\tPressure = "); Serial.println(p.z);

     if (z == 1 || z == 0){
      if (z == 1) {
      tft.fillScreen(WHITE);
      z = 0;
      Serial.print("Erste Farbe");
     }
     else {
      Serial.print("Zeite Farbe");
      tft.fillScreen(BLACK);
      z = 1;
     }
  }
}
}

Habe es so getestet. Als ersten Wert für z bekomme ich 1, nach der ersten Berührung einen abweichenden Y und Pressure Wert, die Ausgabe "Erste Farbe" und z verändert sich zu 0.

Soweit so gut, nun schwanken jedoch sowohl der Y ( zwischen 1 und 2) als auch Pressure (zwischen 0 und -1) Wert, welche vorher bei genau Y=1023 und Pressure=0 lagen. Auch "start" wird ausgegeben.

Meine einzig sinnvolle Erklärung ist, dass das LCD keine Eingabe mehr annimmt. Denn nach einer weiteren Berührung gibt der Monitor weder einen abweichenden Wert an, noch geht er wieder in die If-Abfrage.

Wozu setzt du die Variable z in der if-Abfrage auf 0 bzw. auf 1 ?

Da liest du doch die Touch-Information aus, oder ?

Und so wie es aussieht, landet er nie in dem else-Zweig, da in der ersten if-Abfrage auch nach einer 0 (oder) abgefragt wird.

Die Variable stellt sozusagen die Farbe dar, 1 bedeutet schwarz und 0 dementsprechend weiß. Ist der Bildschirm weiß (z=0) dann soll die Farbe zu schwarz (z=1) gewechselt werden und umgekehrt. Einfach als Hilfsvariable für die Abfrage.

Sorry....hatte noch eine Ergänzung geschrieben.

Ich würde es mal so probieren:

if (z == 1){
      tft.fillScreen(WHITE);
      z = 0;
      Serial.print("Erste Farbe");
     }
if (z == 0){
      Serial.print("Zeite Farbe");
      tft.fillScreen(BLACK);
      z = 1;
     }

Dann knallt er von weis sofort auf schwarz.

Gruß Tommy

Tommy56:
Dann knallt er von weis sofort auf schwarz.

Gruß Tommy

Stimmt, ist doch wenigstens eine andere Farbe die er aktuell nicht hat.
War gestern wohl doch schon zu spät.

Also statt if ein else oder ein delay einbauen.

Update: Durch den Wechsel der Pinzuweisung auf

#define YP A1
#define XM A2
#define YM 9
#define XP 8

funktioniert es - bis auf eine Einschränkung: der X-Wert wird nicht eingelesen. Bekomme immer für X den Wert 1020-1023. Hat jemand eine Idee woran es liegen könnte?

Vor ein paar Jahren habe ich mal ein Touch Display beim fC für 3 € erworben, welches ich nicht unbedingt als Referenz anbieten möchte. Normalerweise verwende ich es auch mit einem Mega2560, weil beim UNO schnell der Speicher voll wird. Außerdem habe ich angepaßte Adafruit_TFTLCD und Adafruit_GFX von 2015. Wenn sich aber sonst niemand meldet ::slight_smile:

Ich habe das Shield nun mal auf meinen UNO gesteckt und den arduin-o-phone-sketch probiert. Die Tasten werden angezeigt und die richtige Taste erkannt:

// Arduin-o-Phone Sketch: https://learn.adafruit.com/arduin-o-phone-arduino-powered-diy-cellphone/arduin-o-phone-sketch
// Shield direkt auf UNO gesteckt
/*
  TFT  - Mega   - UNO
  LCD_D2 - 24   -  2
  LCD_D3 - 25   -  3
  LCD_D4 - 26   -  4
  LCD_D5 - 27   -  5
  LCD_D6 - 28   -  6
  LCD_D7 - 29   -  7

  LCD_D0 - 22   -  8
  LCD_D1 - 23   -  9
  SD_SS  - 53   - 10
  SD_DI  - 51   - 11
  SD_DO  - 50   - 12
  SD_SCK - 52   - 13

  LCD_RST- RESET- A4
  LCD_CS - 31   - A3
  LCD_RS - A15  - A2
  LCD_WR - A14  - A1
  LCD_RD - 30   - A0

  GND, 5V, 3V3 mit dem jeweiligen Pin vom UNO
*/
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <TouchScreen.h>
#include <SD.h>
#include <SPI.h>

#define SD_CS 10     // Set the chip select line to whatever you use (10 doesnt conflict with the library) 

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

#define TS_MINX 130
#define TS_MINY  90
#define TS_MAXX 900
#define TS_MAXY 910

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

#define LCD_CS A3  // Chip Select
#define LCD_CD A2  // Command/Data
#define LCD_WR A1  // LCD Write
#define LCD_RD A0  // LCD Read
#define LCD_RESET A4

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Color definitions
#define ILI9341_BLACK       0x0000      /*   0,   0,   0 */
#define ILI9341_NAVY        0x000F      /*   0,   0, 128 */
#define ILI9341_DARKGREEN   0x03E0      /*   0, 128,   0 */
#define ILI9341_DARKCYAN    0x03EF      /*   0, 128, 128 */
#define ILI9341_MAROON      0x7800      /* 128,   0,   0 */
#define ILI9341_PURPLE      0x780F      /* 128,   0, 128 */
#define ILI9341_OLIVE       0x7BE0      /* 128, 128,   0 */
#define ILI9341_LIGHTGREY   0xC618      /* 192, 192, 192 */
#define ILI9341_DARKGREY    0x7BEF      /* 128, 128, 128 */
#define ILI9341_BLUE        0x001F      /*   0,   0, 255 */
#define ILI9341_GREEN       0x07E0      /*   0, 255,   0 */
#define ILI9341_CYAN        0x07FF      /*   0, 255, 255 */
#define ILI9341_RED         0xF800      /* 255,   0,   0 */
#define ILI9341_MAGENTA     0xF81F      /* 255,   0, 255 */
#define ILI9341_YELLOW      0xFFE0      /* 255, 255,   0 */
#define ILI9341_WHITE       0xFFFF      /* 255, 255, 255 */
#define ILI9341_ORANGE      0xFD20      /* 255, 165,   0 */
#define ILI9341_GREENYELLOW 0xAFE5      /* 173, 255,  47 */
#define ILI9341_PINK        0xF81F
/******************* UI details */
#define BUTTON_X 40
#define BUTTON_Y 100
#define BUTTON_W 60
#define BUTTON_H 30
#define BUTTON_SPACING_X 20
#define BUTTON_SPACING_Y 20
#define BUTTON_TEXTSIZE 2

// text box where numbers go
#define TEXT_X 10
#define TEXT_Y 10
#define TEXT_W 220
#define TEXT_H 50
#define TEXT_TSIZE 3
#define TEXT_TCOLOR ILI9341_MAGENTA
// the data (phone #) we store in the textfield
#define TEXT_LEN 12
char textfield[TEXT_LEN + 1] = "";
uint8_t textfield_i = 0;

// We have a status line for like, is FONA working
#define STATUS_X 10
#define STATUS_Y 65



Adafruit_GFX_Button buttons[15];
/* create 15 buttons, in classic candybar phone style */
char buttonlabels[15][5] = {"Send", "Clr", "End", "1", "2", "3", "4", "5", "6", "7", "8", "9", "*", "0", "#" };
uint16_t buttoncolors[15] = {ILI9341_DARKGREEN, ILI9341_DARKGREY, ILI9341_RED,
                             ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
                             ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
                             ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
                             ILI9341_ORANGE, ILI9341_BLUE, ILI9341_ORANGE
                            };

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

  tft.reset();

  Serial.println(F("Using 0x9341 LCD driver"));
  tft.begin(0x9341);
  //tft.invert();  // funktioniert nur mit der Bibliotheksanpassung
  tft.setRotation(2);
  tft.fillScreen(ILI9341_BLACK);
  // create buttons
  for (uint8_t row = 0; row < 5; row++) {
    for (uint8_t col = 0; col < 3; col++) {
      buttons[col + row * 3].initButton(&tft, BUTTON_X + col * (BUTTON_W + BUTTON_SPACING_X),
                                        BUTTON_Y + row * (BUTTON_H + BUTTON_SPACING_Y), // x, y, w, h, outline, fill, text
                                        BUTTON_W, BUTTON_H, ILI9341_WHITE, buttoncolors[col + row * 3], ILI9341_WHITE,
                                        buttonlabels[col + row * 3], BUTTON_TEXTSIZE);
      buttons[col + row * 3].drawButton();
    }
  }

  // create 'text field'
  tft.drawRect(TEXT_X, TEXT_Y, TEXT_W, TEXT_H, ILI9341_WHITE);
}

// Print something in the mini status bar with either flashstring
void status(const __FlashStringHelper *msg) {
  tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
  tft.setCursor(STATUS_X, STATUS_Y);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(1);
  tft.print(msg);
}
// or charstring
void status(char *msg) {
  tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
  tft.setCursor(STATUS_X, STATUS_Y);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(1);
  tft.print(msg);
}

#define MINPRESSURE 10
#define MAXPRESSURE 1000

void loop(void) {
  digitalWrite(13, HIGH);
  TSPoint p = ts.getPoint();
  digitalWrite(13, LOW);

  // if sharing pins, you'll need to fix the directions of the touchscreen pins
  //pinMode(XP, OUTPUT);
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  //pinMode(YM, OUTPUT);

  if (p.z != 0) {
    p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
    p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
    Serial.print("("); Serial.print(p.x); Serial.print(", ");
    Serial.print(p.y); Serial.print(", ");
    Serial.print(p.z); Serial.println(") ");
  }
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    // scale from 0->1023 to tft.width
    p.x = (tft.width() - map(p.x, TS_MINX, TS_MAXX, tft.width(), 0));
    p.y = (tft.height() - map(p.y, TS_MINY, TS_MAXY, tft.height(), 0));
  }

  // go thru all the buttons, checking if they were pressed
  for (uint8_t b = 0; b < 15; b++) {
    if (buttons[b].contains(p.x, p.y)) {
      //Serial.print("Pressing: "); Serial.println(b);
      buttons[b].press(true);  // tell the button it is pressed
    } else {
      buttons[b].press(false);  // tell the button it is NOT pressed
    }
  }

  // now we can ask the buttons if their state has changed
  for (uint8_t b = 0; b < 15; b++) {
    if (buttons[b].justReleased()) {
      // Serial.print("Released: "); Serial.println(b);
      buttons[b].drawButton();  // draw normal
    }

    if (buttons[b].justPressed()) {
      buttons[b].drawButton(true);  // draw invert!

      // if a numberpad button, append the relevant # to the textfield
      if (b >= 3) {
        if (textfield_i < TEXT_LEN) {
          textfield[textfield_i] = buttonlabels[b][0];
          textfield_i++;
          textfield[textfield_i] = 0; // zero terminate

          // fona.playDTMF(buttonlabels[b][0]);
        }
      }

      // clr button! delete char
      if (b == 1) {

        textfield[textfield_i] = 0;
        if (textfield_i > 0) {
          textfield_i--;
          textfield[textfield_i] = ' ';
        }
      }

      // update the current text field
      Serial.println(textfield);
      tft.setCursor(TEXT_X + 2, TEXT_Y + 10);
      tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
      tft.setTextSize(TEXT_TSIZE);
      tft.print(textfield);

      // its always OK to just hang up
      if (b == 2) {
        status(F("Hanging up"));
        //fona.hangUp();
      }
      // we dont really check that the text field makes sense
      // just try to call
      if (b == 0) {
        status(F("Calling"));
        Serial.print("Calling "); Serial.print(textfield);

        //fona.callPhone(textfield);
      }

      delay(100); // UI debouncing
    }
  }
}

Was tut das Programm bei Dir?

Läuft durch die veränderte Library leider nicht, habe auch nochmal ältere/andere Libraries probiert aber nichts hat funktioniert. Trotzdem danke für die Mühe!

Wird dann wohl als reine Anzeige dienen :smiley:

jorkan:
Läuft durch die veränderte Library leider nicht ...

Frische Bibliotheken geladen.

Neuer Versuch:

#include <Adafruit_TFTLCD.h>
#include <Adafruit_GFX.h>
#include <TouchScreen.h>

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0

#define LCD_RESET A4

// 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 10
#define MAXPRESSURE 1000 

#define BLACK   0x0000
#define YELLOW  0xFFE0
#define GREEN   0x07E0
#define RED     0xF800
#define WHITE   0xFFFF

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
int z;

void setup(void) {
  Serial.begin(9600);
  Serial.println("Anfang");

  tft.reset();
  tft.begin(0x9341);
  tft.fillScreen(BLACK);
  tft.setTextSize(3);
  tft.setTextColor(GREEN);
  tft.setCursor(20, 20);
  tft.println("Start");

  z = 1;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////

void loop() {
  TSPoint p = ts.getPoint();
  //Serial.print("\tPressureThreshhold = "); Serial.println(ts.pressureThreshhold);  Serial.print("\tPressure = "); Serial.println(p.z);

  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);

  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);

    if (z == 1 || z == 0) {
      if (z == 1) {
        tft.fillScreen(WHITE);
        z = 0;

        tft.setTextSize(3);
        tft.setTextColor(RED);
        tft.setCursor(20, 20);
        tft.println("Funktion 1");
      }

      else {
        tft.fillScreen(BLACK);
        z = 1;

        tft.setTextSize(3);
        tft.setTextColor(YELLOW);
        tft.setCursor(20, 20);
        tft.println("Funktion 2");
      }
    }
  }
  //delay(500);
}

Ausgabe:

Anfang
X = 179 Y = 210 Pressure = 605
X = 180 Y = 208 Pressure = 253
X = 848 Y = 210 Pressure = 497
X = 183 Y = 788 Pressure = 805
X = 846 Y = 775 Pressure = 452