ESP32 & touchscreen CST816S

Hallo liebe Arduinoianer,
ich habe derzeit ein Projekt bei dem ich an einem ESP32 einen GC9A01 Display mit CST816S Touchscreen ansteuern möchte. Das meiste funktioniert ganz gut, Wetter abrufen, Zeit anzeigen... Ich komme allerdings mit dem Touchscreen nicht weiter. Ich habe die entsprechende Bibliothek und die Daten aus dem "Example" in den Sketch kopiert. Das Display zeigt mir auch die entsprechende Geste an (z.b. Swipe Up). Ich schaffe es jedoch nicht den Sketch so umzuschreiben, das ich den Gesten Funktionen hinterlegen kann. Ich bin da mittlerweile verzweifelt, bin aber auch absoluter Hobby user. Ich würde mich echt freuen, wenn jemand sachdienliche Hinweise hat... Hier der entsprechende Code Ausschnitt...
#include liegt natürlich vor dem Setup, touch.init liegt im Setup, und der Code im Loop.

#include <CST816S.h>

  touch.begin();

if (touch.available()) {
  tft.setTextColor(TFT_WHITE); 
  tft.setTextSize(2);
  tft.setTextDatum(TC_DATUM);
  tft.drawString(touch.gesture(), tft.width() / 2, 175);  
  delay(100);
  tft.fillRect(20, 175, 200, 22, TFT_BLACK);     
}

Was soll man mit dem Fragment anfangen?
Gib uns einen vollständigen kompilierbaren Sketch und beschreibe was geht und was nicht so, wie Du Dir das vorstellst. Also Vergleich Soll - Ist.

Gruß Tommy

Hallo Tommy,
danke für dein Feedback, ich dachte das vielleicht schon jemand Erfahrung mit genau dem Touch hat.
Der Teil der den ich eingefügt habe ist ja im Prinzip alles was den touch betrifft.
Der Code so wie er jetzt ist, läuft ohne Probleme, der Codeschnipsel läuft auch, zeigt auf dem Display dann die entsprechende Geste an, also ein ich auf dem Display nach oben swipe, steht für 100 milisekunden kurz SWIPE UP auf dem Display. Ich möchte aber das eben bei einem SWIPE UP etwas anderes ausgelöst wird als auf dem Display die Geste anzuzeigen. Natürlich entsprechend der Geste...
Ich habe mal die entsprechende Bibliothek angehangen...
CST816S.h (2,1 KB)

Dann lass Dir für die verschiedenen Gesten den Wert von

touch.gesture();

ausgeben. Dann lies das in eine Variable ein und vergleiche es mit den Werten der verschiedenen Gesten. Ungetestet (ich habe die HW nicht) etwa so:

String gest = touch.gesture();
if (gest == "Swipe Up") {
  //mache irgendwas
}
else if (gest == "was anderes") {
  // mache was Anderes
}
// usw. ...
// Am Ende
else {
  Serial.println("Kenne ich nicht");
}

Gruß Tommy

Ich gehe mal noch einen Schritt weiter.
Hier ist der Code von getGesture():

String CST816S::gesture() {
  switch (data.gestureID) {
    case NONE:
      return "NONE";
      break;
    case SWIPE_DOWN:
      return "SWIPE DOWN";
      break;
    case SWIPE_UP:
      return "SWIPE UP";
      break;
    case SWIPE_LEFT:
      return "SWIPE LEFT";
      break;
    case SWIPE_RIGHT:
      return "SWIPE RIGHT";
      break;
    case SINGLE_CLICK:
      return "SINGLE CLICK";
      break;
    case DOUBLE_CLICK:
      return "DOUBLE CLICK";
      break;
    case LONG_PRESS:
      return "LONG PRESS";
      break;
    default:
      return "UNKNOWN";
      break;
  }
}

Da Zeichenkettenvergleiche immer blöd sind, würde ich die Lib erweitern:
In die CST816S.cpp einfügen:

byte CST816S::getGestureId() {
  return data.gestureID;
}

in der CST816S.h einfügen unter String gesture();:

byte getGestureId();

Da bekommst Du dann die Zahl zurück und kannst das besser vergleichen:

  NONE = 0x00,
  SWIPE_UP = 0x01,
  SWIPE_DOWN = 0x02,
  SWIPE_LEFT = 0x03,
  SWIPE_RIGHT = 0x04,
  SINGLE_CLICK = 0x05,
  DOUBLE_CLICK = 0x0B,
  LONG_PRESS = 0x0C

Also z.B. so:

byte gestId = touch.getGestureId();
if (gestID == 0x01) {
  // mache was by swipe up
}

oder Du nimmst anstelle der if-Cascade gleich switch/case

Gruß Tommy

WOW, Danke das Du Dir so viel Mühe gemacht hast... Ich teste mal...

DANKE!!!

Gruß, Daniel

Das ist mega... Das funktioniert... VIELEN DANK Tommy!
Ich habe deinen ersten Ansatz zuerst eingetragen, das hat schon geklappt.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.