LCD Touch Display calibration problem

hi guys, i've got a problem: i'm using an Iteaduino MEGA + LCD Touch Display from Itead Studio (ITDB02-5.0) + UTouch Library (UTFT too).
I've run the calibration sketch and replaced the strings in the UTouchCD.h file. When I upload the ButtonTest sketch the Iteaduino doesn't recognize the place where I touch, but recognizes that I actually touch the screen, I think this isn't an hardware problem. So I hope you can help me.
Cheers from Italy :grin:

Come on guys, we need your help! :fearful:

Posting your code would help, in particular have you set the screen orientation?
The calibration program i think needs to be in PORTRAIT but might be different depending on which library your using

  myGLCD.InitLCD(PORTRAIT);
  myTouch.InitTouch(PORTRAIT);

Thx for reply man, this is the code I'm using:

// UTouch_ButtonTest (C)2010-2012 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// This program is a quick demo of how create and use buttons.
//
// This program requires the UTFT library.
//
// It is assumed that the display module is connected to an
// appropriate shield or that you know how to change the pin
// numbers in the setup.
//

#include <UTFT.h>
#include <UTouch.h>

// Declare which fonts we will be using
extern uint8_t BigFont[];

// Uncomment the next two lines for the Arduino Mega
UTFT myGLCD(SSD1963_800,10,11,12,13);
UTouch myTouch(4,5,6,7,8);

int x, y;
char stCurrent[20]="";
int stCurrentLen=0;
char stLast[20]="";

/*************************
** Custom functions **
*************************/

void drawButtons()
{
// Draw the upper row of buttons
for (x=0; x<5; x++)
{
myGLCD.setColor(0, 0, 255);
myGLCD.fillRoundRect (10+(x60), 10, 60+(x60), 60);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (10+(x60), 10, 60+(x60), 60);
myGLCD.printNumI(x+1, 27+(x60), 27);
}
// Draw the center row of buttons
for (x=0; x<5; x++)
{
myGLCD.setColor(0, 0, 255);
myGLCD.fillRoundRect (10+(x
60), 70, 60+(x60), 120);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (10+(x
60), 70, 60+(x60), 120);
if (x<4)
myGLCD.printNumI(x+6, 27+(x
60), 87);
}
myGLCD.print("0", 267, 87);
// Draw the lower row of buttons
myGLCD.setColor(0, 0, 255);
myGLCD.fillRoundRect (10, 130, 150, 180);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (10, 130, 150, 180);
myGLCD.print("Clear", 40, 147);
myGLCD.setColor(0, 0, 255);
myGLCD.fillRoundRect (160, 130, 300, 180);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (160, 130, 300, 180);
myGLCD.print("Enter", 190, 147);
myGLCD.setBackColor (0, 0, 0);
}

void updateStr(int val)
{
if (stCurrentLen<20)
{
stCurrent[stCurrentLen]=val;
stCurrent[stCurrentLen+1]='\0';
stCurrentLen++;
myGLCD.setColor(0, 255, 0);
myGLCD.print(stCurrent, LEFT, 224);
}
else
{
myGLCD.setColor(255, 0, 0);
myGLCD.print("BUFFER FULL!", CENTER, 192);
delay(500);
myGLCD.print(" ", CENTER, 192);
delay(500);
myGLCD.print("BUFFER FULL!", CENTER, 192);
delay(500);
myGLCD.print(" ", CENTER, 192);
myGLCD.setColor(0, 255, 0);
}
}

// Draw a red frame while a button is touched
void waitForIt(int x1, int y1, int x2, int y2)
{
myGLCD.setColor(255, 0, 0);
myGLCD.drawRoundRect (x1, y1, x2, y2);
while (myTouch.dataAvailable())
myTouch.read();
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (x1, y1, x2, y2);
}

/*************************
** Required functions **
*************************/

void setup()
{
// Initial setup
myGLCD.InitLCD();
myGLCD.clrScr();

myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);

myGLCD.setFont(BigFont);
myGLCD.setBackColor(0, 0, 255);
drawButtons();
}

