Touchscreen levert geen x- en y-coordinaat

Arduino shields
Berichten: 17
Geregistreerd: 06 Sep 2018, 10:32

Touchscreen levert geen x- en y-coordinaat

Berichtdoor PE2BS » 06 Sep 2018, 11:08

Even voorstellen: mijn naam is Ruud, ben zendamateur (PE2BS) en de Arduinoś gebruik ik voor mijn hobby. Dit is mijn eerste bericht in dit forum omdat ik in de zoekfunctie geen antwoord kon vinden voor mijn probleem.

Op mijn Arduino Due heb ik via een een shield (CTE TFT LCD / SD Card Shield For Arduino DUE versie 1.04) de TFT_320QVT (LED backlight) aangesloten. De library's die ik gebruik zijn de nieuwste versies van UTFT en URTouch.

Het was even puzzelen maar het scherm werkt prima. Nu wil ik het touchscreen aan de praat krijgen maar dat gaat niet probleemloos. Het initialiseren van het touchscreen heb ik als volgt gedaan:

URTouch myTouch( 6, 5, 32, 3, 2); // initialiseren Touchscreen conform de handleiding en ook nog een keer de hardware na gemeten
myTouch.InitTouch(PORTRAIT); // initialiseren touch op protrait stand
myTouch.setPrecision(PREC_HI); // nauwkeurigheid scherm instellen

Het scherm herkent wel dat het wordt aangeraakt dus de functie myTouch.dataAvailable() werkt.
De functie x = myTouch.getX(); werkt niet en voor de y-coördinaat geldt hetzelfde.

Aanvankelijk dacht ik dat de pinning bij het initialiseren niet zou kloppen maar ik heb de shield nagemeten en de pinning klopt wel. Ook de jumpers van het tussenbordje staan goed (jp10 is open). Ik heb van alles geprobeerd (pin 4 in plaats van pin 32, landscape i.p.v. protrait, andere nauwkeurigheid in resolutie) maar ik heb sterk het idee dat het probleem dieper ligt. Uiteindelijk kwam in terecht in URTouch.cpp. Hierin zit een stukje code waarin de data voor x (en y) wordt opgevraagd:

touch_WriteData(0x90);
pulse_high(P_CLK, B_CLK);
temp_x=touch_ReadData();

Ik heb geprobeerd het adres 0x90 aan te passen want misschien heeft de controller in mijn touchscreen een ander adres maar dat had weinig effect.

Kan iemand me helpen met het antwoord op twee vragen:
- Is het probleem herkenbaar en heeft iemand hiervoor al een oplossing?
- Wordt de URTouch.cpp file wel opnieuw mee gecompileerd bij compilatie van de sketch of hebben veranderingen in een *.cpp geen effect?

Vast bedankt.

Ruud

Advertisement

Gebruikers-avatar
Berichten: 4906
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Touchscreen levert geen x- en y-coordinaat

Berichtdoor nicoverduin » 06 Sep 2018, 11:30

Ik zou ff de hele sketch laten zien
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 17
Geregistreerd: 06 Sep 2018, 10:32

Re: Touchscreen levert geen x- en y-coordinaat

Berichtdoor PE2BS » 06 Sep 2018, 20:09

Bij deze. Regel 65 en 66 heb ik toegevoegd ter controle. Steeds haalt het programma de waarde 0 op en dat kan dus niet. Ook het calibratieprogramma dat bij URTouch geleverd wordt levert steeds de waarde 0 voor de coordinaten x en y op. Het lijkt erop dat de functie myTouch.getX() niet goed werkt.


cpp code
// Aanpassingen voor CTE TFT/SD shield for arduino DUE:
// - uncomment "#define CTE_DUE_SHIELD 1" in the HW_ARM_defines.h
// - change the pinout to : UTFT myGLCD(ILI9341_16 (LCD processor),RS:25,WR:26,CS:27,RST:28);


#include <UTFT.h>

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


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



UTFT myGLCD(ILI9341_16,25,26,27,28); // initialiseren LCD-scherm en shield
URTouch myTouch( 6, 5, 32, 3, 2); // initialiseren Touchscreen conform hardware meting

// globale variabelen
int temp=-23;
unsigned int luchtd = 1008;
char luchtv=52; // variabele voor gemeten luchtvochtigheid
int data[3][2][2][100]; // array voor opslag data: type data - binnen/buiten/2 dagen / 100 x data - om de 15 minuten
int kleur_binnen = VGA_GREEN; // kleur voor waarden temperatuur en luchtvochtigheid binnen
int kleur_buiten = VGA_BLUE; // kleur voor waarden temperatuur en luchtvochtigheid buiten
int kleur_luchtd = VGA_RED; // kleur voor waarden luchtdruk



