ecran en ecriture miroir

Bonsoir à tous

j'ai eu un probleme similaire à un autre post (mais le probleme est indépendant du prg)

j'ai acheté un lot de 2 ecrans de tailles différentes (la marque n'est pas marqué dessus, donc je ne suis pas sur, par contre le montage/cablage semble identique)
le meme programme chargé dans un seul arduino uno donne 2 resultat différent

  • 1 ecran donne un bon resultat
  • l'ecran N°2 affiche l'image inversé (il faut un miroir pour lire les infos)

j'imagine donc que l'infos de sens d'écriture doit etre indiquer dans le bibliotheque, et que ce dernier ecran necessite une bibliotheque differente, ca vous semble juste? ou l'ecran a un défaut de montage et est juste à l'envers :slight_smile:
merci

j’imagine donc que l’infos de sens d’écriture doit etre indiquer dans le bibliotheque,

A priori c’est codé en dur, car cela a très peu d’intérêt d’écrire en miroir. Un fonction qui a peu d’intérêt risque de ne pas être accessible. Bien évidemment en modifiant la bibliothèque, on peut changer ce comportement.

et que ce dernier ecran necessite une bibliotheque differente,

Dans un écran, il y a un driver qui est un circuit intégré. Si on donne la bonne configuration, on a un affichage. Si on met n’importe quoi en principe on obtient du blanc (cela n’affiche pas et l’écran vide est transparent, on a donc le rétroéclairage). La plus part des bibliothèques sont basées sur celle d’Adafruit et elle est multi drivers. Pour faire la bonne configuration on lit la référence du driver et on détermine ainsi le code à produire. On peut donc utiliser la même bibliothèque pour deux drivers différents.

Si les écrans sont différents, ils ont forcément des drivers différents. Deux écrans parfaitement identiques (meme marque, même aspect) peuvent avoir des drivers différents.

Si l’écran affiche quelque chose c’est que la bibliothèque reconnait le bon driver et sait le gérer correctement. Une inversion miroir c’est seulement un bit d’un registre qui est inversé. Il est tout à fait possible que l’écran que tu as soit monté dans un sens et que celui qui a écrit la bibliothèque ait un écran avec un driver monté dans l’autre sens. Je ne pense pas que changer de bibliothèque puisse changer l’affichage. Il est plus probable que le fabricant ait inversé le câblage des lignes ou des colonnes. Pour lui, comme pour moi, il n’y a pas de sens obligatoire, vu que la programmation peut afficher dans les deux sens.

