Go Down

Topic: Arduino Uno + MCUfriend tft touch screen. (Read 787 times) previous topic - next topic

baracuda33

Bonjour à vous les forumeurs.
J'aurais beson d'un coup de main concernant l'utilisation d'un arduino Uno avec un écran pas cher acheté sur aliexpress : https://fr.aliexpress.com/item/UNO-R3-MEGA328P-For-Arduino-2-4-Inch-TFT-Touch-LCD-Screen-Module-For-Arduino-UNO/32550181627.html?spm=a2g0s.9042311.0.0.nG6PuG

Je n'arrive pas à faire marcher celui-ci. J'utilise la librairie Adafruit et rien ne semble marché (j'ai tenté de suivre ce tuto : http://ouilogique.com/2-4-in_TFT_Touch_screen/

Quelqu'un peut il éclairer ma lanterne et m'aider à le mettre en oeuvre svp?

Merci d'avance

hameau

#1
Aug 04, 2017, 11:41 am Last Edit: Aug 04, 2017, 11:54 am by hameau
Salut,

C'est quoi la référence de la puce qui gère le TFT, ?, quelle librairie utilises tu ?.

Sinon passer par ce site pour télécharger la lib TFT

http://www.rinkydinkelectronics.com/library.php?id=51

Mais dans tous les cas, il faut connaitre chipset du TFT

Cdt  

elektrax

photo verso du tft ?
si c'est mcufriend, voir la lib mcufriend_kbv

bon courage

baracuda33

#3
Aug 08, 2017, 07:49 pm Last Edit: Aug 08, 2017, 09:07 pm by baracuda33
Salut merci de ta réponse désolé j'étais en déplacement. Alors durant mon voyage j'ai réussi à avancer un peu mais je me retrouve bloqué. J'utilise la librairie mcufriend_kbv, mais je préférerais URtouch de rinky-dink. En effet des choses ne vont pas :
Impossible de changer la taille de la police.... Ou du moins je n'y arrive pas.
Impossible de forcer l'affichage d'un entier avec 2 digit.... Et la je ne vois pas non plus.

Le chipset c'est un ST7783 que j'ai pu constater en utilisant un programme pour détecter l'écran.


 Si quelqu'un peut jeter un coup d'oeil voici le code pour mes problèmes :
Code: [Select]

#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>
#include <SPI.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;         


#include <TouchScreen.h>
#define YP A1   
#define YM 7   
#define XM A2   
#define XP 6   

UTFTGLUE myGLCD(0x9341, A2, A1, A3, A4, A0);

extern uint8_t BigFont[];
extern uint8_t Grotesk16x32[];
extern uint8_t SixteenSegment16x24[];
extern uint8_t SmallFont[];

#if defined(SmallFont)         //.kbv new GLUE defines FreeSmallFont
#undef SmallFont               //.kbv lose it
#define SmallFont NULL         //.kbv use System Font
#else

//.kbv
#endif
// Assign human-readable names to some common 16-bit color values:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

uint32_t cx, cy;
uint32_t rx[8], ry[8];
int32_t clx, crx, cty, cby;
float px, py;
int dispx, dispy, text_y_center, swapxy;
uint32_t calx, caly, cals;
char buf[13];

#define TOUCH_ORIENTATION  LANDSCAPE

TouchScreen myTouch(XP, YP, XM, YM, 300);
TSPoint tp; 

void readResistiveTouch(void)
{
    tp = myTouch.getPoint();
    pinMode(YP, OUTPUT);     
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   
    digitalWrite(XM, HIGH);
}


bool ISPRESSED(void)
{
    int count = 0;
    bool state, oldstate;
    while (count < 10) {
        readResistiveTouch();
        state = tp.z > 20 && tp.z < 1000;
        if (state == oldstate) count++;
        else count = 0;
        oldstate = state;
        delay(5);
    }
    return oldstate;
}

void drawBoutons(int x, int y)
{
    myGLCD.setColor(0,255,0);
    myGLCD.drawRect(x,y+20,x+40,y-23);
    myGLCD.drawRect(x+60,y+20,x+100,y-23);
    myGLCD.drawLine(x+10,y-2,x+30,y-2);
    myGLCD.drawLine(x+70,y-2,x+90,y-2);
    myGLCD.drawLine(x+20,y+7,x+20,y-10);
}

void startup()
{
    myGLCD.fillScr(0,0,0);
    drawBoutons(200,33);
    drawBoutons(200,83);
    drawBoutons(200,133);
    drawBoutons(200,183); 
}


void setup() {
    digitalWrite(A0, HIGH);
    pinMode(A0, OUTPUT);
    myGLCD.InitLCD(TOUCH_ORIENTATION);
    myGLCD.clrScr();
    dispx = myGLCD.getDisplayXSize();
    dispy = myGLCD.getDisplayYSize();
    startup();
    myGLCD.setColor(255,255,255);
    myGLCD.print("Leve Soleil : ",20,30);
    myGLCD.print(":", 155,30);
    myGLCD.print("Couche Soleil : ",20,80);
    myGLCD.print(":", 155,80);
    myGLCD.print("Leve Lune : ",20,130);
    myGLCD.print(":",155,130);
    myGLCD.print("Couche Lune : ", 20,180);
    myGLCD.print(":", 155,180);
    myGLCD.setColor(255,0,255);
    myGLCD.print("18 : 14",CENTER,220);
    myGLCD.setColor(255,0,255);
}

void loop() {
    long lsh,lsm,csh,csm,llh,llm,clh,clm;
    lsh=17;
    lsm=0;
    csh=22;
    csm=0;
    llh=0;
    llm=0;
    clh=2;
    clm=30;
    myGLCD.printNumI(lsh,140,30, 2, '0');
    myGLCD.printNumI(lsm,170,30, 2, '0');
   
    myGLCD.printNumI(csh,140,80, 2, '0');
    myGLCD.printNumI(csm,170,80, 2, '0');
   
    myGLCD.printNumI(llh,140,130, 2, '0');
    myGLCD.printNumI(llm,170,130, 2, '0');
   
    myGLCD.printNumI(clh,140,180, 2, '0');
    myGLCD.printNumI(clm,170,180, 2, '0');
    while (true) {}
}

elektrax

"Le chipset c'est un ST7783 que j'ai pu constater en utilisant un programme pour détecter l'écran."

UTFTGLUE myGLCD(0x9341, A2, A1, A3, A4, A0);

à premiere vue, ces 2 lignes sont contradictoires


baracuda33

Salut en effet, l'adresse est 0x7781 je crois de mémoire. C'est bizarre quand même du coup que ça marche avec l'adresse indiquée dans le code précédent. Je sais que c'est un ST7783 car j'ai utilisé le code de MCUfriend pour la calibration et voir le modèle de l'écran (et l'adresse).

baracuda33

Néanmoins je n'arrive toujours pas à solder mes 2 problèmes : modifier la police d'écriture et forcer l'affichage d'un entier avec 2 digits :(

hameau

Salut,

Je ne vois pas dans le code la ligne qui permet de changer la police de caractères, la syntaxe est :
 myGLCD.setFont(Grotesk16x32);  ou autre en fonction de la police disponible dans le répertoire utft.

C'est quoi le soucis exact avec affichage entier sur deux digit ?, pourquoi restreindre à 2 digit ?.

@+

baracuda33

#8
Aug 11, 2017, 02:08 pm Last Edit: Aug 11, 2017, 02:14 pm by baracuda33
Salut merci de ta réponse! Lorsque j'utilise :  myGLCD.setFont(Grotesk16x32) cela ne change rien à l'affichage exemple (dans vois setup):
Code: [Select]

#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>
#include <SPI.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;         


#include <TouchScreen.h>
#define YP A1   
#define YM 7   
#define XM A2   
#define XP 6   

UTFTGLUE myGLCD(0x7781, A2, A1, A3, A4, A0);

extern uint8_t BigFont[];
extern uint8_t Grotesk16x32[];
extern uint8_t SixteenSegment16x24[];
extern uint8_t SmallFont[];

#if defined(SmallFont)         //.kbv new GLUE defines FreeSmallFont
#undef SmallFont               //.kbv lose it
#define SmallFont NULL         //.kbv use System Font
#else

//.kbv
#endif
// Assign human-readable names to some common 16-bit color values:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

uint32_t cx, cy;
uint32_t rx[8], ry[8];
int32_t clx, crx, cty, cby;
float px, py;
int dispx, dispy, text_y_center, swapxy;
uint32_t calx, caly, cals;
char buf[13];

#define TOUCH_ORIENTATION  LANDSCAPE

TouchScreen myTouch(XP, YP, XM, YM, 300);
TSPoint tp; 

void readResistiveTouch(void)
{
    tp = myTouch.getPoint();
    pinMode(YP, OUTPUT);     
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   
    digitalWrite(XM, HIGH);
}


bool ISPRESSED(void)
{
    int count = 0;
    bool state, oldstate;
    while (count < 10) {
        readResistiveTouch();
        state = tp.z > 20 && tp.z < 1000;
        if (state == oldstate) count++;
        else count = 0;
        oldstate = state;
        delay(5);
    }
    return oldstate;
}

void drawBoutons(int x, int y)
{
    myGLCD.setColor(0,255,0);
    myGLCD.drawRect(x,y+20,x+40,y-23);
    myGLCD.drawRect(x+60,y+20,x+100,y-23);
    myGLCD.drawLine(x+10,y-2,x+30,y-2);
    myGLCD.drawLine(x+70,y-2,x+90,y-2);
    myGLCD.drawLine(x+20,y+7,x+20,y-10);
}

void startup()
{
    myGLCD.fillScr(0,0,0);
    drawBoutons(200,33);
    drawBoutons(200,83);
    drawBoutons(200,133);
    drawBoutons(200,183); 
}


void setup() {
    digitalWrite(A0, HIGH);
    pinMode(A0, OUTPUT);
    myGLCD.InitLCD(TOUCH_ORIENTATION);
    myGLCD.clrScr();
    dispx = myGLCD.getDisplayXSize();
    dispy = myGLCD.getDisplayYSize();
    startup();
    myGLCD.setColor(255,255,255);
    myGLCD.setFont(Grotesk16x32);
    myGLCD.print("Leve Soleil : ",20,30);
    myGLCD.print(":", 155,30);
    myGLCD.print("Couche Soleil : ",20,80);
    myGLCD.print(":", 155,80);
    myGLCD.print("Leve Lune : ",20,130);
    myGLCD.print(":",155,130);
    myGLCD.print("Couche Lune : ", 20,180);
    myGLCD.print(":", 155,180);
    myGLCD.setColor(255,0,255);
    myGLCD.print("18 : 14",CENTER,220);
    myGLCD.setColor(255,0,255);
}

void loop() {
    long lsh,lsm,csh,csm,llh,llm,clh,clm;
    lsh=17;
    lsm=0;
    csh=22;
    csm=0;
    llh=0;
    llm=0;
    clh=2;
    clm=30;
    myGLCD.printNumI(lsh,140,30, 2, '0');
    myGLCD.printNumI(lsm,170,30, 2, '0');
   
    myGLCD.printNumI(csh,140,80, 2, '0');
    myGLCD.printNumI(csm,170,80, 2, '0');
   
    myGLCD.printNumI(llh,140,130, 2, '0');
    myGLCD.printNumI(llm,170,130, 2, '0');
   
    myGLCD.printNumI(clh,140,180, 2, '0');
    myGLCD.printNumI(clm,170,180, 2, '0');
    while (true) {}
}


Et pour les 2 digit, je récupère les informations d'une RTC, et j'affiche l'heure. Donc quand il est 2h06 je veux qu'il affiche : 02 : 06 et non pas 2 : 6

hameau

#9
Aug 11, 2017, 04:37 pm Last Edit: Aug 11, 2017, 05:53 pm by hameau
Re,

Tu a bien un fichier Grostesk16*32.c dans le répertoire de la librairie du LCD TFT ?, est tu sur que la librairie que tu utilises est bien compatible avec les polices de la Lib rinkydinkelectronics, c'est celle-ci que j'utilise sur tous les LCD TFT et pas de soucis avec les différentes polices.

Concernant le soucis avec les 2 digits , je pense que ce que tu souhaites ne soit pas possible, tu vas devoir faire un peu de code pour teste si valeur <10 alors j'affiche un O et juste à coté la valeur numérique.

Voila
@+


baracuda33

j'ai pas l'impression que je puisse utiliser la librairie rinkydinkelectronics, et je crois que j'utilise la version modifiée mcuFriend et GLUE. Pourtant je souhaiterais utiliser 100% De la librairie URTOUCH mqis je sais pas comment faire avec un ecran comme le mien.

hameau

A tu essayer avec d'autre polices Grostek pour voir si cela fonctionne ou pas ?, le fichier .c de la police se trouve dans quel répertoire ?, tu à télécharger sur quel site le fichier .c de la police ?.

Si cela ne fonctonne pas, c'est qu'il y à un soucis de compatibilité entre driver du TFT et la police, mais je ne vois pas de solution.

Cdt

Go Up