void setup() // Setup the LCD en programma
{
myGLCD.InitLCD(); // initialiseren LCD scherm
myGLCD.setFont(SmallFont);

myTouch.InitTouch(PORTRAIT); // initialiseren touch functie
myTouch.setPrecision(PREC_HI);

myGLCD.clrScr(); // Clear the screen and draw the frame
// Tekst onderaan scherm schrijven
myGLCD.setColor(64, 64, 64); // kleur instellen voor rechthoek
myGLCD.fillRect(0, 226, 319, 239); // rechthoek kleuren
myGLCD.setColor(VGA_YELLOW); // kleurinstellen voor tekst
//myGLCD.setColor(255,255,0); // kleurinstellen voor tekst
myGLCD.setBackColor(64, 64, 64); // achtergrondkleur voor tekst instellen
myGLCD.setFont(SmallFont); // lettergrootte instellen
//myGLCD.print("versie 1.2 - by PE2BS", CENTER, 227); // tekst schrijven op scherm

vullen_arrays(); // arrays vullen voor testwerk
}




void loop()
{
int x=5, scherm=0;
int tl=0;

if(myTouch.dataAvailable() == true)
{

x = myTouch.getX(); // regels om x-coordinaat uit te lezen ter controle
myGLCD.printNumI(x, CENTER, 227); // x-coördinaat wordt op scherm geprint ter controle
delay(1000);

if (x<160) // links op scherm tikken is één scherm terug
{
scherm=+-1;
if (scherm<0)scherm=3;
}
else
{
scherm=+1; // rechts op scherm tikken is één scherm verder
if (scherm>3)scherm=0;
}
switch (scherm)
{
case 0: Scherm_num(); // tekent het nummerieke scherm op de LCD
case 1: Scherm_temp(); // tekent grafiek van temperatuurverloop op scherm
case 2: Scherm_luchtv(); // tekent grafiek van luchtvochtigheid verloop op scherm
case 3: Scherm_luchtd(); // tekent grafiek van luchtdruk verloop op scherm
break;
}
}
}


// Functies

void vullen_arrays() // arrays worden gevuld voor testen grafiekenop het scherm

{
int tl1,tl2,tl3,tl4;

for (tl1=0;tl1<3;tl1++)
for (tl3=0;tl3<2;tl3++)
for (tl4=0;tl4<100;tl4++) data[tl1][0][tl3][tl4] = abs(100*sin(tl4*0.0314));

for (tl1=0;tl1<3;tl1++)
for (tl3=0;tl3<2;tl3++)
for (tl4=0;tl4<100;tl4++) data[tl1][1][tl3][tl4] = abs(100*cos(tl4*0.0628));

}




void Schrijf_temp(int xpos, int ypos) // schrijft temperatuur op scherm, positie x, positie y
{
myGLCD.setColor(kleur_binnen); // kleurinstellen voor tekst
myGLCD.setBackColor(0, 0, 0); // achtergrondkleur voor tekst instellen
myGLCD.setFont(SevenSegNumFont); // lettergrootte instellen
myGLCD.printNumI(abs(temp),xpos,ypos,0); // temperatuur schrijven op scherm
if(temp<0)
{
myGLCD.setFont(BigFont); // lettergrootte instellen
myGLCD.print("-",xpos-25,ypos+17,0); // tekst schrijven op scherm
}
myGLCD.print("o",xpos+75,ypos+25,0); // oC schrijven op scherm
myGLCD.print("C",xpos+85,ypos+30,0);
myGLCD.setColor(kleur_buiten); // kleurinstellen voor tekst
myGLCD.setFont(SevenSegNumFont); // lettergrootte instellen
myGLCD.printNumI(abs(temp),xpos+155,ypos,0); // tekst schrijven op scherm
if(temp<0)
{
myGLCD.setFont(BigFont); // lettergrootte instellen
myGLCD.print("-",xpos+130,ypos+17,0); // tekst schrijven op scherm
}
myGLCD.print("o",xpos+230,ypos+25,0); // oC schrijven op scherm
myGLCD.print("C",xpos+240,ypos+30,0);
}



