On demarre avec les ecrans TFT

Bonjour à tous,

J’utilise une carte Elegoo :

Et l’afficheur 3.5’’ 480x320pixels Module d’Affichage Ecran Tactile LCD TFT pour Mega2560:

J’essaye en vain de lui faire afficher qque chose.

Pouvez vous m’aider, je galère a fond dans les librairies et je désespère.

Ca merde avec tous les sketch que je trouve

Donc avez vous un debut de sketch qui me permettrait d’ecrire un mot sur l’ecran?

Merci d’avance

"Il peut être facilement contrôlé par ili9481 ili9468, ili9488 hx8357 ou r61581, pratique pour les utilisateurs "

tres pratique en effet de ne pas connaitre le µP embarqué sur le module qu’on achete

avant les croquis il faut installer la ou les bonnes “library”, en supposant que le tft est enfiché correctement.

biblio mcufriend
et l’adafruit <Adafruit_GFX.h>

et tester l’exemple Font_simple.ino ou éventuellement LCD_ID_readreg

Juste à savoir, l'écran est compatible avec la Uno et la Mega, mais la SD n'est compatible qu'avec la Uno. Les broches ne sont pas au même endroit pour une Mega. Quelle que soit la bibliothèque utilisée, l'utilisation de la SD ne fonctionnera pas (en principe les exemples d'affichage de bitmaps).

Par contre l’affichage doit pouvoir se faire.

Merci pour vos reponse.

Oui il est bien connecté , j'ai essayé avec un sketch énorme ( jeu d'echec et ca fonctionne)

Quelques infos complémentaire (si vous arrivez à comprendre)

Read Special Registers on MCUFRIEND UNO shield
controllers either read as single 16-bit
e.g. the ID is at readReg(0)
or as a sequence of 8-bit values
in special locations (first is dummy)

diagnose any controller
reg(0x0000) 00 00 ID: ILI9320, ILI9325, ILI9335, ...
reg(0x0004) 00 54 80 66 Manufacturer ID
reg(0x0009) 00 00 61 00 00 Status Register
reg(0x000A) 00 08 Get Power Mode
reg(0x000C) 00 66 Get Pixel Format
reg(0x0030) 00 00 00 00 00 PTLAR
reg(0x0033) 00 00 00 00 00 00 00 VSCRLDEF
reg(0x0061) 00 00 RDID1 HX8347-G
reg(0x0062) 00 00 RDID2 HX8347-G
reg(0x0063) 00 00 RDID3 HX8347-G
reg(0x0064) 00 00 RDID1 HX8347-A
reg(0x0065) 00 00 RDID2 HX8347-A
reg(0x0066) 00 00 RDID3 HX8347-A
reg(0x0067) 00 00 RDID Himax HX8347-A
reg(0x0070) 00 00 Panel Himax HX8347-A
reg(0x00A1) 00 93 30 93 30 RD_DDB SSD1963
reg(0x00B0) 00 00 RGB Interface Signal Control
reg(0x00B3) 00 00 11 11 11 Frame Memory
reg(0x00B4) 00 00 Frame Mode
reg(0x00B6) 00 02 02 3B 3B Display Control
reg(0x00B7) 00 06 Entry Mode Set
reg(0x00BF) 00 00 00 00 00 00 ILI9481, HX8357-B
reg(0x00C0) 00 0E 0E 0E 0E 0E 0E 0E 0E Panel Control
reg(0x00C1) 00 44 00 00 Display Timing
reg(0x00C5) 00 00 Frame Rate
reg(0x00C8) 00 00 00 00 00 00 00 00 00 00 00 00 00 GAMMA
reg(0x00CC) 00 04 Panel Control
reg(0x00D0) 00 00 00 00 Power Control
reg(0x00D1) 00 00 00 00 VCOM Control
reg(0x00D2) 00 00 00 Power Normal
reg(0x00D3) 00 00 94 86 ILI9341, ILI9488
reg(0x00D4) 00 00 00 00 Novatek
reg(0x00DA) 00 54 RDID1
reg(0x00DB) 00 80 RDID2
reg(0x00DC) 00 66 RDID3
reg(0x00E0) 00 0F 21 1C 0B 0E 08 49 98 38 09 11 03 14 10 00 GAMMA-P
reg(0x00E1) 00 0F 2F 2B 0C 0E 06 47 76 37 07 11 04 23 1E 00 GAMMA-N
reg(0x00EF) 00 80 00 10 60 40 ILI9327
reg(0x00F2) 00 18 A3 12 02 B2 12 FF 10 00 00 00 Adjust Control 2
reg(0x00F6) 00 54 80 66 Interface Control