void loop()
{
while (true)
{
if (myTouch.dataAvailable())
{
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();

if ((y>=10) && (y<=60)) // Upper row
{
if ((x>=10) && (x<=60)) // Button: 1
{
waitForIt(10, 10, 60, 60);
updateStr('1');
}
if ((x>=70) && (x<=120)) // Button: 2
{
waitForIt(70, 10, 120, 60);
updateStr('2');
}
if ((x>=130) && (x<=180)) // Button: 3
{
waitForIt(130, 10, 180, 60);
updateStr('3');
}
if ((x>=190) && (x<=240)) // Button: 4
{
waitForIt(190, 10, 240, 60);
updateStr('4');
}
if ((x>=250) && (x<=300)) // Button: 5
{
waitForIt(250, 10, 300, 60);
updateStr('5');
}
}

if ((y>=70) && (y<=120)) // Center row
{
if ((x>=10) && (x<=60)) // Button: 6
{
waitForIt(10, 70, 60, 120);
updateStr('6');
}
if ((x>=70) && (x<=120)) // Button: 7
{
waitForIt(70, 70, 120, 120);
updateStr('7');
}
if ((x>=130) && (x<=180)) // Button: 8
{
waitForIt(130, 70, 180, 120);
updateStr('8');
}
if ((x>=190) && (x<=240)) // Button: 9
{
waitForIt(190, 70, 240, 120);
updateStr('9');
}
if ((x>=250) && (x<=300)) // Button: 0
{
waitForIt(250, 70, 300, 120);
updateStr('0');
}
}

if ((y>=130) && (y<=180)) // Upper row
{
if ((x>=10) && (x<=150)) // Button: Clear
{
waitForIt(10, 130, 150, 180);
stCurrent[0]='\0';
stCurrentLen=0;
myGLCD.setColor(0, 0, 0);
myGLCD.fillRect(0, 224, 319, 239);
}
if ((x>=160) && (x<=300)) // Button: Enter
{
waitForIt(160, 130, 300, 180);
if (stCurrentLen>0)
{
for (x=0; x<stCurrentLen+1; x++)
{
stLast[x]=stCurrent[x];
}
stCurrent[0]='\0';
stCurrentLen=0;
myGLCD.setColor(0, 0, 0);
myGLCD.fillRect(0, 208, 319, 239);
myGLCD.setColor(0, 255, 0);
myGLCD.print(stLast, LEFT, 208);
}
else
{
myGLCD.setColor(255, 0, 0);
myGLCD.print("BUFFER EMPTY", CENTER, 192);
delay(500);
myGLCD.print(" ", CENTER, 192);
delay(500);
myGLCD.print("BUFFER EMPTY", CENTER, 192);
delay(500);
myGLCD.print(" ", CENTER, 192);
myGLCD.setColor(0, 255, 0);
}
}
}
}
}
}

...and this is the code for calibration:

// UTouch_Calibration (C)2012 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// This program can be used to calibrate the touchscreen
// of the display modules.
// This program requires the UTFT library and a touch
// screen module that is compatible with UTFT.
//
// It is assumed that the display module is connected to an
// appropriate shield or that you know how to change the pin
// numbers in the setup.
//
// Instructions will be given on the display.
//

#include <UTFT.h>
#include <UTouch.h>

// Define the orientation of the touch screen. Further
// information can be found in the instructions.
#define TOUCH_ORIENTATION LANDSCAPE

// Declare which fonts we will be using
extern uint8_t SmallFont[];

// Uncomment the next two lines for the Arduino Mega
UTFT myGLCD(SSD1963_800,10,11,12,13);
UTouch myTouch(4,5,6,7,8);

// ************************************
// DO NOT EDIT ANYTHING BELOW THIS LINE
// ************************************
uint32_t cx, cy;
uint32_t rx[10], ry[10];
uint32_t clx, crx, cty, cby;
float px, py;
int dispx, dispy, text_y_center;
uint32_t calx, caly, cals;
char buf[13];

void setup()
{
myGLCD.InitLCD();
myGLCD.clrScr();
myGLCD.setFont(SmallFont);

myTouch.InitTouch(TOUCH_ORIENTATION);
myTouch.setPrecision(PREC_LOW);
dispx=myGLCD.getDisplayXSize();
dispy=myGLCD.getDisplayYSize();
text_y_center=(dispy/2)-6;
}

void drawCrossHair(int x, int y)
{
myGLCD.drawRect(x-10, y-10, x+10, y+10);
myGLCD.drawLine(x-5, y, x+5, y);
myGLCD.drawLine(x, y-5, x, y+5);
}