Pour s’en sortir, on peut:

  • déterminer quelle est la résolution de l’écran (facile si on peut dessiner un carré ou si on a la pub d’achat)
  • déterminer quel est le driver (cela se fait en demandant la liste des valeurs des registres et en regardant la signature possible en fonction de la résolution
  • changer le bit qui va bien dans la configuration du driver par la bibliothèque

Attendons d’autres avis…

Par contre pour avoir plus de réponses, il faut que tu fournisses au moins la bibliothèque utilisée et l’endroit d’où elle provient. Il y a plusieurs versions de la même et deux sites preuvent proposer des versions différentes

Pour identifier le driver, je crois que le LCD_ID_readreg.ino donné en attaché ci dessous fonctionne bien. Passe la console à 115200 bauds, exécute le programme et poste le résultat

LCD_ID_readreg.ino (6.3 KB)

Salut merci de ta réponse .

j'avais chargé plusieurs librairies préconisé par le vendeur
TouchScreen
SKU706879
Adafruit_TFTLCD
Adafruit_GFX

j'ai utilisé la fonction pour identifier le driver, y quelques différences , mais je ne sais pas exploiter ce tableau

mais les drivers préconisé étaient effectivement différent selon le modèle
celui qui fonctionne:
Téléchargement du pilote ILI9341: files.banggood.com/2017/SKU706879.zip
HX8347 driver download: Click here to open
ILI9340 driver download: Click here to open

celui qui est inversé :
ce driver (en fait ce fichier était juste un programme), mais fonctionnait mal, et je l'avait laissé tomber.
Driver: http://myosuploads3.banggood.com/products/20191212/201912120038082.8-driver-68090uno.rar

Si le premier écran fonctionne, on ne s’en occupe plus pour l’instant. On ne va s’intéresser qu’au deuxième. Si on a besoin de savoir quel est le driver du premier, on cherchera après, mais je doute que la référence puisse te servir à quelque chose.

Le fichier de test ne me donne pas tous les registres qui suffit pour les anciens modèles. Mais il ne donne pas les codes dont j’ai besoin. Deuxième essai, avec la version longue ci-dessous.

// adapted from LCD_ID_Reader from http://misc.ws/lcd_information
// controllers either read as 16-bit or as a sequence of 8-bit values

//-- Arduino UNO or Mega 2560 Plugged as shield
#define LCD_RST A4
#define LCD_CS A3
#define LCD_RS A2
#define LCD_WR A1
#define LCD_RD A0

#define LCD_D0 8
#define LCD_D1 9
#define LCD_D2 2
#define LCD_D3 3
#define LCD_D4 4
#define LCD_D5 5
#define LCD_D6 6
#define LCD_D7 7

void setup()
{
    Serial.begin(9600);
    while (!Serial) ;
    Serial.println("Read Registers on MCUFRIEND UNO shield");
    Serial.println("controllers either read as single 16-bit");
    Serial.println("e.g. the ID is at readReg(0)");
    Serial.println("or as a sequence of 8-bit values");
    Serial.println("in special locations (first is dummy)");
    Serial.println("");
    lcdInit();
    lcdReset();      //ensures that controller is in default state
    for (uint16_t i = 0; i < 256; i++) readReg(i, 7, "f.k"); 

}

void loop() 
{
    // put your main code here, to run repeatedly:

}

void printhex(uint8_t val)
{
    if (val < 0x10) Serial.print("0");
    Serial.print(val, HEX);
}

void readReg(uint16_t reg, uint8_t n, const char *msg)
{
    uint8_t val8;
    lcdReset();
    lcdSetWriteDir();
    lcdWriteCommand(0xB0);     //Command Access Protect
    lcdWriteData(0x00);        //looks wrong
    lcdWriteCommand(reg);
    Serial.print("reg(0x");
    printhex(reg >> 8);
    printhex(reg);
    Serial.print(")");
    lcdSetReadDir();
    while (n--) {
        val8 = lcdReadData8();
        Serial.print(" ");
        printhex(val8);
    }
    lcdSetWriteDir();
    Serial.print("\t");
    Serial.println(msg);
}

void lcdInit()
{
    pinMode(LCD_CS, OUTPUT);
    digitalWrite(LCD_CS, HIGH);
    pinMode(LCD_RS, OUTPUT);
    digitalWrite(LCD_RS, HIGH);
    pinMode(LCD_WR, OUTPUT);
    digitalWrite(LCD_WR, HIGH);
    pinMode(LCD_RD, OUTPUT);
    digitalWrite(LCD_RD, HIGH);
    pinMode(LCD_RST, OUTPUT);
    digitalWrite(LCD_RST, HIGH);
}

void lcdReset()
{
    digitalWrite(LCD_RST, LOW);
    delay(2);
    digitalWrite(LCD_RST, HIGH);
    delay(10);             //allow controller to re-start
}

void lcdWrite8(uint16_t data)
{
    digitalWrite(LCD_D0, data & 1);
    digitalWrite(LCD_D1, (data & 2) >> 1);
    digitalWrite(LCD_D2, (data & 4) >> 2);
    digitalWrite(LCD_D3, (data & 8) >> 3);
    digitalWrite(LCD_D4, (data & 16) >> 4);
    digitalWrite(LCD_D5, (data & 32) >> 5);
    digitalWrite(LCD_D6, (data & 64) >> 6);
    digitalWrite(LCD_D7, (data & 128) >> 7);
}

uint16_t lcdRead8()
{
    uint16_t result = digitalRead(LCD_D7);
    result <<= 1;
    result |= digitalRead(LCD_D6);
    result <<= 1;
    result |= digitalRead(LCD_D5);
    result <<= 1;
    result |= digitalRead(LCD_D4);
    result <<= 1;
    result |= digitalRead(LCD_D3);
    result <<= 1;
    result |= digitalRead(LCD_D2);
    result <<= 1;
    result |= digitalRead(LCD_D1);
    result <<= 1;
    result |= digitalRead(LCD_D0);

    return result;
}

void lcdSetWriteDir()
{
    pinMode(LCD_D0, OUTPUT);
    pinMode(LCD_D1, OUTPUT);
    pinMode(LCD_D2, OUTPUT);
    pinMode(LCD_D3, OUTPUT);
    pinMode(LCD_D4, OUTPUT);
    pinMode(LCD_D5, OUTPUT);
    pinMode(LCD_D6, OUTPUT);
    pinMode(LCD_D7, OUTPUT);
}


void lcdSetReadDir()
{
    pinMode(LCD_D0, INPUT);
    pinMode(LCD_D1, INPUT);
    pinMode(LCD_D2, INPUT);
    pinMode(LCD_D3, INPUT);
    pinMode(LCD_D4, INPUT);
    pinMode(LCD_D5, INPUT);
    pinMode(LCD_D6, INPUT);
    pinMode(LCD_D7, INPUT);
}

void lcdWriteData(uint16_t data)
{
    lcdSetWriteDir();
    digitalWrite(LCD_CS, LOW);
    digitalWrite(LCD_RS, HIGH);
    digitalWrite(LCD_RD, HIGH);
    digitalWrite(LCD_WR, HIGH);

    lcdWrite8(data >> 8);

    digitalWrite(LCD_WR, LOW);
    delayMicroseconds(10);
    digitalWrite(LCD_WR, HIGH);

    lcdWrite8(data);

    digitalWrite(LCD_WR, LOW);
    delayMicroseconds(10);
    digitalWrite(LCD_WR, HIGH);

    digitalWrite(LCD_CS, HIGH);
}

void lcdWriteCommand(uint16_t command)
{
    lcdSetWriteDir();
    digitalWrite(LCD_CS, LOW);
    digitalWrite(LCD_RS, LOW);
    digitalWrite(LCD_RD, HIGH);
    digitalWrite(LCD_WR, HIGH);
    lcdWrite8(command >> 8);
    digitalWrite(LCD_WR, LOW);
    delayMicroseconds(10);
    digitalWrite(LCD_WR, HIGH);
    lcdWrite8(command);
    digitalWrite(LCD_WR, LOW);
    delayMicroseconds(10);
    digitalWrite(LCD_WR, HIGH);
    digitalWrite(LCD_CS, HIGH);
}

uint8_t lcdReadData8()
{
    uint8_t result;
    lcdSetReadDir();
    digitalWrite(LCD_CS, LOW);
    digitalWrite(LCD_RS, HIGH);
    digitalWrite(LCD_RD, HIGH);
    digitalWrite(LCD_WR, HIGH);

    digitalWrite(LCD_RD, LOW);
    delayMicroseconds(10);
    result = lcdRead8();
    digitalWrite(LCD_RD, HIGH);

    delayMicroseconds(10);

    return result;
}


uint16_t lcdReadData16()
{
    uint16_t result;
    result = lcdReadData8() << 8;
    result |= lcdReadData8();
    return result;
}


void lcdWriteRegister(uint16_t addr, uint16_t data)
{
    lcdWriteCommand(addr);
    lcdWriteData(data);
}

Pour le résultat, fais plutôt un couper coller, colle le résultat entre balise code, et si le message dépasse les 9000 caractères, passe alors en fichier joint.

Il doit y avoir un "comutateur" a configurer dans un des écrans. Ce n'est pas une écriture en miroir c'est une écriture pour les langues d'origine du "Moyen Orient".

c'est une écriture pour les langues d'origine du "Moyen Orient".

Ou pour les gens qui écrivent bien de la gauche vers la droite mais qui ont la tête en bas du fait de leur résidence en hémisphère sud

1.JPG

1.JPG

La bibliothèque adafruit_gfx dispose d’une méthode

 void invertDisplay(bool i);

Si c’est celle que tu utilises, ça vaut le coup de tester.

lesept:
La bibliothèque adafruit_gfx dispose d'une méthode

 void invertDisplay(bool i);

Si c'est celle que tu utilises, ça vaut le coup de tester.

bonjour lesept
j'ai aussi eu le meme probleme , j'avais acheté qq lots uno + 2 tft 2.4 et 2.6 pouces
celui qui me posait probleme etait le 2.4" (pcb rouge)
Je dois en avoir pas loin , si j'ai 5 minutes je ferais un essai

Certaines bibliothèques ont des paramètres pour contrôler la direction d'affichage.
Par exemple, si l'écran est du type ST77xx la bibliothèque ad-hoc de Adafruit définit les paramètres

#define ST77XX_MADCTL_MY 0x80
#define ST77XX_MADCTL_MX 0x40

Je pense que MX signifie Mirror X. Par contre je ne sais quelle valeur mettre... Il faut tester avec les valeurs indiqués ici

vileroi:
Si le premier écran fonctionne, on ne s’en occupe plus pour l’instant. On ne va s’intéresser qu’au deuxième. Si on a besoin de savoir quel est le driver du premier, on cherchera après, mais je doute que la référence puisse te servir à quelque chose.

Le fichier de test ne me donne pas tous les registres qui suffit pour les anciens modèles. Mais il ne donne pas les codes dont j’ai besoin. Deuxième essai, avec la version longue ci-dessous.

// adapted from LCD_ID_Reader from http://misc.ws/lcd_information

// controllers either read as 16-bit or as a sequence of 8-bit values

//-- Arduino UNO or Mega 2560 Plugged as shield
#define LCD_RST A4
#define LCD_CS A3
#define LCD_RS A2
#define LCD_WR A1
#define LCD_RD A0

#define LCD_D0 8
#define LCD_D1 9
#define LCD_D2 2
#define LCD_D3 3
#define LCD_D4 4
#define LCD_D5 5
#define LCD_D6 6
#define LCD_D7 7

void setup()
{
   Serial.begin(9600);
   while (!Serial) ;
   Serial.println(“Read Registers on MCUFRIEND UNO shield”);
   Serial.println(“controllers either read as single 16-bit”);
   Serial.println(“e.g. the ID is at readReg(0)”);
   Serial.println(“or as a sequence of 8-bit values”);
   Serial.println(“in special locations (first is dummy)”);
   Serial.println("");
   lcdInit();
   lcdReset();      //ensures that controller is in default state
   for (uint16_t i = 0; i < 256; i++) readReg(i, 7, “f.k”);

}

void loop()
{
   // put your main code here, to run repeatedly:

}

void printhex(uint8_t val)
{
   if (val < 0x10) Serial.print(“0”);
   Serial.print(val, HEX);
}

void readReg(uint16_t reg, uint8_t n, const char *msg)
{
   uint8_t val8;
   lcdReset();
   lcdSetWriteDir();
   lcdWriteCommand(0xB0);     //Command Access Protect
   lcdWriteData(0x00);        //looks wrong
   lcdWriteCommand(reg);
   Serial.print(“reg(0x”);
   printhex(reg >> 8);
   printhex(reg);
   Serial.print(")");
   lcdSetReadDir();
   while (n–) {
       val8 = lcdReadData8();
       Serial.print(" “);
       printhex(val8);
   }
   lcdSetWriteDir();
   Serial.print(”\t");
   Serial.println(msg);
}

void lcdInit()
{
   pinMode(LCD_CS, OUTPUT);
   digitalWrite(LCD_CS, HIGH);
   pinMode(LCD_RS, OUTPUT);
   digitalWrite(LCD_RS, HIGH);
   pinMode(LCD_WR, OUTPUT);
   digitalWrite(LCD_WR, HIGH);
   pinMode(LCD_RD, OUTPUT);
   digitalWrite(LCD_RD, HIGH);
   pinMode(LCD_RST, OUTPUT);
   digitalWrite(LCD_RST, HIGH);
}

void lcdReset()
{
   digitalWrite(LCD_RST, LOW);
   delay(2);
   digitalWrite(LCD_RST, HIGH);
   delay(10);             //allow controller to re-start
}

void lcdWrite8(uint16_t data)
{
   digitalWrite(LCD_D0, data & 1);
   digitalWrite(LCD_D1, (data & 2) >> 1);
   digitalWrite(LCD_D2, (data & 4) >> 2);
   digitalWrite(LCD_D3, (data & 8) >> 3);
   digitalWrite(LCD_D4, (data & 16) >> 4);
   digitalWrite(LCD_D5, (data & 32) >> 5);
   digitalWrite(LCD_D6, (data & 64) >> 6);
   digitalWrite(LCD_D7, (data & 128) >> 7);
}

uint16_t lcdRead8()
{
   uint16_t result = digitalRead(LCD_D7);
   result <<= 1;
   result |= digitalRead(LCD_D6);
   result <<= 1;
   result |= digitalRead(LCD_D5);
   result <<= 1;
   result |= digitalRead(LCD_D4);
   result <<= 1;
   result |= digitalRead(LCD_D3);
   result <<= 1;
   result |= digitalRead(LCD_D2);
   result <<= 1;
   result |= digitalRead(LCD_D1);
   result <<= 1;
   result |= digitalRead(LCD_D0);

return result;
}

void lcdSetWriteDir()
{
   pinMode(LCD_D0, OUTPUT);
   pinMode(LCD_D1, OUTPUT);
   pinMode(LCD_D2, OUTPUT);
   pinMode(LCD_D3, OUTPUT);
   pinMode(LCD_D4, OUTPUT);
   pinMode(LCD_D5, OUTPUT);
   pinMode(LCD_D6, OUTPUT);
   pinMode(LCD_D7, OUTPUT);
}

void lcdSetReadDir()
{
   pinMode(LCD_D0, INPUT);
   pinMode(LCD_D1, INPUT);
   pinMode(LCD_D2, INPUT);
   pinMode(LCD_D3, INPUT);
   pinMode(LCD_D4, INPUT);
   pinMode(LCD_D5, INPUT);
   pinMode(LCD_D6, INPUT);
   pinMode(LCD_D7, INPUT);
}

void lcdWriteData(uint16_t data)
{
   lcdSetWriteDir();
   digitalWrite(LCD_CS, LOW);
   digitalWrite(LCD_RS, HIGH);
   digitalWrite(LCD_RD, HIGH);
   digitalWrite(LCD_WR, HIGH);

lcdWrite8(data >> 8);

digitalWrite(LCD_WR, LOW);
   delayMicroseconds(10);
   digitalWrite(LCD_WR, HIGH);

lcdWrite8(data);

digitalWrite(LCD_WR, LOW);
   delayMicroseconds(10);
   digitalWrite(LCD_WR, HIGH);

digitalWrite(LCD_CS, HIGH);
}

void lcdWriteCommand(uint16_t command)
{
   lcdSetWriteDir();
   digitalWrite(LCD_CS, LOW);
   digitalWrite(LCD_RS, LOW);
   digitalWrite(LCD_RD, HIGH);
   digitalWrite(LCD_WR, HIGH);
   lcdWrite8(command >> 8);
   digitalWrite(LCD_WR, LOW);
   delayMicroseconds(10);
   digitalWrite(LCD_WR, HIGH);
   lcdWrite8(command);
   digitalWrite(LCD_WR, LOW);
   delayMicroseconds(10);
   digitalWrite(LCD_WR, HIGH);
   digitalWrite(LCD_CS, HIGH);
}

uint8_t lcdReadData8()
{
   uint8_t result;
   lcdSetReadDir();
   digitalWrite(LCD_CS, LOW);
   digitalWrite(LCD_RS, HIGH);
   digitalWrite(LCD_RD, HIGH);
   digitalWrite(LCD_WR, HIGH);

digitalWrite(LCD_RD, LOW);
   delayMicroseconds(10);
   result = lcdRead8();
   digitalWrite(LCD_RD, HIGH);

delayMicroseconds(10);

return result;
}

uint16_t lcdReadData16()
{
   uint16_t result;
   result = lcdReadData8() << 8;
   result |= lcdReadData8();
   return result;
}

void lcdWriteRegister(uint16_t addr, uint16_t data)
{
   lcdWriteCommand(addr);
   lcdWriteData(data);
}





Pour le résultat, fais plutôt un couper coller, colle le résultat entre balise code, et si le message dépasse les 9000 caractères, passe alors en fichier joint.

Salut
merci beaucoup de ton aide
l’ecran reste blanc, et j’ai le message ci-dessous

le fichier:

resultat moniteur serie.txt (9.68 KB)

Artouste:
bonjour lesept
j'ai aussi eu le meme probleme , j'avais acheté qq lots uno + 2 tft 2.4 et 2.6 pouces
celui qui me posait probleme etait le 2.4" (pcb rouge)
Je dois en avoir pas loin , si j'ai 5 minutes je ferais un essai

merci de ton retour
j'ai essayé, mais ca n'a rein changé sur les 2 ecrans
entre-temps, j'ai recu mon NEXTION, je sens que je vais ranger les anciens :slight_smile:

Artouste:
bonjour lesept
j'ai aussi eu le meme probleme , j'avais acheté qq lots uno + 2 tft 2.4 et 2.6 pouces
celui qui me posait probleme etait le 2.4" (pcb rouge)
Je dois en avoir pas loin , si j'ai 5 minutes je ferais un essai

Je viens de faire l'essai et çà ne change rien
à l'époque j’avais fait qq recherche sur ce probleme connu et je n'avais rien trouvé de probant (fork ou autres)
çà avais fini dans mes boites à grouilles

Il doit s'agir d'un ILI9340, mais il y a des choses bizares. Peux-tu me donner la bibliothèque avec laquelle cela affiche en sen inverse? je vais voir si on peut inverser l'écran.

vileroi:
Il doit s'agir d'un ILI9340, mais il y a des choses bizares. Peux-tu me donner la bibliothèque avec laquelle cela affiche en sen inverse? je vais voir si on peut inverser l'écran.

merci beaucoup de ton aide, mais je vais me concentrer sur le NEXTION que j'ai recu
leur logiciel simplifie beaucoup l'utilisation de l'ecran , ainsi que de l'utilisation en tactile
merci

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.