D'après ce que je vois, le driver serait un ILI9486. Chose surprenante car il n'est pas dans la liste des drivers "pratiques". Avantage, on peut avoir la datasheet de ce driver.
Une chose bizarre, c'est qu'il est dit qu'il se pourrait qu'il y ait un ILI9468, mais je ne vois pas de datasheet correspondant, comme si ce circuit n'existait pas. A moins qu'il y ait un dyslexique chez l'annonceur.

@elektrax, merci i j'ai trouvé dans ton fichier zip, un sketch qui me permet d'écrire.
Donc je vais pouvoir commencer à travailler avec mes ecran

Je reviendrai vers vous pour mon projet perso.

A+
Laurent

vileroi:
D'après ce que je vois, le driver serait un ILI9486. Chose surprenante car il n'est pas dans la liste des drivers "pratiques".

Mais, on voit ceci dans la liste des registres :

reg(0x00EF) 00 80 00 10 60 40 ILI9327

Mais, on voit ceci dans la liste des registres :
Reg(0x00EF) 00 80 00 10 60 40 ILI9327

Dans la ligne
Reg(0x00EF) 00 80 00 10 60 40 ILI9327
les lettres "Reg(0x00EF)" et " ILI9327" sont mis par le programme et les 6 octets au milieu sont les valeurs lues par Arduino en lisant 6 fois après avoir envoyé la demande de lecture du registre 0xEF
Ceci signifie que si on a un ILI9327, en lisant plusieurs fois le registre 0xEF, on va avoir son nom. Si on avait un ILI9327, on aurait:

Reg(0x00EF) 00 00 93 27 XX XX ILI9327

Avec ou 00 00 devant suivant le circuit. XX représente une valeur que je ne connais pas
C'est sur la ligne

reg(0x00D3) 00 00 94 86 ILI9341, ILI9488

que je vois les choses. Avec les circuits ILI9341, ILI9486, ILI9488, on lit sur le registre 0xD3 le n° du circuit. Avec un autre driver, on peut lire n'importe quoi, mais la probabilité pour lire exactement 00 00 94 86 est faible.
C'est pour cela que je dis je suppose et pas je suis certain.

vileroi:
D'après ce que je vois, le driver serait un ILI9486. Chose surprenante car il n'est pas dans la liste des drivers "pratiques". Avantage, on peut avoir la datasheet de ce driver.
Une chose bizarre, c'est qu'il est dit qu'il se pourrait qu'il y ait un ILI9468, mais je ne vois pas de datasheet correspondant, comme si ce circuit n'existait pas. A moins qu'il y ait un dyslexique chez l'annonceur.

faute de frappe de l'annonceur, il y a beaucoup d'annonces tft 3.5" ili9486

Petit up,
Ca avance je maitrise bien l'afficheur et je vais essayer de faire un bouton tactile

On peut mettre des photos sur le forum?

J'essaye

Au moins ça a avancé. Il y a pleins d'écrans incompatibles, mais au niveau du touchpad, il y a peu de variantes. Ce devrait être plus facile.

faute de frappe de l'annonceur

Et dans l'affichage il y a trois fautes à 1 point: il manque l'accent sur des E et c'est pas des fautes de frappes.

le "é" doit être codé, faut que je cherche un peu .
Par contre j'ai trouvé le codage du "°"C

Si vous avez un exemple hyper simple d'un bouton sur le TFT je suis preneur

Lolo

Pour le "é", j'ai pas trouvé. C'est des anglophones qui ont fait Adafruit, et il ne savent même pas ce que veut dire "accent aigu". Du coup la matrice pour les lettres accentuées n'existe pas. C'est une des raisons qui m'a poussé à ecrire moi même mon gestionnaire (qui ne tourne que sur mon écran)

