ILI9341 écran tactile ne fonctionne pas

Bonjour depuis plusieurs jours j'essaie de faire fonctionner le côté tactile de mon écran sans succès.
J'ai lu beaucoup mais je ne trouve pas mon cas précis. :confused:

J'ai un écran :

  1. 3.2 pouces TFT_320QVT_9341 320x240
  2. Shield pour arduino mega version v2.2
  3. carte arduino 2560

L'affichage écran fonctionne très bien avec la librairie UTFT :slight_smile:
Mais pour la dalle tactile j'utilise URTouch mais ça ne fonctionne pas correctement.
J'ai commencé avec URTouch > arduino > URTouch_Calibration
Je modifie myGLCD en ILI9341_16 et je téléverse
L'affichage indique les coins et bords pour la calibration qui a l'air de fonctionner et me donne
3 éléments à modifier dans URTouchCD.h
Après cela je fais le test avec URTouch > arduino > URTouch_bonton test
mais là c'est n'importe quoi La touche 1 fonctionne quand j'appuie sur le 3, le 6 sur le 7 et l'effacement
se fait quand j'appuie sur le bord du pavé effacement le reste ne fonctionne pas du tout. :frowning:

Help
IDE version 1.8.10

Tu n'aurais pas un petit problème avec la rotation de l'écran par hasard?
Les libraries graphiques gèrent généralement la rotation de l'écran mais pas les libraries pour la partie tactile.
Ces écrans sont prévus pour fonctionner en mode portrait et lorsqu'on les utilise en mode paysage on est généralement confronté à ce problème.
Pour le vérifier, le plus simple c'est d'écrire un petit bout de code qui envoie les coordonnées du stylet par Serial pour en visualiser les valeurs.

fdufnews oui j'y avais pensé mais je n'avais pas ce problème avec un autre afficheur de type SSD1289.
Mais je peux le tester en réalisant un petit pavé et voir ce qui se passe en mode portrait et paysage.
Je vous tiens au courant.

Merci

Je fais comme tu m'as dit et les résultats sont surprenants

Dans le programme URTouch_Buttons test j'ai rajouter l'affichage dans le moniteur de x et y de x=myTouch.getX(); et y=myTouch.getY();

en mode PORTRAIT et LANDSCAPE même résultats

coin supérieur droit x= -1 y= -1
coin supérieur gauche x= -1 y= -1
coin inférieur droit x= -1 y= 239 ou -1
coin inférieur gauche x= -1 y= -1

centre x= -1 y = 227 ou -1

Je ne comprends pas :frowning:

Pas d’erreur de type sur la valeur affichée?
Sinon , il n’y a rien qui exercerait une pression sur une portion de l’écran (du style écran monté dans un boîtier en ayant coincé un copeau sous l’écran)?

Il n'est pas encore dans un boîtier, mais il est encore avec un film protecteur.
Je l'ai enlevé et découvert que le verre est cassé. J'avais pensé qu'il s'agissais d'une griffe sur le film protecteur. :confused: :confused: :confused:
Je suis vraiment désolé

On ne trouve que des TFT LCD + touch screen avec un driver de type ILI9341
Je vais en racheter un nouveau en espérant que cela fonctionnera avec ce driver
Rassuré moi quelqu'un a déjà réussi à faire fonctionner la partie tactile avec un ILI9341

Je croise les doigts

Merci

bonjour
je confirme que ça marche je l’ai fais il y a 2 ans il me semble
pour ensuite changer d’écran car ajouter un shield intercalaire ça me gonflais.

j’ai donc changer pour un open smart tft shield

l me semble que j’avais du adapter des petits trucs en librairies mais comme j’ai changé de pc …

#define DEBUG_SERIAL //commenter cette ligne pour désactiver tout log 
#define DEBUG_SERIAL_PROG //commenter cette ligne pour désactiver tout log prog

#include <SPI.h>
#include <SdFat.h>
#include <UTFT.h>
#include <URTouch.h>
#include <UTFT_SdRaw.h>
#include "Variables.h"
#include "Horodatage.h"
const String Progversion = "V 0.0.4";


//==== Creating Objects
UTFT    myGLCD(ILI9341_16, 38, 39, 40, 41); // TFT ILI9341_16b);
URTouch  myTouch( 6, 5, 4, 3, 2);
#define SD_CHIP_SELECT  53  // SD chip select pin
// file system object

SdFat SD;
UTFT_SdRaw myFiles(&myGLCD);
File myFile;


#include "Aqua_Affichage.h"

#include "Gestion_Mat.h"

void setup() {
  // Initial setup
  Serial.begin(115200);
  Serial.println(F("Initialising LCD ..."));
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  Serial.println(F("Initialising SD card..."));
  Wire.begin();
  bool mysd = 0;
  // see if the card is present and can be initialized:
  while (!mysd)
  {
    if (!SD.begin(SD_CHIP_SELECT, SPI_FULL_SPEED)) {
      Serial.println(F("Card failed, or not present"));
      Serial.println(F("Retrying...."));
    }
    else
    {
      mysd = 1;
      Serial.println(F("Card initialised."));
    }
  }

  TimeSec = millis();

  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
  // setDS3231time(30,42,21,4,26,11,14);
  
  Serial.println(F("Synchro heure"));
  
  // readDS3231time() 
  
  picsize_x = myGLCD.getDisplayXSize();
  picsize_y = myGLCD.getDisplayYSize();
  
  Serial.println("Ecran " + String(picsize_x) +"X"+ String(picsize_x));
  
  drawVersionScreen();
  delay(100);
  
  Serial.println(F("Initialisation sorties"));
  InitSorties();
  
    #ifdef DEBUG_SERIAL  
    Serial.println(F("Lecture config"));
  #endif 

  
  LireConfigProgramme( );
  
  #ifdef DEBUG_SERIAL  
  Serial.println(F("Affichage page veille"));
  #endif  
 
  PageNouvelle = PageVeille;
  TimeTouch = millis();
  TimeSec = millis();

  Temp1.Tcons = 19.1;
  Temp1.Thplus = 1 ;
  Temp1.Thmoins = 1;
  Temp1.Tmax = 25;
  Temp1.Tmin = 15;

  MemBaseSeconde = true;
  BaseSeconde = true;
  FlagMinute = Minutes;      // lire heure ! avant ....

  Duree = 1000;
  
  #ifdef DEBUG_SERIAL  
  Serial.println("Fin setup");
  #endif  
 
}

le début de ce que j’ai retrouvé

J'ai retrouvé un autre LCD 3.2 320x240 ILI9341 et le test donne ce qui suit :

En mode portrait ou paysage même résultats

coin supérieur gauche x= 4 y = 0
coin supérieur droit x= 5 y = 239
coin inférieur gauche x= 73 y= 0
coin inférieur gauche x= 73 y= 239

centre x= 38 y= 190

Cela est déjà mieux ?

jfs59 je vais regarder ton programme et te tiens au courant
merci

jfs49 j’ai modifié mon programme en rajoutant :

int picsize_x = myGLCD.getDisplayXSize();
int picsize_y = myGLCD.getDisplayYSize();
Serial.println("Ecran " + String(picsize_x) +“X”+ String(picsize_y));

que cela soit en mode PORTRAIT OU LANDSCAPE même indications 320x240

pour le reste je ne vois rien de différent

peux-tu regarder mon programme et voir si c’est ok.
merci

// GLCD + tactile + Carte SD 
#include <memorysaver.h>
#include <UTFT.h> // Display controleur SSD1289  320x240
#include <URTouch.h> // Display Tactile
#include <URTouchCD.h>

UTFT myGLCD(ILI9341_16, 38, 39, 40, 41); // GLCD Controleur SSD1289 16 bits

URTouch  myTouch( 6, 5, 4, 3, 2); 
#define TOUCH_ORIENTATION   LANDSCAPE
//#define TOUCH_ORIENTATION   PORTRAIT 
extern uint8_t SmallFont[]; // 8x12 pix
extern uint8_t BigFont[];  // 16x16 pix 
extern uint8_t SevenSegNumFont[];  // 32x50 pix

extern uint8_t Retro8x16[];
extern uint8_t UbuntuBold[];
extern uint8_t GroteskBold16x32[];
extern uint8_t GroteskBold24x48[];

int x, y; // pour coordonnées zone Touche

// coordonnées pour pavé page0 TCH PLUS
const int x1P=120; // largeur du pavé
const int y1P=190; // hauteur du pavé
const int x2P=165; // largeur du pavé
const int y2P=235; // hauteur du pavé

// Couleurs prédéfinies en 16 bits
#define BLANC   0xFFFF 
#define NOIR    0x0000 
#define GRIS    0x8410 
#define BLEU    0x001F 
#define ROUGE   0xF800 
#define JAUNE   0xFFE0 
#define VERT    0x0400
#define AQUA    0x07FF
#define SILVER  0xC618
#define LIME    0x07E0



void setup() {
   
   Serial.begin(9600);
   randomSeed(analogRead(0));
   

// Setup the LCD
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
     
// Setup the TOUCH    
     myTouch.InitTouch();
     myTouch.setPrecision(PREC_MEDIUM);
myGLCD.clrScr();

int  picsize_x = myGLCD.getDisplayXSize();
int  picsize_y = myGLCD.getDisplayYSize();
  Serial.println("Ecran " + String(picsize_x) +"X"+ String(picsize_y));
drawButtons_Plus();

} // fin du SETUP 

void loop() {
  
  myGLCD.setFont(BigFont);
         if (myTouch.dataAvailable())
                {  myTouch.read();
                Serial.println("z");
                   x=myTouch.getX();
                   y=myTouch.getY();
    // touche PLUS
 /*                          if ((x>=x1P) && (x<=x2P) && (y>=y1P) && (y<=y2P))  
                             {                               
                               //Fonction_PLUS_P0();
                               waitForItP(x1P,y1P,x2P,y2P);
                             }
 */
Serial.print("x : ");
Serial.println(x);
Serial.print("y : ");
Serial.println(y);
                             
                }
  
}


void drawButtons_Plus()  { 

    myGLCD.setColor(ROUGE); // couleur du pavé 
    myGLCD.fillRoundRect (x1P, y1P, x2P, y2P);
    myGLCD.setColor(BLANC); // couleur pour contour du pavé Blanc
    myGLCD.drawRoundRect (x1P, y1P, x2P, y2P);
    myGLCD.setFont(GroteskBold16x32);
    myGLCD.setBackColor(255,0,0); // couleur de fond du texte (255,0,0)
    myGLCD.setColor(BLANC);  // couleur du texte
    myGLCD.print("+",(x1P+14),(y1P+6));
    myGLCD.setBackColor(NOIR); // remettre couleur de fond noir
                   }

void waitForItP(int x1P,int y1P,int x2P,int y2P)
{
  myGLCD.setColor(ROUGE);
  myGLCD.drawRoundRect (x1P, y1P, x2P, y2P);
  int PLUS_repet = 0;
     while (myTouch.dataAvailable()) {
                                         
                                           myGLCD.print("S",100,10);
                                            
      
                                     }
                                     
    myTouch.read();
  myGLCD.setColor(BLANC);
  myGLCD.drawRoundRect (x1P, y1P, x2P, y2P);
}