void readCoordinates()
{
int iter = 2000;
int cnt = 0;
uint32_t tx=0;
uint32_t ty=0;
boolean OK = false;

while (OK == false)
{
myGLCD.setColor(255, 255, 255);
myGLCD.print("* PRESS ", CENTER, text_y_center);
while (myTouch.dataAvailable() == false) {}
myGLCD.print("
HOLD! *", CENTER, text_y_center);
while ((myTouch.dataAvailable() == true) && (cnt<iter))
{
myTouch.read();
tx += myTouch.TP_X;
ty += myTouch.TP_Y;
cnt++;
}
if (cnt>=iter)
{
OK = true;
}
else
{
tx = 0;
ty = 0;
cnt = 0;
}
}

cx = tx / iter;
cy = ty / iter;

}

void calibrate(int x, int y, int i)
{
myGLCD.setColor(255, 255, 255);
drawCrossHair(x,y);
myGLCD.setBackColor(255, 0, 0);
readCoordinates();
myGLCD.setColor(255, 255, 255);
myGLCD.print("* RELEASE ", CENTER, text_y_center);
myGLCD.setColor(80, 80, 80);
drawCrossHair(x,y);
rx
=cx;*
_ ry*=cy;_
_
while (myTouch.dataAvailable() == true)_
_
{_
_
myTouch.read();_
_
}_
_
}_
void waitForTouch()
_
{_
_
while (myTouch.dataAvailable() == true)_
_
{_
_
myTouch.read();_
_
}_
_
while (myTouch.dataAvailable() == false) {}_
_
while (myTouch.dataAvailable() == true)_
_
{_
_
myTouch.read();_
_
}_
_
}_
void toHex(uint32_t num)
_
{_
_
buf[0] = '0';_
_
buf[1] = 'x';_
_
buf[10] = 'U';_
_
buf[11] = 'L';_
_
buf[12] = 0;_
_
for (int zz=9; zz>1; zz--)_
_
{_
_
if ((num & 0xF) > 9)_
_
buf[zz] = (num & 0xF) + 55;_
_
else*_
* buf[zz] = (num & 0xF) + 48;*
* num=num>>4;*
* }*
}
void startup()
{
* myGLCD.setColor(255, 0, 0);*
* myGLCD.fillRect(0, 0, dispx-1, 13);*
* myGLCD.setColor(255, 255, 255);*
* myGLCD.setBackColor(255, 0, 0);*
* myGLCD.drawLine(0, 14, dispx-1, 14);*
* myGLCD.print("UTouch Calibration", CENTER, 1);*
* myGLCD.setBackColor(0, 0, 0);*
* if (dispx==220)*
* { *
* myGLCD.print("Use a stylus or something", LEFT, 30);*
* myGLCD.print("similar to touch as close", LEFT, 42);*
* myGLCD.print("to the center of the", LEFT, 54);*
* myGLCD.print("highlighted crosshair as", LEFT, 66);*
* myGLCD.print("possible. Keep as still as", LEFT, 78);*
* myGLCD.print("possible and keep holding", LEFT, 90);*
* myGLCD.print("until the highlight is", LEFT, 102);*
* myGLCD.print("removed. Repeat for all", LEFT, 114);*
* myGLCD.print("crosshairs in sequence.", LEFT, 126);*
* myGLCD.print("Touch screen to continue", CENTER, 162);*
* }*
* else*
* {*
* myGLCD.print("INSTRUCTIONS", CENTER, 30);*
* myGLCD.print("Use a stylus or something similar to", LEFT, 50);*
* myGLCD.print("touch as close to the center of the", LEFT, 62);*
* myGLCD.print("highlighted crosshair as possible. Keep", LEFT, 74);*
* myGLCD.print("as still as possible and keep holding", LEFT, 86);*
* myGLCD.print("until the highlight is removed. Repeat", LEFT, 98);*
* myGLCD.print("for all crosshairs in sequence.", LEFT, 110);*
* myGLCD.print("Further instructions will be displayed", LEFT, 134);*
* myGLCD.print("when the calibration is complete.", LEFT, 146);*
* myGLCD.print("Do NOT use your finger as a calibration", LEFT, 170);*
* myGLCD.print("stylus or the result WILL BE imprecise.", LEFT, 182);*
* myGLCD.print("Touch screen to continue", CENTER, 226);*
* }*
* waitForTouch();*
* myGLCD.clrScr();*
}
void done()
{
* myGLCD.clrScr();*
* myGLCD.setColor(255, 0, 0);*
* myGLCD.fillRect(0, 0, dispx-1, 13);*
* myGLCD.setColor(255, 255, 255);*
* myGLCD.setBackColor(255, 0, 0);*
* myGLCD.drawLine(0, 14, dispx-1, 14);*
* myGLCD.print("UTouch Calibration", CENTER, 1);*
* myGLCD.setBackColor(0, 0, 0);*

* if (dispx==220)*
* { *
* myGLCD.print("To use the new calibration", LEFT, 30);*
* myGLCD.print("settings you must edit the", LEFT, 42);*
* myGLCD.setColor(160, 160, 255);*
* myGLCD.print("UTouchCD.h", LEFT, 54);*
* myGLCD.setColor(255, 255, 255);*
* myGLCD.print("file and change", 88, 54);*
* myGLCD.print("the following values. The", LEFT, 66);*
* myGLCD.print("values are located right", LEFT, 78);*
* myGLCD.print("below the opening comment.", LEFT, 90);*
* myGLCD.print("CAL_X", LEFT, 110);
myGLCD.print("CAL_Y", LEFT, 122);
myGLCD.print("CAL_S", LEFT, 134);
_
toHex(calx);_
_
myGLCD.print(buf, 75, 110);_
_
toHex(caly);_
_
myGLCD.print(buf, 75, 122);_
_
toHex(cals);_
_
myGLCD.print(buf, 75, 134);_
_
}_
_
else*_
* { *
* myGLCD.print("CALIBRATION COMPLETE", CENTER, 30);*
* myGLCD.print("To use the new calibration", LEFT, 50);*
* myGLCD.print("settings you must edit the", LEFT, 62);*
* myGLCD.setColor(160, 160, 255);*
* myGLCD.print("UTouchCD.h", LEFT, 74);*
* myGLCD.setColor(255, 255, 255);*
* myGLCD.print("file and change", 88, 74);*
* myGLCD.print("the following values.", LEFT, 86);*
* myGLCD.print("The values are located right", LEFT, 98);*
* myGLCD.print("below the opening comment in", LEFT, 110);*
* myGLCD.print("the file.", LEFT, 122);*
* myGLCD.print("CAL_X", LEFT, 150);
myGLCD.print("CAL_Y", LEFT, 162);
myGLCD.print("CAL_S", LEFT, 174);
_
toHex(calx);_
_
myGLCD.print(buf, 75, 150);_
_
toHex(caly);_
_
myGLCD.print(buf, 75, 162);_
_
toHex(cals);_
_
myGLCD.print(buf, 75, 174);_
_
}*_

}
void loop()
{
* startup();*

* myGLCD.setColor(80, 80, 80);*
* drawCrossHair(dispx-11, 10);*
* drawCrossHair(dispx/2, 10);*
* drawCrossHair(10, 10);*
* drawCrossHair(dispx-11, dispy/2);*
* drawCrossHair(10, dispy/2);*
* drawCrossHair(dispx-11, dispy-11);*
* drawCrossHair(dispx/2, dispy-11);*
* drawCrossHair(10, dispy-11);*
* myGLCD.setColor(255, 255, 255);*
* myGLCD.setBackColor(255, 0, 0);*
myGLCD.print("", CENTER, text_y_center-12);
myGLCD.print("
", CENTER, text_y_center+12);

* calibrate(10, 10, 0);*
* calibrate(10, dispy/2, 1);*
* calibrate(10, dispy-11, 2);*
* calibrate(dispx/2, 10, 3);*
* calibrate(dispx/2, dispy-11, 4);*
* calibrate(dispx-11, 10, 5);*
* calibrate(dispx-11, dispy/2, 6);*
* calibrate(dispx-11, dispy-11, 7);*

* if (TOUCH_ORIENTATION == LANDSCAPE)
_
cals=(long(dispx-1)<<12)+(dispy-1);_
_
else*_
* cals=(long(dispy-1)<<12)+(dispx-1);*
* if (TOUCH_ORIENTATION == PORTRAIT)
_
px = abs(((float(rx[2]+rx[4]+rx[7])/3)-(float(rx[0]+rx[3]+rx[5])/3))/(dispy-20)); // PORTRAIT*_
* else*
* px = abs(((float(rx[5]+rx[6]+rx[7])/3)-(float(rx[0]+rx[1]+rx[2])/3))/(dispy-20)); // LANDSCAPE*
* if (TOUCH_ORIENTATION == PORTRAIT)
_
{_
_
clx = (((rx[0]+rx[3]+rx[5])/3)); // PORTRAIT*_
* crx = (((rx[2]+rx[4]+rx[7])/3)); // PORTRAIT*
* }*
* else*
* {*
* clx = (((rx[0]+rx[1]+rx[2])/3)); // LANDSCAPE*
* crx = (((rx[5]+rx[6]+rx[7])/3)); // LANDSCAPE*
* }*
* if (clx<crx)*
* {*
_ clx = clx - (px10);
crx = crx + (px
10);
* }*
* else*
* {*
clx = clx + (px10);
crx = crx - (px
10);_

* }*

* if (TOUCH_ORIENTATION == PORTRAIT)
_
py = abs(((float(ry[5]+ry[6]+ry[7])/3)-(float(ry[0]+ry[1]+ry[2])/3))/(dispx-20)); // PORTRAIT*_
* else*
* py = abs(((float(ry[0]+ry[3]+ry[5])/3)-(float(ry[2]+ry[4]+ry[7])/3))/(dispx-20)); // LANDSCAPE*
* if (TOUCH_ORIENTATION == PORTRAIT)
_
{_
_
cty = (((ry[5]+ry[6]+ry[7])/3)); // PORTRAIT*_
* cby = (((ry[0]+ry[1]+ry[2])/3)); // PORTRAIT*
* }*
* else*
* {*
* cty = (((ry[0]+ry[3]+ry[5])/3)); // LANDSCAPE*
* cby = (((ry[2]+ry[4]+ry[7])/3)); // LANDSCAPE*
* }*
* if (cty<cby)*
* {*
_ cty = cty - (py10);
cby = cby + (py
10);
* }*
* else*
* {*
cty = cty + (py10);
cby = cby - (py
10);_

* }*

* calx = (long(clx)<<14) + long(crx);*
* caly = (long(cty)<<14) + long(cby);*
* if (TOUCH_ORIENTATION == LANDSCAPE)
_
cals = cals + (1L<<31);_
_
done();_
_
while(true) {}_
_
}*_

I'm having the same problem as this but I outputted the x y coordinates via serial. It appears that every screen touch is recognised but the device thinks that it is always at the same point...

Were the first two calibration strings the same?

I am looking at the possibility that the connections are wrong on the CTE shield in relation to my 32 pin TFT.

Hi all,

I had the same calibration problem but after a few tries I could solve it.

But I have another problem, just upload the program to the arduino this works perfectly, but when I restart arduino stops working screen, and behaves as before calibration.

I used the same code that is above.

Thanks in advance.

Hello,

I got the same problem and I think it's related to too fast spi line settings, anyhow when I added 2us delay after setting lines - it seems to work OK... hopefully helps in your case too.

***** HW_AVR.inc *******
void UTouch::touch_WriteData(byte data)
{
byte temp;

temp=data;
cbi(P_CLK, B_CLK);

for(byte count=0; count<8; count++)
{
if(temp & 0x80)
sbi(P_DIN, B_DIN);
else
cbi(P_DIN, B_DIN);
temp = temp << 1;
cbi(P_CLK, B_CLK);
sbi(P_CLK, B_CLK);
}
}

word UTouch::touch_ReadData()
{
word data = 0;

for(byte count=0; count<12; count++)
{
data <<= 1;
sbi(P_CLK, B_CLK);
cbi(P_CLK, B_CLK);
delayMicroseconds(2); //// added to get more stable readings???
if (rbi(P_DOUT, B_DOUT))
data++;
}
return(data);
}

WOW!! This must be the "nobody learned how to post code properly" thread. :astonished:

Sorry about that,
but the fix for touch screen calibration (reading) is working properly.
Next time also the code is sent proper way;)

eclipsegst:
Next time also the code is sent proper way;)

"Next time" not necessary. Go and look at your posting, select the "modify" option, highlight the code section and select the "Insert Code" button marked "#". Then "save" it.

or just put tags around the code.

Thank you so much eclipsegst, it works fine to me