void Schrijf_luchtv(int xpos, int ypos) // schrijft luchtvochtigheid op scherm, positie x, positie y
{
myGLCD.setColor(kleur_binnen); // kleurinstellen voor tekst
myGLCD.setBackColor(0, 0, 0); // achtergrondkleur voor tekst instellen
myGLCD.setFont(SevenSegNumFont); // lettergrootte instellen
if (luchtv >= 100) myGLCD.printNumI(luchtv,xpos-30,ypos,0);
else myGLCD.printNumI(luchtv, xpos, ypos,0); // luchtvochtigheid schrijven op scherm
myGLCD.setFont(BigFont); // lettergrootte instellen
myGLCD.print("%", xpos+75, ypos+30,0); // % schrijven op scherm

myGLCD.setColor(kleur_buiten); // kleurinstellen voor tekst
myGLCD.setFont(SevenSegNumFont); // lettergrootte instellen
if (luchtv >= 100) myGLCD.printNumI(luchtv,xpos+125,ypos,0);
else myGLCD.printNumI(luchtv, xpos+155, ypos,0); // luchtvochtigheid schrijven op scherm
myGLCD.setFont(BigFont); // lettergrootte instellen
myGLCD.print("%", xpos+230, ypos+30,0); // % schrijven op scherm
}



void Schrijf_luchtd(int xpos, int ypos) // schrijft luchtdruk op scherm, positie x, positie y
{
myGLCD.setColor(kleur_luchtd); // kleurinstellen voor tekst
myGLCD.setBackColor(0, 0, 0); // achtergrondkleur voor tekst instellen
myGLCD.setFont(SevenSegNumFont); // lettergrootte instellen
if (luchtd >= 1000) myGLCD.printNumI(luchtd, xpos, ypos,0);
else myGLCD.printNumI(luchtd, xpos + 30, ypos,0); // luchtdruk schrijven op scherm
myGLCD.setFont(BigFont); // lettergrootte instellen
myGLCD.print("hPa", xpos+140, ypos+30,0); // tekst schrijven op scherm
}



void Teken_grafiek(char schermtype) // tekent de grafiek in een assen stelsel 1=temp, 2=luchtv, 3 = luchtd
{
int tl1, tl2, tl3;
int y=0; // variabele voor de hoogte van de x-as

if (schermtype==1) y=-25; // offset voor x-as bij temperatuurscherm
myGLCD.setColor(VGA_WHITE); // kleurinstellen voor assen
myGLCD.setFont(SmallFont); // lettergrootte instellen
myGLCD.drawLine(60, 200+y, 260, 200+y); // x-as tekenen
myGLCD.print("0", 57, 210,0); // tekst schrijven op scherm
myGLCD.print("12", 100, 210,0); // tekst schrijven op scherm
myGLCD.print("24/0", 140, 210,0); // tekst schrijven op scherm
myGLCD.print("12", 198, 210,0); // tekst schrijven op scherm
myGLCD.print("24 uur", 247, 210,0); // tekst schrijven op scherm
for (tl1=0;tl1<216;tl1+=24)
myGLCD.drawLine(tl1+60, 200+y, tl1+60, 202+y); // verdeling x-as tekenen

myGLCD.drawLine(60, 200, 60, 100); // y-as tekenen
for (tl1=0;tl1<101;tl1+=25)
myGLCD.drawLine(58, 200-tl1, 60, 200-tl1); // verdeling y-as tekenen

if (schermtype==1)
{
myGLCD.print("45 C", 20, 95,0); // tekst bij y-as schrijven op scherm
myGLCD.print("15 C", 20, 145,0);
myGLCD.print("-15 C", 10, 195,0);
}

if (schermtype==2)
{
myGLCD.print("100%", 20, 95,0); // tekst bij y-as schrijven op scherm
myGLCD.print("50%", 30, 145,0);
myGLCD.print("0%", 40, 195,0);
}

if (schermtype==3)
{
myGLCD.print("hPa", 30, 80,0); // tekst bij y-as schrijven op scherm
myGLCD.print("1100", 20, 95,0);
myGLCD.print("1000", 20, 145,0);
myGLCD.print("900", 30, 195,0);
}

if ((schermtype==1)||(schermtype==2)) myGLCD.setColor (kleur_binnen);
else myGLCD.setColor (kleur_luchtd); // kleurinstellen voor eerste grafiek
for (tl2=0;tl2<2;tl2++) // eerste grafiek (binnen of luchtd) tekenen
for (tl3=1;tl3<97;tl3++)
myGLCD.drawLine(tl2*96+tl3+59,(200-data[schermtype-1][0][tl2][tl3-1]),tl2*96+tl3+60,(200-data[schermtype-1][0][tl2][tl3])); // Draw a line

if ((schermtype==1)||(schermtype==2))
{
myGLCD.setColor (kleur_buiten);
for (tl2=0;tl2<2;tl2++) // tweede grafiek (buiten) tekenen
for (tl3=1;tl3<97;tl3++)
myGLCD.drawLine(tl2*96+tl3+59,(200-data[schermtype-1][1][tl2][tl3-1]),tl2*96+tl3+60,(200-data[schermtype-1][1][tl2][tl3])); // Draw a line
}

// myGLCD.setColor(kleur_buiten); // kleurinstellen voor grafiek
// for (tl2=0;tl2<2;tl2++)
// for (tl3=0;tl3<97;tl3++)
// myGLCD.drawPixel(tl2*96+tl3+60,(200-data[1][1][tl2][tl3]));
}