Pour la gestion des boutons sur le TFT, il faut regarder la bibliothèque touchpad. En gros c'est:

  • si on appuie sur le touchpad alors si c'est dans le rectangle qui m'intéresse alors je fait mon action.
    Pour faire des boutons, tu peux t'inspirer de mes pages Mais les codes sont à adapter, car cela ne tourne pas (ou pas encore) sur ton écran.

Encore besoin de vous ! lol

Ce sketch, ci dessous, fonctionne très bien

Mais lorsque je passe de :
tft.setRotation(0); --> à tft.setRotation(1);
tout tourne bien mais les coordonnées de boutons changent (cad il faut que je touche ailleurs dans l'écran (plus sur les boutons on et off) pour changer la couleur du carré

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#define MINPRESSURE 200
#define MAXPRESSURE 1000

const int XP = 6, XM = A2, YP = A1, YM = 7; //ID=0x9341
const int TS_LEFT = 907, TS_RT = 136, TS_TOP = 942, TS_BOT = 139;

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

Adafruit_GFX_Button on_btn, off_btn;

int pixel_x, pixel_y;     //Touch_getXY() updates global vars
bool Touch_getXY(void)
{
  TSPoint p = ts.getPoint();
  pinMode(YP, OUTPUT);      //restore shared pins
  pinMode(XM, OUTPUT);
  digitalWrite(YP, HIGH);   //because TFT control pins
  digitalWrite(XM, HIGH);
  bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
  if (pressed) {
    pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
    pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
  }
  return pressed;
}

#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)
{
  uint16_t ID = tft.readID();
  if (ID == 0xD3D3) ID = 0x9486; // write-only shield
  tft.begin(ID);
  tft.setRotation(0);            //PORTRAIT
  tft.fillScreen(BLACK);
  on_btn.initButton(&tft,  60, 200, 100, 40, WHITE, CYAN, BLACK, "ON", 2);
  off_btn.initButton(&tft, 180, 200, 100, 40, WHITE, CYAN, BLACK, "OFF", 2);
  on_btn.drawButton(false);
  off_btn.drawButton(false);
  tft.fillRect(40, 80, 160, 80, RED);
}

void loop(void)
{
  bool down = Touch_getXY();
  on_btn.press(down && on_btn.contains(pixel_x, pixel_y));
  off_btn.press(down && off_btn.contains(pixel_x, pixel_y));
  if (on_btn.justReleased())
    on_btn.drawButton();
  if (off_btn.justReleased())
    off_btn.drawButton();
  if (on_btn.justPressed()) {
    on_btn.drawButton(true);
    tft.fillRect(40, 80, 160, 80, GREEN);
  }
  if (off_btn.justPressed()) {
    off_btn.drawButton(true);
    tft.fillRect(40, 80, 160, 80, RED);
  }
}

Oui il faut indiquer au touch que l'écran a tourné, il ne peut pas le savoir tout seul. Il doit y avoir une méthode pour ça

EDIT : en fait non, il faut le faire "à la main" dans le code. C'est expliqué ici (in english). Il faut donc que tu saches à tout moment dans quelle orientation (portrait, paysage) tu te trouves, surtout si tu changes pendant l'exécution. Sinon, si l'orientation ne change jamais, il vaut mieux calibrer une fois pour toutes.

Bonsoir

l'écran et la surface tactile sont deux composants distincts superposés
Il faut les gérer tous les deux séparément et en concordance

Un grand merci @lesept, je crois avoir trouvé grace à toi

il fallait remplacer:
pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width() );
pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());

par
pixel_x = map(p.y, TS_TOP, TS_BOT, 0, tft.width());
pixel_y = map(p.x, TS_RT, TS_LEFT, 0, tft.height());

J’ai plus qu’a comprendre les instructions:
void setup(void)
et
void loop(void)

Je vais chercher un peu sur internet

(PS: Je viens de commander un Raspberry 3 pour faire une borne d’arcade :wink: :fearful:)

Laurent

Bonne continuation !