[Conseil] SSD1289 ou ILI9341

Bonjour à toutes et à tous,

J'ai acheté en novembre 2015 chez Selectronic un écran tactile ITEAD 3,2S, je l'utilise avec les librairies Rinky-Dink UTFT et ça fonctionne bien, enfin presque :) car :

Je me pose une question, je ne suis pas certain du circuit utilisé avec cet écran, selon la version 1 ou 2 il peut s'agir d'un SSD1289 ou d'un ILI9341...

Impossible de savoir en regardant le circuit imprimé, pas d'indice sur la version, et la doc représente le même tracé de circuit imprimé en V1 ou en V2...

Bref existe t'il un moyen logiciel avec l'arduino pour savoir à qui j'ai à faire?

Cette question car je n'arrive pas à régler le contraste ni la luminosité de l'écran avec les commandes UTFT, myGLCD.setBrightness(x) et myGLCD.setContrast(y).

De plus je voudrai éteindre l'écran en fonctionnement normal, avec réveil en appuyant sur ce dernier.

Apparemment les led de l'écran sont alimentées directement depuis le +VCC au travers d'une résistance de 100 ohms pas moyen des les "couper".

Par avance merci pour votre aide, et bon week-end !

Amicalement,

J-F

Re bonjour,

Après des recherches mon modèle est équipé d'un SSD1289, car... l'écran équipé d'un ILI9341 va bientôt être vendu par Itead... pour l'instant seul la version 1 est vendue.

Bon reste la question des réglages de luminosité, contraste, et de mise en veille de l'écran.

Amicalement,

J-F

Bonjour,

Je reviens vers vous pour ce problème de contraste et luminosité…

Tout d’abord je tiens à préciser que je suis débutant dans la programmation en C et dans le monde Arduino… d’où ces questions…

J’ai essayé de comprendre un peu, pour cela j’ai regardé la bibliothèque UTFT de Rinky-Dink.

J’ai compris que la déclaration de l’écran est faite dans UFFT.h

#define ITDB32S			2	// SSD1289  (16bit)

Au passage j’ai la réponse à ma question précédente SSD1289 ou ILI9341…

La prochaine fois avant de poster je regarderai :slight_smile:

En suite dans UTFT.cpp deux boucles sont destinées à régler le contraste et la luminosité :

void UTFT::setContrast(char c)
{
	cbi(P_CS, B_CS);
	switch (display_model)
	{
	case PCF8833:
		if (c>64) c=64;
		LCD_Write_COM(0x25);
		LCD_Write_DATA(c);
		break;
	}
	sbi(P_CS, B_CS);
}



void UTFT::setBrightness(byte br)
{
	cbi(P_CS, B_CS);
	switch (display_model)
	{
	case CPLD:
		if (br>16) br=16;
		LCD_Write_COM_DATA(0x01,br);
		LCD_Write_COM(0x0F);   
		break;
	}
	sbi(P_CS, B_CS);
}

J’imagine que ces lignes vont directement programmer des registres du SSD1289, mais j’avoue que la lecture de ces lignes et du datasheet du SSD1289 sont assez hermétiques à mes yeux de profane…

A la lecture je comprends que la valeur de réglage attendue pour le contraste est comprise entre 0 et 64, et 0 à 16 pour la luminosité…

à partir de la page 53 le datasheet aborde le “Gamma Adjustement Function” est-ce de ce coté que ce situe la réponse ?

http://www.gpegint.com/files/library/files/supportpdf/Driver%20IC%20SSD1289.pdf

Pour information voici une partie de mon code :

Quatre boutons + /- permettent les réglages, et les boutons “Annul.” ou “Valid.” confirment ou annule le choix. Les boutons sont crées dans deux autres boucles : plusmoins() et valiannu(), un buzzer, boucle bip() informe l’utilisateur lorsqu’il arrive aux limites.

