Arduino TFT dotykový displej, 480x320, problém s programem

Odpovědět
Klimki_
Příspěvky: 6
Registrován: 23 kvě 2019, 17:38
Reputation: 0

Arduino TFT dotykový displej, 480x320, problém s programem

Příspěvek od Klimki_ » 22 zář 2019, 19:01

Ahojte, mám poměrně velký problém s chodem programu. Samotné příkazy mi fungují, udělal jsem si teda projekt, ale zjistil jsem, že určitá fáze programu se vůbec nevykonává. Zkoušel jsem přijít na to, která část to způsobuje a přikládám sem pouze tu část, která dělá problémy




Zjednodušeně:

Kód: Vybrat vše

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv displej;
#include <TouchScreen.h>
#define MINTLAK 200
#define MAXTLAK 1000

// Promenne pro detekci a spravu tlacitek na displeji
int x_dotyk, y_dotyk;                              //=
int x_souradnice, y_souradnice, pomocna;           //=   
byte stisknuto;                                    //=
// ===================================================

const int XP=8,XM=A2,YP=A3,YM=9; //320x480 ID=0x9486
const int TS_LEFT=122,TS_RT=899,TS_TOP=947,TS_BOT=93;

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

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

void setup(void)
{
    Serial.begin(9600);
    uint16_t ID = displej.readID();
   
    if (ID == 0xD3D3) ID = 0x9486; // write-only shield
    
    displej.begin(ID);
    displej.setRotation(1);            //LANDSCAPE

   displej.fillScreen(BLACK);
   

}

[b][u]Toto funguje:[/u][/b]
void loop(void){
displej.fillScreen(MAGENTA);
delay(5000);
displej.fillScreen(BLUE);
delay(5000);
}

[b][u]Nicméně já potřebuju zjistit místo dotyku, což také funguje, ale:[/u][/b]
[b][u]Toto nefunguje:[/u][/b]

void loop(void){
displej.fillScreen(MAGENTA);
delay(5000);
displej.fillScreen(BLUE);
delay(5000);
})

 TSPoint p = ts.getPoint();
  
   if (p.z > MINTLAK && p.z < MAXTLAK){
        x_dotyk = round(map(p.y, 947, 93, 0, 480)); 
        y_dotyk = round(map(p.x, 122, 899, 320, 0));
        [b][u][/u][/b]// Vpohodě zjistím místo dotyku
        
        displej.fillScreen(BLUE); [size=150]// [b]Nevykoná se [/b][/size][b]- displej se chová jako zmražený, vůbec nejde přepisovat obraz[/b]
        delay(350);
   }
     displej.fillScreen(MAGENTA);// [size=150][b]Nevykoná se [/b][/size][b]- displej se chová jako zmražený, vůbec nejde přepisovat obraz[/b]
}
Zkoušel jsem všelijak to předělat, ale bez úspěchu. Děkuju za jakékoliv rady :)

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Arduino TFT dotykový displej, 480x320, problém s programem

Příspěvek od KamilV » 22 zář 2019, 19:20

Dej sem prosím reálný kód, který zkopíruješ a ideálně vložíš do do značek [ code ] (admin: doplnil jsem).
To, co jsi poslal, minimálně nepůjde vůbec zkompilovat, protože tam lítají závorky a středníky jak se jim napadne.
Těžko pak hledat chybu, proč se nějaká část kódu nevykoná, když je nezkompilovatelný.

Klimki_
Příspěvky: 6
Registrován: 23 kvě 2019, 17:38
Reputation: 0

Re: Arduino TFT dotykový displej, 480x320, problém s programem

Příspěvek od Klimki_ » 22 zář 2019, 19:55

Kód: Vybrat vše

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv displej;
#include <TouchScreen.h>
#define MINTLAK 200
#define MAXTLAK 1000



int zadaneHesloPole[8];
byte indexPole = 0;
boolean zadavaniHeslaP;

// Promenne pro detekci a spravu tlacitek na displeji
int x_dotyk, y_dotyk;                              //=
int x_souradnice, y_souradnice, pomocna;           //=   
byte stisknuto;                                    //=
// ===================================================

const int XP=8,XM=A2,YP=A3,YM=9; //320x480 ID=0x9486
const int TS_LEFT=122,TS_RT=899,TS_TOP=947,TS_BOT=93;


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

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF



void setup(void)
{

  
    Serial.begin(9600);
    uint16_t ID = displej.readID();
   
    if (ID == 0xD3D3) ID = 0x9486; // write-only shield
    
    displej.begin(ID);
    displej.setRotation(1);            //LANDSCAPE


   displej.fillScreen(BLACK);
   vrchniPanel();
   zadavaniHesla();
   

}

void loop(void){
 
  if (zadavaniHeslaP){
  TSPoint p = ts.getPoint();
  
   if (p.z > MINTLAK && p.z < MAXTLAK){
        x_dotyk = round(map(p.y, 947, 93, 0, 480)); 
        y_dotyk = round(map(p.x, 122, 899, 320, 0));
        zadaneHeslo();
        
        
        delay(350);
   }
	Serial.println("Cekani na dotyk");
	delay(350);
	
  
 

}}

// Vrchní panel
void vrchniPanel(){
    //displej.fillScreen(MAGENTA);
    displej.fillRect(0, 0, 479, 25, BLACK);
    
    displej.drawLine(0, 26, 479, 26, WHITE);
    displej.drawLine(0, 27, 479, 27, WHITE);
    
    displej.setCursor(65,1);
    displej.setTextColor(CYAN);
    displej.setTextSize(3);

    displej.print("Zabezpecovaci system");
}

void zadavaniHesla(){
zadavaniHeslaP = true;

     displej.fillRoundRect(80, 60, 320, 45, 10, CYAN);
     displej.drawRoundRect(80, 60, 320, 45, 10, YELLOW);
     displej.drawRoundRect(80-1, 60-1, 320+2, 47, 12, YELLOW);
     displej.setCursor(80+24,60+9);
     displej.setTextColor(BLACK);
     displej.setTextSize(4);
     displej.println("Zadej heslo");
     //displej.setCursor(360+12,270+2);
  
     
  
    // Tlacitko 9 - x 250 - 285, y 140 - 185,
    // Tlacitko 8 - x 140 - 185, y 140 - 185,
    // Tlacitko 7 - x 30 - 120, y 140 - 185,
    // Tlacitko 6 - x 250 - 285, y 200 - 245,
    // Tlacitko 5 - x 140 - 185, y 200 - 245,  
    // Tlacitko 4 - x 30 - 120, y 200 - 245,
    // Tlacitko 3 - x 250 - 285, y 260 - 305,
    // Tlacitko 2 - x 140 - 185, y 260 - 305,
    // Tlacitko 1 - x 30 - 120, y 260 - 305,
    
    x_souradnice = 250; 

     // prvni dve cisla jsou souradnice pocatku
     // treti parametr je delka
     // ctvrty sirka
     // paty urcuje zaobleni hran
     // displej.fillRoundRect(x_souradnice-(110*y), y_souradnice;, 90, 45, 10, GREEN);

for (int i = 0; i < 3; i++){
  y_souradnice = 140+(60*i);
  pomocna = 9-(3*i);
  Serial.print("i = ");Serial.println(i);
  for (int y = 0; y < 3; y++){
     Serial.print("y = ");Serial.println(y);
     displej.fillRoundRect(x_souradnice-(110*y), y_souradnice, 90, 45, 10, GREEN);
     displej.drawRoundRect(x_souradnice-(110*y), y_souradnice, 90, 45, 10, YELLOW);
     displej.drawRoundRect((x_souradnice-(110*y))-1, y_souradnice-1, 92, 47, 12, YELLOW);
     displej.setCursor((x_souradnice-(110*y))+36,y_souradnice+10);
     displej.print(pomocna-y); 
  }}

// Tlacitko ENTER - x 360 - 470, y 260 - 305,
     displej.fillRoundRect(360, 260, 110, 45, 10, CYAN);
     displej.drawRoundRect(360, 260, 110, 45, 10, YELLOW);
     displej.drawRoundRect(360-1, 259, 112, 47, 12, YELLOW);
     displej.setCursor(360+12,270+2);
     displej.setTextSize(3);
     displej.print("Enter");

// Tlacitko CLEAR (Smazat posledni cislici) - x 360 - 470, y 140 - 185,
     displej.fillRoundRect(360, 140, 110, 45, 10, RED);
     displej.drawRoundRect(360, 140, 110, 45, 10, YELLOW);
     displej.drawRoundRect(360-1, 140-1, 112, 47, 12, YELLOW);
     displej.setCursor(360+11,150+2);
     displej.print("Clear");        

// Tlacitko X (Smazat posledni cislici) - x 360 - 470, y 200 - 245,
     displej.fillRoundRect(360, 200, 110, 45, 10, MAGENTA);
     displej.drawRoundRect(360, 200, 110, 45, 10, YELLOW);
     displej.drawRoundRect(360-1, 200-1, 112, 47, 12, YELLOW);
     displej.setCursor(360+1,210+4);
     displej.setTextSize(2);
     displej.print("Backspace");
            
}

boolean zadaneHeslo(){
  
for (int i = 0; i < 3; i++){
  y_souradnice = 260 - (60*i); 
  pomocna = 1+(3*i);
   
  for (int y = 0; y < 3; y++){
    x_souradnice = 30+(110*y);
    
    if (x_dotyk > (x_souradnice-1) and x_dotyk < (x_souradnice+111) and y_dotyk > (y_souradnice-1) and y_dotyk < (y_souradnice+46)){
        stisknuto = pomocna + y;
        y = 3;
        i = 3;
        Serial.print("Stisknuto "); Serial.println(stisknuto);
        zobrazitHeslo();}
   
    // Tlacitko ENTER - x 360 - 470, y 260 - 305,
    // Tlacitko CLEAR (Smazat posledni cislici) - x 360 - 470, y 140 - 185,
    // Tlacitko X (Smazat posledni cislici) - x 360 - 470, y 200 - 245,
    if (x_dotyk > 360 and x_dotyk < 470 and y_dotyk > 260 and y_dotyk < 305){
        Serial.println("Stistknuto ENTER");
        delay(500);}
  }}

}

void zobrazitHeslo(){
  zadaneHesloPole[indexPole] = stisknuto;
  // výpis x: 80 - 320, y: 60 - 105 (69 opt)
  for(int i = 0; i < 3; i++)
   //displej.fillScreen(MAGENTA);
   displej.fillRect(0,0,480,320,BLACK);
   Serial.println("Zobrazit heslo");
   displej.fillRoundRect(80, 60, 320, 45, 10, CYAN);
   displej.drawRoundRect(80, 60, 320, 45, 10, YELLOW);
   displej.drawRoundRect(80-1, 60-1, 320+2, 47, 12, YELLOW);
   displej.setCursor(80+24,60+9);
   displej.setTextColor(BLACK);
   displej.setTextSize(4);
   displej.println(stisknuto);
}
    
     
Toto je celý můj kód

Ještě přiložím ten, kde jsem jen zkoušel, co nefunguje:

Kód: Vybrat vše

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv displej;
#include <TouchScreen.h>
#define MINTLAK 200
#define MAXTLAK 1000

boolean zadavaniHeslaP;

// Promenne pro detekci a spravu tlacitek na displeji
int x_dotyk, y_dotyk;                              //=
int x_souradnice, y_souradnice, pomocna;           //=   
byte stisknuto;                                    //=
// ===================================================

const int XP=8,XM=A2,YP=A3,YM=9; //320x480 ID=0x9486
const int TS_LEFT=122,TS_RT=899,TS_TOP=947,TS_BOT=93;

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


#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

#define VRCHNI 0xFFD700


void setup(void)
{

  
    Serial.begin(9600);
    uint16_t ID = displej.readID();
   
    if (ID == 0xD3D3) ID = 0x9486; // write-only shield
    
    displej.begin(ID);
    displej.setRotation(1);            //LANDSCAPE

   displej.fillScreen(BLACK);

   vrchniPanel();
   zadavaniHesla();
   

}

void loop(void){

 
  if (zadavaniHeslaP){
  TSPoint p = ts.getPoint();
  
   if (p.z > MINTLAK && p.z < MAXTLAK){
        x_dotyk = round(map(p.y, 947, 93, 0, 480)); 
        y_dotyk = round(map(p.x, 122, 899, 320, 0));
        tft.fillScreen(BLUE);
        delay(350);
   }
   Serial.println("Cekam na stisk");
   delay(350);
}}


void vrchniPanel(){
    //displej.fillScreen(MAGENTA);
    displej.fillRect(0, 0, 479, 25, BLACK);
    
    displej.drawLine(0, 26, 479, 26, WHITE);
    displej.drawLine(0, 27, 479, 27, WHITE);
    
    displej.setCursor(65,1);
    displej.setTextColor(CYAN);
    displej.setTextSize(3);

    displej.print("Zabezpecovaci system");
}

void zadavaniHesla(){
     displej.fillRoundRect(80, 60, 320, 45, 10, CYAN);
     displej.drawRoundRect(80, 60, 320, 45, 10, YELLOW);
     displej.drawRoundRect(80-1, 60-1, 320+2, 47, 12, YELLOW);
     displej.setCursor(80+24,60+9);
     displej.setTextColor(BLACK);
     displej.setTextSize(4);
     displej.println("Zadej heslo");

  
     
  
    // Tlacitko 9 - x 250 - 285, y 140 - 185,
    // Tlacitko 8 - x 140 - 185, y 140 - 185,
    // Tlacitko 7 - x 30 - 120, y 140 - 185,
    // Tlacitko 6 - x 250 - 285, y 200 - 245,
    // Tlacitko 5 - x 140 - 185, y 200 - 245,  
    // Tlacitko 4 - x 30 - 120, y 200 - 245,
    // Tlacitko 3 - x 250 - 285, y 260 - 305,
    // Tlacitko 2 - x 140 - 185, y 260 - 305,
    // Tlacitko 1 - x 30 - 120, y 260 - 305,

    
    zadavaniHeslaP = true;
    
    x_souradnice = 250; 

     // prvni dve cisla jsou souradnice pocatku
     // treti parametr je delka
     // ctvrty sirka
     // paty urcuje zaobleni hran
     // displej.fillRoundRect(x_souradnice-(110*y), y_souradnice;, 90, 45, 10, GREEN);

for (int i = 0; i < 3; i++){
  y_souradnice = 140+(60*i);
  pomocna = 9-(3*i);
  Serial.print("i = ");Serial.println(i);
  for (int y = 0; y < 3; y++){
     Serial.print("y = ");Serial.println(y);
     displej.fillRoundRect(x_souradnice-(110*y), y_souradnice, 90, 45, 10, GREEN);
     displej.drawRoundRect(x_souradnice-(110*y), y_souradnice, 90, 45, 10, YELLOW);
     displej.drawRoundRect((x_souradnice-(110*y))-1, y_souradnice-1, 92, 47, 12, YELLOW);
     displej.setCursor((x_souradnice-(110*y))+36,y_souradnice+10);
     displej.print(pomocna-y); 
     
     
  }}
// Tlacitko ENTER - x 360 - 470, y 260 - 305,
     displej.fillRoundRect(360, 260, 110, 45, 10, CYAN);
     displej.drawRoundRect(360, 260, 110, 45, 10, YELLOW);
     displej.drawRoundRect(360-1, 259, 112, 47, 12, YELLOW);
     displej.setCursor(360+12,270+2);
     displej.setTextSize(3);
     displej.print("Enter");

// Tlacitko CLEAR (Smazat posledni cislici) - x 360 - 470, y 140 - 185,
     displej.fillRoundRect(360, 140, 110, 45, 10, RED);
     displej.drawRoundRect(360, 140, 110, 45, 10, YELLOW);
     displej.drawRoundRect(360-1, 140-1, 112, 47, 12, YELLOW);
     displej.setCursor(360+11,150+2);
     displej.print("Clear");        

// Tlacitko X (Smazat posledni cislici) - x 360 - 470, y 200 - 245,
     displej.fillRoundRect(360, 200, 110, 45, 10, MAGENTA);
     displej.drawRoundRect(360, 200, 110, 45, 10, YELLOW);
     displej.drawRoundRect(360-1, 200-1, 112, 47, 12, YELLOW);
     displej.setCursor(360+1,210+4);
     displej.setTextSize(2);
     displej.print("Backspace");
            
}

Klimki_
Příspěvky: 6
Registrován: 23 kvě 2019, 17:38
Reputation: 0

Re: Arduino TFT dotykový displej, 480x320, problém s programem

Příspěvek od Klimki_ » 22 zář 2019, 21:27

Ještě dodám, že displej místo provedení příkazu na úpravu obrazu, velmi rychle problikne (bíle)

+ další kód, který nefunguje, zde je velmi zjednodušeně vidět problém. Displej má výchozí barvu, která se nezmění. Detekce dotyku funguje

Kód: Vybrat vše

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv displej;
#include <TouchScreen.h>
#define MINTLAK 250
#define MAXTLAK 1000


// Promenne pro detekci a spravu tlacitek na displeji
int x_dotyk, y_dotyk;                               //=
byte stisknutoP, stiskP;                              //=
int x_souradnice, y_souradnice, pomocna;           //=   
// ===================================================

const int XP=8,XM=A2,YP=A3,YM=9; //320x480 ID=0x9486
const int TS_LEFT=122,TS_RT=899,TS_TOP=947,TS_BOT=93;

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

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

#define VRCHNI 0xFFD700


void setup(void)
{

  
    Serial.begin(9600);
    uint16_t ID = displej.readID();
   
    if (ID == 0xD3D3) ID = 0x9486; // write-only shield
    
    displej.begin(ID);
    displej.setRotation(1);            //LANDSCAPE

    pinMode(YP, OUTPUT);      //restore shared pins
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   //because displej control pins
    digitalWrite(XM, HIGH);

}

void loop(void){
  
bool down = stisknuto();

  if (down){
     Serial.println("Stisknuto");
     displej.fillScreen(BLUE);
     delay(500);
  }
displej.fillScreen(RED);
delay(500);
}

boolean stisknuto(void)
{
    TSPoint p = ts.getPoint();
    bool stisk = (p.z > 300 && p.z < 1000);
    if (stisk) {
        x_dotyk = map(p.y, 947, 93, 0, 480); //.kbv makes sense to me
        y_dotyk = map(p.x, 122, 899, 320, 0);
        Serial.println("Detekovan stisk");
    }
    return stisk;
}
     

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Arduino TFT dotykový displej, 480x320, problém s programem

Příspěvek od ondraN » 21 říj 2019, 07:15

Zkus zvětšit ty delay(500) na delay(5000), možná je to na displej moc rychlé.

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Arduino TFT dotykový displej, 480x320, problém s programem

Příspěvek od KamilV » 21 říj 2019, 09:13

500 ms by mělo být na display v pohodě.
Je zvláštní, že display problikne bíle, když v kódu figuruje jen BLUE a RED.
Jak máš display připojený?

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů