SainSmart 5" TFT Touchproblem

Hallo liebe Community,

ich bin Anfänger im Thema ARDUINO Programmierung.
Grundlagen der C Programmierung besitze ich aus der Technikerschule.
Für meine Abschlussarbeit möchte ich unter anderem ein Touchscreen programmieren.

Folgende Komponenten setze ich ein:

SainSmart Due Atmel SAM3X8E ARM Cortex-M3 board black

SainSmart 5" 5inch TFT LCD 480x800 Arduino DUE MEGA2560 R3 Raspberry Pi

TFT LCD Screen Shield for Arduino DUE /Taijiuino

Das Einrichten und kalibrieren der Komponenten hat soweit meiner Meinung nach gut funktioniert.
Folgende Schritte habe ich durchgeführt:

  1. Henning Karlsen libraries UTFT und URTouch in Bibliotheken der arduino-1.6.10-windows Software eingebunden.

  2. Unter “Arduino/libraries/UTFT/memorysaver” alle Zeilen aus kommentiert bis auf folgende
    //#define DISABLE_SSD1963_800 1 // ITDB50 / TFT01_50 / CTE50 / EHOUSE50

  3. Unter “Arduino/libraries/UTFT/Hardware/arm/HW_ARM_defines” die folgende Zeile aus kommentiert
    #define EHOUSE_DUE_SHIELD 1

  4. Das Sktech bei “Beispiele - URTouch - Arduino - URtouch_Calibration” ausgeführt und die beiden Wichtigen Zeilen ausfüllt.
    UTFT myGLCD(EHOUSE50,22,23,31,33);
    URTouch myTouch( 25, 26, 27, 29, 30);

  5. Das kalibrieren hat funktioniert, so dass ich die Werte in der URTouchCD.h Datei eintragen konnte.
    #define CAL_X 0x0206880EUL
    #define CAL_Y 0x02050810UL
    #define CAL_S 0x001DF31FUL

Soweit so gut :wink: oder habe ich hier schon ein Fehler gemacht?

Nun wollte ich mittels eines einfachen Rechteckes (Button) eine LED ein bzw. aus schalten.

Dazu der Sketch:

#include <URTouch.h>
#include <URTouchCD.h>

#include <memorysaver.h>
#include <UTFT.h>

UTFT myGLCD(EHOUSE50,22,23,31,33);
URTouch myTouch(25,26,27,29,30);

void zeichneButton(){
myGLCD.setColor(VGA_WHITE);
myGLCD.fillRoundRect(300,300,150,150);
}

int LEDPin = 8;
int LEDState = 0;
int x=0,y=0;

void setup(){
myGLCD.InitLCD();
myTouch.InitTouch();
myGLCD.clrScr();
Serial.begin(9600);
zeichneButton();
pinMode(LEDPin, OUTPUT);
}

void loop(){
if(myTouch.dataAvailable()){
myTouch.read();
x = myTouch.getX();
y = myTouch.getY();
Serial.println(x);
Serial.println(y);
if ((x>=300) && (y>=300) && (x<=150) && (y<=150)){
if(LEDState == 0){
LEDState = 1;
delay(100);
digitalWrite(LEDPin,LEDState);
}
else if(LEDState == 1){
LEDState = 0;
delay(100);
digitalWrite(LEDPin,LEDState);
}
}
}
}

Nach dem Laden des Sketches, wurde der Button gezeichnet jedoch durch drücken des Rechteckes wird die LED nicht angeschaltet!
Daraufhin habe ich mir die Werte von X und Y im Seriellen Monitor angeguckt und rausgefunden das der Screen in 4 Bereiche aufgeteilt ist. Das Bild im Anhang verdeutlich dieses (Button_LED_Test_Bereiche).
Trage ich nun die Werte x = 799 y = 479 in der Zeile im Sketch ein kann ich durch betätigen des oben rechts liegenden Bereiches die LED ein bzw. aus schalten.

if ((x>=479) && (y>=479) && (x<=799) && (y<=799)){
if(LEDState == 0){
LEDState = 1;
delay(100);
digitalWrite(LEDPin,LEDState);

Nun zu meiner eigentlichen Frage :wink:

Habe ich die falsche Hardware ausgesucht?
Liegt ein Fehler in der kalibrierung vor?
Ist der Sketch fehlerhaft?
Wie bekomme ich es hin, dass der Touchscreen mir genaue X und Y Werte ausgibt und nicht nur diese 4 Bereiche auszuwerten sind?

Vielen Dank im voraus für Eure Hilfe!

Gruß Christoph

Du hast hier schon ein Problem:

   if ((x>=300) && (y>=300) && (x<=150) && (y<=150)){

x müßte bei Dir gleichzeitig größergleich 300 und kleinergleich 150 sein. Bei y ebenso, das kann also nicht funktionieren.

Aus den 4 Bereichen werden ich nicht recht schlau, denn das Display hat ja nur 800x480 Pixel Auflösung. Das sollte also passen, oder liefert der Code für X nur den wert 0 oder 799 und für y nur 0 oder 479?

Mario.

Danke für deine Antwort!

Die if Bedingung müsste wohl so aussehen:

if ((x<=300) && (y<=300) && (x>=150) && (y>=150)){

Ich werde das mal ausprobieren.

Ich befürchte nur, dass dies das generelle Problem nicht lösen wird.
Deine Annahme ist richtig! x liefert nur den Wert 0 oder 799 und für y nur 0 oder 479.
Je nachdem in welchen “Bereich” ich das Display berühre werden mir die Werte wie auf dem Foto ausgegeben.

Gruß Christoph

Hallo,
was ist das? myGLCD.fillRoundRect(300,300,150,150);
x, y, breite, höhe, x, y, höhe, breite?
Gruß und Dank
Andreas
If (((x >= 300) && (x <=450)) && ( ((y >= 300) && (y <=450)) ) glaube ich…

Hi,

hier als Beispiel:

my GLCD.fillRoundRect(x1, y1, x2, y2);

x1: x-coordinate of the start-corner
y1: y-coordinate of the start-Corner
x2: x-coordinate of the end-corner
y2: y-coordinate of the end-Corner

ich möchte mich jedoch nicht auf die if Bedienung fest beißen.
Wenn ich zuerst vernünftige x und y Werte ausgegeben bekomme wäre ich sehr happy :wink:

Hallo zusammen,

ich habe mich nochmal durch das Internet gewühlt und bin dabei auf folgende Daten für die UTouchCD.h Datei gestoßen.

#define CAL_X 0x00430ED8UL
#define CAL_Y 0x002A0EECUL
#define CAL_S 0x000EF18FUL

mir werden damit genaue x und y Werte ausgegeben :grinning: .
Es scheint so, dass bei mir der Beispiel Sketch zur kalibrierung von Hennig Karlsen nicht korrekt funktioniert hat :astonished: .

Auf jeden Fall danke für Eure Unterstützung!