void Lumi()        //       rLumi et rCont  avec lumi et cont intermédiaires
{
  myGLCD.clrScr();
  myGLCD.setColor(VGA_BLUE);
  myGLCD.fillRect(0, 0, 319,20);   
  myGLCD.setColor(255, 255, 255);         // Blanc
  myGLCD.setFont(SmallFont);
  myGLCD.setBackColor(VGA_TRANSPARENT);   // Fond écriture Transparent
  myGLCD.print("Lumino. / Contrast.", CENTER, 4);
  myGLCD.print("Contraste", CENTER, 55);
  myGLCD.print("Luminosite", CENTER, 125);
 
  myGLCD.drawRect(0, 0, 319, 22);         // Cadre  Blanc autour du Cadre Haut Bleu
  plusmoins();
  myGLCD.setColor(VGA_AQUA);
  valiannu();
  myGLCD.setColor(VGA_AQUA);
  myGLCD.setFont( arial_bold);
  myGLCD.printNumI(rLumi, CENTER, 75);
  myGLCD.printNumI(rCont, CENTER, 143);
  
 
  
  top3 = millis();
  topAttente = top3 + 30000;
  lumi = rLumi; 
  cont = rCont; 
  
  while (topAttente > top3)  
    {if (myTouch.dataAvailable())
       {
          { myTouch.read();
            x = myTouch.getX();
            y = myTouch.getY();
      
            if (((y >= 55) && (y <= 95)) && ((x >= 40) && (x <= 80)))  // Bouton - 
                { 
                lumi = lumi - 1;
                if (lumi < 0)
                {lumi = 0; bip();}
                myGLCD.setBrightness(lumi);
                myGLCD.printNumI(lumi, CENTER, 75);
                delay(w);
                }
            if (((y >= 55) && (y <= 95)) && ((x >= 240) && (x <= 280))) // Bouton + 
                {
                lumi = lumi + 1;               
                if (lumi > 16)                              
                {lumi = 16; bip();}
                myGLCD.setBrightness(lumi);
                myGLCD.printNumI(c, CENTER, 75);
                delay(w);
                }
    
            if (((y >= 125) && (y <= 165)) && ((x >= 40) && (x <= 80))) // Bouton - 
                { 
                cont = cont - 1;
                if (cont < 0)
                {cont = 0; bip();}
                myGLCD.setContrast(cont);
                myGLCD.printNumI(cont, CENTER, 143);
                delay(w);
                }
      
            if (((y >= 125) && (y <= 165)) && ((x >= 240) && (x <= 280))) // Bouton + 
               { 
               cont = cont + 1;
               if (cont > 64)
               {cont = 64; bip();}
               myGLCD.setContrast(cont);
               myGLCD.printNumI(cont, CENTER, 143);
               delay(w);               
               }
      
            if (((y >= 180) && (y <= 230)) && ((x >= 40) && (x <= 140))) // Bouton Validation
               { 
               rLumi = lumi;
               rCont = cont;
               myGLCD.setBrightness(rLumi);
               myGLCD.setContrast(rCont);
               bip();
               topAttente = millis() - 100;
               }
               
            if (((y >= 180) && (y <= 230)) && ((x >= 180) && (x <= 280))) // Bouton Annulation
               {
               bip();  
               topAttente = millis() - 100;
               }   
               
           }
        }
    top3 = millis();
    } // >>>  Fin de la boucle Attente 
  retour();
}  ]

J’ai essayé directement les commandes myGLCD.setBrightness(x); avec x = 0 et puis 16 et
myGLCD.setContrast(y); y = 0 et puis 64 dans mon programme sans utiliser cette boucle, ça ne donne rien.
Idem pour la commande myGLCD.lcdOff.

Ces commandes semblent ne pas fonctionner avec cet écran !

Si vous pouviez m’éclairer un peu :slight_smile:

Par avance merci, bonne semaine à toutes et à tous.

Amicalement,

J-F

Re,

Pour ceux qui suivent ce topic...

J'ai regardé le schéma électronique des cartes boucliers et écran, le rétro-éclairage passe par la broche 19 du connecteur écran, elle est issue du 3,3V et va alimenter les Led au travers d'une résistance, comme je l'ai indiqué précédemment.

A part "couper" ce circuit et le commander par une sortie analogique de l'arduino, je ne vois pas d'autres solutions.

Pour ceux qui connaissent pouvez vous me confirmer que l'extinction de l'écran se fait en envoyant la commande R10h (0001h), tableau 8-1 page 24 du datasheet ?

Voici le code de la librairie UTFT :

void UTFT::lcdOff()
{
    cbi(P_CS, B_CS);
    switch (display_model)
    {
    case PCF8833:
        LCD_Write_COM(0x28);
        break;
    case CPLD:
        LCD_Write_COM_DATA(0x01,0x0000);
        LCD_Write_COM(0x0F);   
        break;
    }
    sbi(P_CS, B_CS);
}

void UTFT::lcdOn()
{
    cbi(P_CS, B_CS);
    switch (display_model)
    {
    case PCF8833:
        LCD_Write_COM(0x29);
        break;
    case CPLD:
        LCD_Write_COM_DATA(0x01,0x0010);
        LCD_Write_COM(0x0F);   
        break;
    }
    sbi(P_CS, B_CS);
}

Faut il que je modifie la ligne LCD_Write_COM.... ?

Si vous avez des idées, vos contributions seront les bienvenues.

Amicalement,

J-F