void Scherm_num() // Tekent het nummerieke scherm op de LCD
{ // Tekst op middendeel scherm schrijven
myGLCD.setColor(0, 0, 0); // kleur instellen voor cls rechthoek
myGLCD.fillRect(0, 0, 319, 225); // rechthoek kleuren (cls)
myGLCD.setColor(kleur_binnen); // kleurinstellen voor tekst
myGLCD.setBackColor(0, 0, 0); // achtergrondkleur voor tekst instellen
myGLCD.setFont(BigFont); // lettergrootte instellen
myGLCD.print("Binnen", 25, 10,0); // tekst schrijven op scherm
myGLCD.setColor(kleur_buiten); // kleurinstellen voor tekst
myGLCD.print("Buiten", 180, 10,0); // tekst schrijven op scherm
Schrijf_temp(45,40); // temperatuur op scherm schrijven
Schrijf_luchtv(45,100); // luchtvochtigheid op scherm schrijven
Schrijf_luchtd(80,160); // luchtdruk op scherm schrijven
}



void Scherm_temp() // tekent grafiek van temperatuurverloop op scherm
{
myGLCD.setColor(0, 0, 0); // kleur instellen voor cls rechthoek
myGLCD.fillRect(0, 0, 319, 225); // rechthoek kleuren (cls)
myGLCD.setColor(kleur_binnen); // kleurinstellen voor tekst
myGLCD.setBackColor(0, 0, 0); // achtergrondkleur voor tekst instellen
myGLCD.setFont(BigFont); // lettergrootte instellen
myGLCD.print("Binnen", 25, 10,0); // tekst schrijven op scherm
myGLCD.setColor(kleur_buiten); // kleurinstellen voor tekst
myGLCD.print("Buiten", 180, 10,0); // tekst schrijven op scherm
Schrijf_temp(45,40); // temperatuur op scherm schrijven
Teken_grafiek(1); // tekent de grafiek van de temperatuur
}



void Scherm_luchtv() // tekent grafiek van luchtvochtigheid verloop op scherm
{
int tl, tl2, tl3;

myGLCD.setColor(0, 0, 0); // kleur instellen voor cls rechthoek
myGLCD.fillRect(0, 0, 319, 225); // rechthoek kleuren (cls)
myGLCD.setColor(kleur_binnen); // kleurinstellen voor tekst
myGLCD.setBackColor(0, 0, 0); // achtergrondkleur voor tekst instellen
myGLCD.setFont(BigFont); // lettergrootte instellen
myGLCD.print("Binnen", 25, 10,0); // tekst schrijven op scherm
myGLCD.setColor(kleur_buiten); // kleurinstellen voor tekst
myGLCD.print("Buiten", 180, 10,0); // tekst schrijven op scherm
Schrijf_luchtv(45,40); // luchtvochtigheid op scherm schrijven
Teken_grafiek(2); // tekent de grafiek van de luchtvochtigheid
}



void Scherm_luchtd() // tekent grafiek van luchtdruk verloop op scherm
{
myGLCD.setColor(0, 0, 0); // kleur instellen voor cls rechthoek
myGLCD.fillRect(0, 0, 319, 225); // rechthoek kleuren (cls)
myGLCD.setColor(kleur_luchtd); // kleurinstellen voor tekst
myGLCD.setBackColor(0, 0, 0); // achtergrondkleur voor tekst instellen
myGLCD.setFont(BigFont); // lettergrootte instellen
myGLCD.print("luchtdruk", CENTER, 10,0); // tekst schrijven op scherm
Schrijf_luchtd(80,40); // luchtdruk op scherm schrijven
Teken_grafiek(3); // tekent de grafiek van de luchtdruk
}

Terug naar Shields

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten