[Résolu]Problème avec TFT LCD 2.8" et arduino MEGA

Bonjour, petite présentation, je suis débutant en arduino, bien que j’ai fait de la programmation auparavant (c, c++, java, c#). J’aimerais faire un clavier sur un écran tactile elegoo TFT LCD 2.8" couplé à un ATMEGA 2560. Je n’ai aucun problème quand à l’affichage des “boutons” mais lorsque que j’essaie d’appuyer sur un chiffre le tactile ne répond pas ou du tout du moins répond mal (d’autres chiffres sont sélectionnés, s’il y a sélection). J’ai cherché sur de nombreux sites, trouvés beaucoup d’infos intéressante, mais aucune ne me convient (bibliothèques différentes et non compatibles avec mon matériel pour les 90%). J’aurais aimé avoir vos conseils sur mon code (bien qu’il soit un peu brouillon et un peu rentre dedans …) afin de l’améliorer et surtout comprendre pourquoi ce décalage entre l’affichage et le tactile. Ci-dessous le code, en vous remerciant d’avance pour le regard que vous y jetterez.

//Ecran
#include <TouchScreen.h>
#include <Elegoo_TFTLCD.h>
#include <pin_magic.h>
#include <registers.h>
#include <Elegoo_GFX.h>
//Analog pins for screen
#define LCD_RESET A4
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
//Screen calibration
#define TS_MINX 109
#define TS_MINY 138
#define TS_MAXX 934
#define TS_MAXY 914
//Pins to activate the screen
#define YP A3
#define XM A2
#define YM 9
#define XP 8
Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
//Touchscreen variables
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 364);
#define MINPRESSURE 10
#define MAXPRESSURE 1000
boolean pressure = false;
//Colors
#define BLACK 0x0000
#define DARKBLUE 0x1111
#define DARKGREEN 0x2222
#define BLUE 0x3333
#define GREEN 0x4444
#define LIGHTBLUE 0x5555
#define LIGHTGREEN 0x6666
#define CYAN 0x7777
#define MAGENTA 0x8888
#define PURPLE 0x9999
#define CARDINALRED 0xAAAA
#define LIGHTBROWN 0xCCCC
#define LIGHTPURPLE 0xDDDD
#define GOLD 0xEEEE
#define WHITE 0xFFFF
byte  xs[6];
  byte ys [8];
  String tmp;
void setup() {
  
  tft.reset();
  tft.begin(0x9341);
  tft.setRotation(1);
  byte cpt = 1, y = 10;
  tft.fillScreen(DARKBLUE);
  tft.setTextSize(3);
  for (byte ligne = 0; ligne<4;ligne++){
    byte x = 10;
    
    for(byte colonne = 0; colonne < 3; colonne ++){
      xs[colonne*2]=x;
      xs[colonne*2+1]=x+50;
      tft.drawRect(x,y,50,50,BLACK);
      tft.setCursor(x+17, y+15);
      switch(cpt){
        case 10 : tft.print("C");
        break;
        case 11 : tft.print(0);
        break;
        case 12 : tft.print("V");
        break;
        default: tft.print(cpt);
        break;
        
      }
      ys[ligne*2]=y;
      ys[ligne*2+1]=y+50;
      x = x +55;
      cpt++;
    }
    
    y = y +55;
  }
  Serial.begin(9600);
  Serial.println("XS");
  for (int cpt = 0; cpt<6; cpt++){
    Serial.println(xs[cpt]);
  }
  Serial.println("===");
  Serial.println("YS");
  for(int cpt = 0; cpt<8; cpt++){
    Serial.println(ys[cpt]);
  }
}

void loop() {

   digitalWrite(13, HIGH);
    TSPoint p = ts.getPoint();
    digitalWrite(13, LOW);
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
    //Check pressure
    if(p.z>MINPRESSURE && p.z<MAXPRESSURE){
      p.x = map(p.x, TS_MINX, TS_MAXX,tft.width(), 0);
      p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);
      pressure = true;
    }
    if(pressure == true){
      if(p.y>ys[0] && p.y<ys[1]){
        if(p.x>xs[0] && p.x<xs[1]){tmp+="1";}
        if(p.x>xs[2] && p.x<xs[3]){tmp+="2";}
        if(p.x>xs[4] && p.x<xs[5]){tmp+="3";}
      }
      if(p.y>ys[2] && p.y<ys[3]){
        if(p.x>xs[0] && p.x<xs[1]){tmp+="4";}
        if(p.x>xs[2] && p.x<xs[3]){tmp+="5";}
        if(p.x>xs[4] && p.x<xs[5]){tmp+="6";}
      }
      if(p.y>ys[4] && p.y<ys[5]){
        if(p.x>xs[0] && p.x<xs[1]){tmp+="7";}
        if(p.x>xs[2] && p.x<xs[3]){tmp+="8";}
        if(p.x>xs[4] && p.x<xs[5]){tmp+="9";}
      }
      if(p.y>ys[6] && p.y<ys[7]){
        if(p.x>xs[0] && p.x<xs[1]){tmp="";}
        if(p.x>xs[2] && p.x<xs[3]){tmp+="0";}
        if(p.x>xs[4] && p.x<xs[5]){}
      }
    }
    tft.setCursor(200, 120);
    tft.print(tmp);
}

Bonjour,

Pour debugger affiches les coordonnées lues sur le moniteur série.

Après avoir modifier quelques peu le code (ajout de la position lorsque je touche), j'obtiens en appuyant sur 1 2 3 4 5 6 7 8 9 0 dans l'ordre :

XS
10
60
65
115
120
170
===
YS
10
60
65
115
120
170
175
225
Touche : x = 60 y = 30
Touche : x = 60 y = 29
Touche : x = 60 y = 29
Touche : x = 60 y = 29
Touche : x = 53 y = 83
Touche : x = 55 y = 83
Touche : x = 53 y = 121
Touche : x = 123 y = 35
Touche : x = 127 y = 34
Touche : x = 127 y = 118
Touche : x = 207 y = 74
Touche : x = 269 y = 75

Il faut que tu vérifies que tes coordonnées sont bien à l'intérieur des coordonnées des tableaux. En tout cas ça ne semble pas être le cas pour la première touche.

Après quelques modifications, j'ai un résultat que convient mieux, même si le fonctionnement n'est pas encore au top(la moitié des boutons reconnus se retrouvent entre deux lignes affichées...). Je vais rechercher des informations complémentaires sur la fonction map, j'avoue que je ne la comprends pas trop...En tout cas merci, tu m'as permis de voir deux trucs sur le débogage :slight_smile:

Problème résolu, je te remercies encore pour le débogage, j'ai confondu les x et les y c'est de là que venait tout mes soucis...