ILI9341 Touch Display Seiten wechseln (Lösung)

Guten Tag Liebe Community.

Ich habe ein Problem mit meinem ILI9341. Ich möchte mit wischen von links nach rechts Seiten wechseln. Nun hab ich das Problem, das er erkennt, wenn ich die Seite wechsel möchte dank meiner eingebauten debug logik. Aber immer wenn ich die Seiten wechsel wird mein Display weiß. Ich weiß es ich nur eine Kleinigkeit, die ich übersehe. Vielleicht kann ja mal jemand über meine code darüber schauen und mir sagen, wo der Fehler liegen könnte.

`#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>

// Display- und Touchscreen-Objekte
MCUFRIEND_kbv tft;
#define MINPRESSURE 10
#define MAXPRESSURE 1000

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

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

// Kalibrierungswerte
const int TS_LEFT = 906, TS_RT = 126, TS_TOP = 78, TS_BOT = 904;

// Seiten-Management
int currentPage = 0;

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

uint16_t ID = tft.readID();
Serial.print("Display ID: 0x");
Serial.println(ID, HEX);

if (ID == 0xD3D3 || ID == 0xFFFF || ID == 0x0000) {
    Serial.println("Fallback auf ID 0x9341.");
    ID = 0x9341;
}

tft.begin(ID);
tft.setRotation(1);
showPage(0); // Starte mit Seite 0

}

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

if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    // Berechne Touch-Koordinaten
    int x = map(p.x, TS_LEFT, TS_RT, 0, tft.width());
    int y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());

    Serial.print("Touch X: ");
    Serial.print(x);
    Serial.print(", Touch Y: ");
    Serial.println(y);

    // Wisch-Erkennung
    if (x > tft.width() - 50) { // Wisch nach rechts
        Serial.println("Wisch nach rechts erkannt.");
        nextPage();
    } else if (x < 50) { // Wisch nach links
        Serial.println("Wisch nach links erkannt.");
        previousPage();
    }

    delay(300); // Debounce
}

}

void nextPage() {
currentPage = (currentPage + 1) % 3; // Zirkuläre Logik für Seitenwechsel
Serial.print("Wechsle zu Seite: ");
Serial.println(currentPage);
showPage(currentPage);
}

void previousPage() {
currentPage = (currentPage - 1 + 3) % 3;
Serial.print("Wechsle zu Seite: ");
Serial.println(currentPage);
showPage(currentPage);
}

void showPage(int page) {
uint16_t ID = tft.readID(); // Display-ID erneut lesen
tft.begin(ID); // Display neu initialisieren
tft.setRotation(1); // Rotation setzen
tft.fillScreen(0x0000); // Bildschirm löschen

Serial.print("Zeige Seite: ");
Serial.println(page);

switch (page) {
    case 0:
        tft.setTextColor(0xFFFF); // Weiß
        tft.setTextSize(2);
        tft.setCursor(50, 100);
        tft.print("Seite 1: Hallo Lukas");
        tft.drawRect(10, 10, 100, 50, 0xFFFF); // Test: Weißer Rahmen
        break;

    case 1:
        tft.setTextColor(0x07E0); // Grün
        tft.setTextSize(3);
        tft.setCursor(50, 100);
        tft.print("Seite 2: Willkommen!");
        tft.fillCircle(120, 160, 30, 0x07E0); // Test: Grüner Kreis
        break;

    case 2:
        tft.setTextColor(0xF800); // Rot
        tft.setTextSize(3);
        tft.setCursor(50, 100);
        tft.print("Seite 3: Viel Spaß!");
        tft.drawLine(0, 0, tft.width(), tft.height(), 0xF800); // Test: Rote Linie
        break;

    default:
        tft.setTextColor(0xFFFF); // Weiß
        tft.setTextSize(2);
        tft.setCursor(50, 100);
        tft.print("Fehler: Unbekannte Seite!");
        break;
}

Serial.println("Fertig mit Zeichnen.");

}
` Vielen Dank schonmal.

Bitte verschieben Sie Ihren Code in einen "Code-Block", indem Sie (1) den Code aus Ihrem Beitrag ausschneiden, (2) den Code in Ihrer IDE formatieren, (3) in Ihrer Antwort auf die Schaltfläche <CODE> klicken, (4) den formatierten Code zwischen den beiden Sätzen von drei TICKMARKS ( ``` ) einfügen (5) auf ANTWORTEN klicken. Sie sollten Folgendes haben:

#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>

// Display- und Touchscreen-Objekte
MCUFRIEND_kbv tft;
#define MINPRESSURE 10
#define MAXPRESSURE 1000

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

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

// Kalibrierungswerte
const int TS_LEFT = 906, TS_RT = 126, TS_TOP = 78, TS_BOT = 904;

// Seiten-Management
int currentPage = 0;

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

  uint16_t ID = tft.readID();
  Serial.print("Display ID: 0x");
  Serial.println(ID, HEX);

  if (ID == 0xD3D3 || ID == 0xFFFF || ID == 0x0000) {
    Serial.println("Fallback auf ID 0x9341.");
    ID = 0x9341;
  }

  tft.begin(ID);
  tft.setRotation(1);
  showPage(0); // Starte mit Seite 0
}

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

  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    // Berechne Touch-Koordinaten
    int x = map(p.x, TS_LEFT, TS_RT, 0, tft.width());
    int y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());

    Serial.print("Touch X: ");
    Serial.print(x);
    Serial.print(", Touch Y: ");
    Serial.println(y);

    // Wisch-Erkennung
    if (x > tft.width() - 50) { // Wisch nach rechts
      Serial.println("Wisch nach rechts erkannt.");
      nextPage();
    } else if (x < 50) { // Wisch nach links
      Serial.println("Wisch nach links erkannt.");
      previousPage();
    }

    delay(300); // Debounce
  }
}

void nextPage() {
  currentPage = (currentPage + 1) % 3; // Zirkuläre Logik für Seitenwechsel
  Serial.print("Wechsle zu Seite: ");
  Serial.println(currentPage);
  showPage(currentPage);
}

void previousPage() {
  currentPage = (currentPage - 1 + 3) % 3;
  Serial.print("Wechsle zu Seite: ");
  Serial.println(currentPage);
  showPage(currentPage);
}

void showPage(int page) {
  uint16_t ID = tft.readID(); // Display-ID erneut lesen
  tft.begin(ID); // Display neu initialisieren
  tft.setRotation(1); // Rotation setzen
  tft.fillScreen(0x0000); // Bildschirm löschen

  Serial.print("Zeige Seite: ");
  Serial.println(page);

  switch (page) {
    case 0:
      tft.setTextColor(0xFFFF); // Weiß
      tft.setTextSize(2);
      tft.setCursor(50, 100);
      tft.print("Seite 1: Hallo Lukas");
      tft.drawRect(10, 10, 100, 50, 0xFFFF); // Test: Weißer Rahmen
      break;

    case 1:
      tft.setTextColor(0x07E0); // Grün
      tft.setTextSize(3);
      tft.setCursor(50, 100);
      tft.print("Seite 2: Willkommen!");
      tft.fillCircle(120, 160, 30, 0x07E0); // Test: Grüner Kreis
      break;

    case 2:
      tft.setTextColor(0xF800); // Rot
      tft.setTextSize(3);
      tft.setCursor(50, 100);
      tft.print("Seite 3: Viel Spaß!");
      tft.drawLine(0, 0, tft.width(), tft.height(), 0xF800); // Test: Rote Linie
      break;

    default:
      tft.setTextColor(0xFFFF); // Weiß
      tft.setTextSize(2);
      tft.setCursor(50, 100);
      tft.print("Fehler: Unbekannte Seite!");
      break;
  }
  Serial.println("Fertig mit Zeichnen.");
}

Entschuldige bitte. ich werde drauf achten

Ich lösche mein Beispiel gerne, nachdem Sie Ihren Post #1 korrigiert haben.

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Warum machst Du das?
Las das weg.

War nur zum Testen. Das es so evtl. funktionieren könnte aber leider nicht.
War am Anfang nicht drin.

Wenn Du das raus nimmst, wird der Display beim Wechsel nicht neu initialisiert und damit geht auch der weisse Bildschirm eigentlich wieder weg.

Also grad nochmal getestet. wenn ich das weg lasse. Bleibt der Bildschirm beim hochladen komplett weiß.

Moment.
Das muss einmal im setup() drin bleiben, damit der initialisiert wird.

Versuch mal den Umbau:

#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>

// Display- und Touchscreen-Objekte
MCUFRIEND_kbv tft;
#define MINPRESSURE 10
#define MAXPRESSURE 1000

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

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

// Kalibrierungswerte
const int TS_LEFT = 906, TS_RT = 126, TS_TOP = 78, TS_BOT = 904;

// Seiten-Management
byte currentPage = 0;
const byte maxPage = 2;

void setup()
{
  Serial.begin(9600);
  uint16_t ID = tft.readID();
  Serial.print("Display ID: 0x");
  Serial.println(ID, HEX);
  if (ID == 0xD3D3 || ID == 0xFFFF || ID == 0x0000)
  {
    Serial.println("Fallback auf ID 0x9341.");
    ID = 0x9341;
  }
  tft.begin(ID);
  tft.setRotation(1);
  showPage(0); // Starte mit Seite 0
}

void loop()
{
  TSPoint p = ts.getPoint();
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE)
  {
    // Berechne Touch-Koordinaten
    int x = map(p.x, TS_LEFT, TS_RT, 0, tft.width());
    int y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
    Serial.print("Touch X: ");
    Serial.print(x);
    Serial.print(", Touch Y: ");
    Serial.println(y);
    // Wisch-Erkennung
    if (x > tft.width() - 50)   // Wisch nach rechts
    {
      Serial.println("Wisch nach rechts erkannt.");
      nextPage();
    }
    else if (x < 50)     // Wisch nach links
    {
      Serial.println("Wisch nach links erkannt.");
      previousPage();
    }
    delay(300); // Debounce
  }
}

void nextPage()
{
  if (currentPage < maxPage)
  {
    currentPage++;
    Serial.print("Wechsle zu Seite: ");
    Serial.println(currentPage);
    showPage(currentPage);
  }
}

void previousPage()
{
  if (currentPage > 0)
  {
    currentPage--;
    Serial.print("Wechsle zu Seite: ");
    Serial.println(currentPage);
    showPage(currentPage);
  }
}

void showPage(int page)
{
  tft.fillScreen(0x0000); // Bildschirm löschen
  Serial.print("Zeige Seite: ");
  Serial.println(page);
  switch (page)
  {
    case 0:
      tft.setTextColor(0xFFFF); // Weiß
      tft.setTextSize(2);
      tft.setCursor(50, 100);
      tft.print("Seite 1: Hallo Lukas");
      tft.drawRect(10, 10, 100, 50, 0xFFFF); // Test: Weißer Rahmen
      break;
    case 1:
      tft.setTextColor(0x07E0); // Grün
      tft.setTextSize(3);
      tft.setCursor(50, 100);
      tft.print("Seite 2: Willkommen!");
      tft.fillCircle(120, 160, 30, 0x07E0); // Test: Grüner Kreis
      break;
    case 2:
      tft.setTextColor(0xF800); // Rot
      tft.setTextSize(3);
      tft.setCursor(50, 100);
      tft.print("Seite 3: Viel Spaß!");
      tft.drawLine(0, 0, tft.width(), tft.height(), 0xF800); // Test: Rote Linie
      break;
      /*
          default:
            tft.setTextColor(0xFFFF); // Weiß
            tft.setTextSize(2);
            tft.setCursor(50, 100);
            tft.print("Fehler: Unbekannte Seite!");
            break;
      */
  }
  Serial.println("Fertig mit Zeichnen.");
}

Ich habs nicht kompiliert. Evtl. sind Rechtschreibfehler drin, wenns nicht kompliert.

Danke für deine Hilfe. Aber das Problem bleibt leider komischerweise bestehen.

Ist grad etwas frustrierend :slight_smile:

Dann müssen wir mal sehen, wann das ausgelöst wird.
Las mir mal nen Moment.

Alles klar danke dir schonmal

Moin @lukasderroboter ,

bei den TouchScreen Problemen liegt es i.d.R. daran, dass die Pins für den Touchscreen und die Datenübertragung zum Display doppelt genutzt werden.

Die Touchscreen-Lib stellt die Pins auf Input, aber nicht alle wieder zurück.

Setzte die pinModes mal unmittelbar nach dem getPoint()-Aufruf wieder so auf OUTPUT:

   TSPoint p = ts.getPoint();
    pinMode(YP, OUTPUT);
    pinMode(XM, OUTPUT);

Gruß
ec2021

1 Like

Ach krass. Das wars schon. Viele Viel danke :slight_smile:

Moin @my_xy_projekt ,

kannst Dich wieder hinlegen :wink:

Gruß
ec2021

1 Like

@lukasderroboter ,

das Problem kenne ich schon länger ...

Gerne meinen Post als "Lösung" kennzeichnen, damit dies in der Thread-Liste erkennbar ist!

Viel Spaß weiterhin!
ec2021

Ну, погоди! :slight_smile:
Beim nächsten Mal bin ich wieder dran.

1 Like

Also wenn ihr da so Lust drauf habt habe ich noch was für euch wo ich auch schon länger dran sitze :smiley: