Nouveau Font?

Je travail sur un projet que je suis en train d’optimiser.
Le problème plus gros est l’effet blinking que j’ai sur l’affichage de la vitesse car j’utilise comme font le joli “FreeSevenSegNumFont” en size = 3 donc assez gros!! Le tout rafraîchi toutes le 2 sec.
J’ai donc réfléchie comme réduire cet effet.
J’ai élaboré ça:

#include <SPI.h>          /
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
//#include <FreeDefaultFonts.h>


// 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
int l = 40, h = 40, posx = 100, posy = 50;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  tft.begin(0x9486);
  tft.setRotation(1);
  tft.fillScreen(BLACK);
  //tft.setTextColor(WHITE, BLACK);
}

void loop() {
  char a = "";
  // put your main code here, to run repeatedly:
  if (Serial.available() > 0)
  {
    Cancella();
    a = Serial.read();
    Serial.println(a);
  }
  if (a == '0')
  {
    Orizzontale(posx + 1, posy + h + h - 8);
    Verticale(posx, posy + h - 4);
    Verticale(posx + l + 8, posy + h - 4);
    //Orizzontale(posx+1, posy + h - 4);
    Verticale(posx, posy);
    Verticale(posx + l + 8, posy);
    Orizzontale(posx + 1, posy);
  }
  if (a == '1')
  {
    Serial.println(a);
    //Orizzontale(posx+1, posy + h + h-8);
    //Verticale(posx, posy + h-4);
    Verticale(posx + l + 8, posy + h - 4);
    //Orizzontale(posx+1, posy + h - 4);
    //Verticale(posx, posy);
    Verticale(posx + l + 8, posy);
    //Orizzontale(posx+1, posy);
  }
  if (a == '2')
  {
    Serial.println(a);
    Orizzontale(posx + 1, posy + h + h - 8);
    Verticale(posx, posy + h - 4);
    //Verticale(posx + l+8, posy + h-4);
    Orizzontale(posx + 1, posy + h - 4);
    //Verticale(posx, posy);
    Verticale(posx + l + 8, posy);
    Orizzontale(posx + 1, posy);
  }
  if (a == '3')
  {
    Serial.println(a);
    Orizzontale(posx + 1, posy + h + h - 8);
    //Verticale(posx, posy + h-4);
    Verticale(posx + l + 8, posy + h - 4);
    Orizzontale(posx + 1, posy + h - 4);
    //Verticale(posx, posy);
    Verticale(posx + l + 8, posy);
    Orizzontale(posx + 1, posy);
  }
  if (a == '4')
  {
    Serial.println(a);
    //Orizzontale(posx+1, posy + h + h-8);
    //Verticale(posx, posy + h-4);
    Verticale(posx + l + 8, posy + h - 4);
    Orizzontale(posx + 1, posy + h - 4);
    Verticale(posx, posy);
    Verticale(posx + l + 8, posy);
    //Orizzontale(posx+1, posy);
  }
  if (a == '5')
  {
    Serial.println(a);
    Orizzontale(posx + 1, posy + h + h - 8);
    //Verticale(posx, posy + h-4);
    Verticale(posx + l + 8, posy + h - 4);
    Orizzontale(posx + 1, posy + h - 4);
    Verticale(posx, posy);
    //Verticale(posx + l+8, posy);
    Orizzontale(posx + 1, posy);
  }
  if (a == '6')
  {
    Serial.println(a);
    Orizzontale(posx + 1, posy + h + h - 8);
    Verticale(posx, posy + h - 4);
    Verticale(posx + l + 8, posy + h - 4);
    Orizzontale(posx + 1, posy + h - 4);
    Verticale(posx, posy);
    //Verticale(posx + l+8, posy);
    Orizzontale(posx + 1, posy);
  }
  if (a == '7')
  {
    Serial.println(a);
    //Orizzontale(posx+1, posy + h + h-8);
    //Verticale(posx, posy + h-4);
    Verticale(posx + l + 8, posy + h - 4);
    //Orizzontale(posx+1, posy + h - 4);
    //Verticale(posx, posy);
    Verticale(posx + l + 8, posy);
    Orizzontale(posx + 1, posy);
  }
  if (a == '8')
  {
    Serial.println(a);
    Orizzontale(posx + 1, posy + h + h - 8);
    Verticale(posx, posy + h - 4);
    Verticale(posx + l + 8, posy + h - 4);
    Orizzontale(posx + 1, posy + h - 4);
    Verticale(posx, posy);
    Verticale(posx + l + 8, posy);
    Orizzontale(posx + 1, posy);
  }

  if (a == '9')
  {
    Serial.println(a);
    Orizzontale(posx + 1, posy + h + h - 8);
    //Verticale(posx, posy + h-4);
    Verticale(posx + l + 8, posy + h - 4);
    Orizzontale(posx + 1, posy + h - 4);
    Verticale(posx, posy);
    Verticale(posx + l + 8, posy);
    Orizzontale(posx + 1, posy);
  }
}

void Orizzontale(int posxa, int posya)//écrit les segment horizontaux  
{
  for (int a = 0; a < 12; a++)
  {
    tft.drawLine(posxa + abs(6 - a), posya + a,  posxa + l + (6 - abs(6 - a)), posya + a,  WHITE); //orizzontale
  }
}

void Verticale(int posxa, int posya)//écrit les segment verticaux 
{
  for (int a = 0; a < 12; a++)
  {
    tft.drawLine(posxa - (6 - a), posya + abs(6 - a) + 8,  posxa - (6 - a), posya - abs(6 - a) + h,  WHITE); //verticale
  }
}
void OrizzontaleC(int posxa, int posya)//efface les segment horizontaux 
{
  for (int a = 0; a < 12; a++)
  {
    tft.drawLine(posxa + abs(6 - a), posya + a,  posxa + l + (6 - abs(6 - a)), posya + a,  BLACK); //orizzontale
  }
}

void VerticaleC(int posxa, int posya)//efface les segment verticaux 
{
  for (int a = 0; a < 12; a++)
  {
    tft.drawLine(posxa - (6 - a), posya + abs(6 - a) + 8,  posxa - (6 - a), posya - abs(6 - a) + h,  BLACK); //verticale
  }
}

void Cancella()//ecrit un 8 en noir donc efface le numéro precedent
{
  OrizzontaleC(posx + 1, posy + h + h - 8);
  VerticaleC(posx, posy + h - 4);
  VerticaleC(posx + l + 8, posy + h - 4);
  OrizzontaleC(posx + 1, posy + h - 4);
  VerticaleC(posx, posy);
  VerticaleC(posx + l + 8, posy);
  OrizzontaleC(posx + 1, posy);

}

Dans le code on peux modifier la largeur (l), la hauteur (h) et la position (posx posy) du nombre que on saisie à l’aide du moniteur serie.
Si vous voulez l’essayer il faut sûrement modifier le modèle de l’écran et installer la bibliothèque MCUFRIEND_kbv.
C’est en version test qui marche assez bien mais pas parfait.
L’effet blinking est encore présente mais il se manifeste avec un légere baisse de luminosité du numéro.
Avez vous des conseils à me donner pour optimiser encore plus ce code?

Je ne comprends pas en quoi votre élaboration simplifie le blinking? Pour éviter le blink on ne rafraîchit que ce qui doit être rafraîchit et au bon moment - si le symbole dessiné n’a pas changé alors on ne fait rien - ou alors on utilise du double buffering, on prépare tout le dessin dans un buffer mémoire et on pousse d’un coup un rectangle de bits à rafraîchir quand le composant le permet. Ici comme votre code ne modifie l’affichage que quand vous tapez quelque chose c’est sûr que vous ne voyez que l’effet du temps que ça prend pour dessiner mais ce n’est pas répétitif.

Au passage:

Ceci n’est pas correct:char a = "";les guillemets introduisent une cString (tableau de char d’un point de vue type) alors que vous n’avez qu’un seul char. Vous devez avoir un warning…il faut écrire char a = ‘\0’; par exemple avec des apostrophes pour un char. (Et pas besoin en fait de l’initialiser puisque vous le faites plus loin avec le read())

Vos if pourraient s’enchainer avec des else car dès que vous avez trouvé votre caractère vous savez que ce n’est pas la peine de tester les autres (ou utiliser switch/case)

Merci J-M-L.

Ceci n’est pas correct:

Ok

Et pas besoin en fait de l’initialiser puisque vous le faites plus loin avec le read()

C’est vrai!

Je ne comprends pas en quoi votre élaboration simplifie le blinking?

J’ai lu ça;
et en étudiant le fichier “FreeDefaultFonts.h” livré avec la librairie MCUFRIEND_kbv j’ai compris comme le dessin du caractère se faisait.
Je me suis dit: Et si j’essaye de de le dessiner avec des lignes sans aller chercher les données du caractère car je pense que ca c’est du temps perdu.
En tout cas le blinking s’est réduit considérablement . Pourquoi? Peut être parce que une librairie n’est pas optimisé pour une chose bien précise car elle doit être “élastique”.

on prépare tout le dessin dans un buffer mémoire et on pousse d’un coup un rectangle de bits à rafraîchir quand le composant le permet

Je pense que ce sera pire avec un rectangle car on va dessiner dans des endroits ou il n’y a pas besoin de dessiner surtout avec un font fait de cette manière.
Le mieux ce serait pouvoir utiliser la technique que utilisait DirectX mais avec arduino ce n’est pas possible.

vous ne voyez que l’effet du temps que ça prend pour dessiner mais ce n’est pas répétitif.

En effet je saisis le plus vite possible sur le monitor le nr 8 (le 8 car c’est le plus lourd!).

(ou utiliser switch/case)

Je utiliserai ça.

Merci encore J-M-L car tu m’a fait réfléchir d’avantage.

La librairie MCUFRIEND_kbv s'appuie sur la librairie Adafruit_GFX pour les fonctions de haut niveau.
La librairie Adafruit_GFX assure la gestion du fond lors de l'affichage de texte. Il n'est pas nécessaire d'effacer avant d'écrire, donc il n'y a pas de flicker.
Pour cela il faut définir la couleur du tracé ET la couleur de fond.

Je confirme car j'ai essayé que il faut effacer avant de récrire . Ca depend du font utilisé. Si j'ai bien compris les font e .h il faut récrire et les .c pas nécessaire. Comme dit l'article cité plus haut la couleur de background est ignorée.

Bonjour,

Il y a de l'idée, mais plutôt que d'afficher un 8 noir, pourquoi ne pas afficher les segments qui ne sont pas allumés pour un chiffre, en noir

Par exemple pour le '0' tu as

 if (a == '0')
 {
   Orizzontale(posx + 1, posy + h + h - 8);
   Verticale(posx, posy + h - 4);
   Verticale(posx + l + 8, posy + h - 4);
   //Orizzontale(posx+1, posy + h - 4);
   Verticale(posx, posy);
   Verticale(posx + l + 8, posy);
   Orizzontale(posx + 1, posy);
 }

Pourquoi ne pas faire

 if (a == '0')
 {
   Orizzontale(posx + 1, posy + h + h - 8);
   Verticale(posx, posy + h - 4);
   Verticale(posx + l + 8, posy + h - 4);
   OrizzontaleC(posx+1, posy + h - 4);
   Verticale(posx, posy);
   Verticale(posx + l + 8, posy);
   Orizzontale(posx + 1, posy);
 }

Ca ferait quand même moins de fliker

Ça c'est une bonne idée !
Je vais essayer.

Nickel! ;D
J'ai réfléchi aussi sur la proposition de J-M-L de ne pas écrire un segment si il est déjà écrit.
il me semble qu'il y a une fonction dans la librairie pour tester un pixel de l’écran. Je vais voir ça et je vous tiens au courant!

Parfait!
L'autre solution serait de voir pourquoi la font FreeSevenSegNumFont n'efface pas le caractère précédent quand on précise la couleur du fond dans setTextColor() contrairement aux autres fonts.

pourquoi la font FreeSevenSegNumFont n’efface pas le caractère précédent

Je pense pour faire un font qui occupe peux d’espace mémoire et pour optimiser le temps en écriture du nr sur l’écran.

quand on précise la couleur du fond dans setTextColor()

un bit 1 colorie le pixel un bit 0 ne fait rien!

Le nouveau code optimisé avec les idées de kamill et J-M-L (parfait? j’espère pas!)

#include <SPI.h>          // f.k. for Arduino-1.5.2
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
//#include <FreeDefaultFonts.h>


// 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
int l = 40, h = 40, posx = 100, posy = 50;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  tft.begin(0x9486);
  tft.setRotation(1);
  tft.fillScreen(BLACK);
  //tft.setTextColor(WHITE, BLACK);
}

void loop() {
  char a;
  // put your main code here, to run repeatedly:
  if (Serial.available() > 0)
  {
    //Cancella();
    a = Serial.read();
    Serial.println(a);
  }
  switch (a)
  {
    case '0':
      {
        Orizzontale(posx + 1, posy + h + h - 8);
        Verticale(posx, posy + h - 4);
        Verticale(posx + l + 8, posy + h - 4);
        OrizzontaleC(posx + 1, posy + h - 4);
        Verticale(posx, posy);
        Verticale(posx + l + 8, posy);
        Orizzontale(posx + 1, posy);
        break;
      }
    case '1':
      {
        OrizzontaleC(posx + 1, posy + h + h - 8);
        VerticaleC(posx, posy + h - 4);
        Verticale(posx + l + 8, posy + h - 4);
        OrizzontaleC(posx + 1, posy + h - 4);
        VerticaleC(posx, posy);
        Verticale(posx + l + 8, posy);
        OrizzontaleC(posx + 1, posy);
        break;
      }
    case '2':
      {
        Orizzontale(posx + 1, posy + h + h - 8);
        Verticale(posx, posy + h - 4);
        VerticaleC(posx + l + 8, posy + h - 4);
        Orizzontale(posx + 1, posy + h - 4);
        VerticaleC(posx, posy);
        Verticale(posx + l + 8, posy);
        Orizzontale(posx + 1, posy);
        break;
      }
    case '3':
      {
        Orizzontale(posx + 1, posy + h + h - 8);
        VerticaleC(posx, posy + h - 4);
        Verticale(posx + l + 8, posy + h - 4);
        Orizzontale(posx + 1, posy + h - 4);
        VerticaleC(posx, posy);
        Verticale(posx + l + 8, posy);
        Orizzontale(posx + 1, posy);
        break;
      }
    case '4':
      {
        OrizzontaleC(posx + 1, posy + h + h - 8);
        VerticaleC(posx, posy + h - 4);
        Verticale(posx + l + 8, posy + h - 4);
        Orizzontale(posx + 1, posy + h - 4);
        Verticale(posx, posy);
        Verticale(posx + l + 8, posy);
        OrizzontaleC(posx + 1, posy);
        break;
      }
    case '5':
      {
        Orizzontale(posx + 1, posy + h + h - 8);
        VerticaleC(posx, posy + h - 4);
        Verticale(posx + l + 8, posy + h - 4);
        Orizzontale(posx + 1, posy + h - 4);
        Verticale(posx, posy);
        VerticaleC(posx + l + 8, posy);
        Orizzontale(posx + 1, posy);
        break;
      }
    case '6':
      {
        Orizzontale(posx + 1, posy + h + h - 8);
        Verticale(posx, posy + h - 4);
        Verticale(posx + l + 8, posy + h - 4);
        Orizzontale(posx + 1, posy + h - 4);
        Verticale(posx, posy);
        VerticaleC(posx + l + 8, posy);
        Orizzontale(posx + 1, posy);
        break;
      }
    case '7':
      {
        OrizzontaleC(posx + 1, posy + h + h - 8);
        VerticaleC(posx, posy + h - 4);
        Verticale(posx + l + 8, posy + h - 4);
        OrizzontaleC(posx + 1, posy + h - 4);
        VerticaleC(posx, posy);
        Verticale(posx + l + 8, posy);
        Orizzontale(posx + 1, posy);
        break;
      }
    case '8':
      {
        Orizzontale(posx + 1, posy + h + h - 8);
        Verticale(posx, posy + h - 4);
        Verticale(posx + l + 8, posy + h - 4);
        Orizzontale(posx + 1, posy + h - 4);
        Verticale(posx, posy);
        Verticale(posx + l + 8, posy);
        Orizzontale(posx + 1, posy);
        break;
      }
    case '9':
      {
        Orizzontale(posx + 1, posy + h + h - 8);
        VerticaleC(posx, posy + h - 4);
        Verticale(posx + l + 8, posy + h - 4);
        Orizzontale(posx + 1, posy + h - 4);
        Verticale(posx, posy);
        Verticale(posx + l + 8, posy);
        Orizzontale(posx + 1, posy);
        break;
      }
  }
}

void Orizzontale(int posxa, int posya)
{
  if (tft.readPixel(posxa + 6 , posya) != WHITE)//teste si le segment et déjà present
    for (int a = 0; a < 12; a++)
    {
      tft.drawLine(posxa + abs(6 - a), posya + a,  posxa + l + (6 - abs(6 - a)), posya + a,  WHITE); //orizzontale
    }
}

void Verticale(int posxa, int posya)
{
  if (tft.readPixel(posxa + 6, posya + 6 + 8) != WHITE)
    for (int a = 0; a < 12; a++)
    {
      tft.drawLine(posxa - (6 - a), posya + abs(6 - a) + 8,  posxa - (6 - a), posya - abs(6 - a) + h,  WHITE); //verticale
    }
}
void OrizzontaleC(int posxa, int posya)
{
  if (tft.readPixel(posxa + 6, posya) == WHITE)//teste si il faut effacer le segment
    for (int a = 0; a < 12; a++)
    {
      tft.drawLine(posxa + abs(6 - a), posya + a,  posxa + l + (6 - abs(6 - a)), posya + a,  BLACK); //orizzontale
    }
}

void VerticaleC(int posxa, int posya)
{
  if (tft.readPixel(posxa - 6, posya + 6 + 8) == WHITE)
    for (int a = 0; a < 12; a++)
    {
      tft.drawLine(posxa - (6 - a), posya + abs(6 - a) + 8,  posxa - (6 - a), posya - abs(6 - a) + h,  BLACK); //verticale
    }
}

Il y’a deux types de polices dans les libraries ada - celles a avec serif etc ne savent pas gérer la couleur de fond mais sont capables de vous donner une bounding box d’un texte

Exacte: c'est pour simplifier son effacement.

J’aimerais créer une bibliothèque pour tout ça mais un lisant sur le net les tutos sur la création des bibliothèque, je ne rends compte qu'il me manque des notions de base sur la programmation en C/C++.
Je vais donc ressortir du placard mes livres en C++ que j'avais acheté il y a longtemps et que je n'ai jamais lu!!
Merci beaucoup pour votre aide.

J’ai modifié le code pour avoir la possibilité de modifier la hauteur du segment, la largeur du numéro, l’épaisseur du segment, l’espace entre les numéros et les nombre de numeros à affichier.
J’aimerais en faire une librairie pour que soit utilisable facilement. C’est possible? si oui: Avez vous un bon tuto pour accomplir cette tache?

le code

#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
int l = 10, h = 17, hs = 3, inr = 10, CharLen = 7;// largeur du segment, hauteur du segment.
                                                  //epaisseur du segment, espace entre les numeros, nombre de numeros

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  tft.begin(0x9486);
  tft.setRotation(1);
  tft.fillScreen(BLACK);
  if (hs < 3) hs = 3;// moins de 3 n'a pas de sense!
  //tft.setTextColor(WHITE, BLACK);
  long Odo = 5467812;
  String s = String(Odo);
  while (s.length() != CharLen)
    s = " " + s;
  char cVit[CharLen];
  strcpy(cVit, s.c_str());
  //Serial.println(Vitesse);
  Serial.println(cVit);
  //size_t c = strlen(cVit);
  PrintNumSegm(10, 165, cVit);// ecrit la vitesse sur tft
  delay(1000);
  Odo = 222222;
  s = String(Odo);
  while (s.length() != CharLen)
    s = " " + s;
  strcpy(cVit, s.c_str());
  PrintNumSegm(10, 165, cVit);// ecrit la vitesse sur tft

}

void loop() {
}
void PrintNumSegm(int posx, const int posy, char a[])
{
  Serial.println(a);
  int posxa = posx;
  size_t c = strlen(a);
  //Serial.println(c);

  for ( byte b = 0; b < c; b++)
  {
    posx = posxa + b * l + (inr * b);
    switch (a[b])
    {
      case '0':
        {
          Orizzontale(posx + 1, posy + h + h - hs/1.5);
          Verticale(posx, posy + h - hs/3);
          Verticale(posx + l + hs/1.5, posy + h - hs/3);
          OrizzontaleC(posx + 1, posy + h - hs/3);
          Verticale(posx, posy);
          Verticale(posx + l + hs/1.5, posy);
          Orizzontale(posx + 1, posy);
          break;
        }
      case '1':
        {
          OrizzontaleC(posx + 1, posy + h + h - hs/1.5);
          VerticaleC(posx, posy + h - hs/3);
          Verticale(posx + l + hs/1.5, posy + h - hs/3);
          OrizzontaleC(posx + 1, posy + h - hs/3);
          VerticaleC(posx, posy);
          Verticale(posx + l + hs/1.5, posy);
          OrizzontaleC(posx + 1, posy);
          break;
        }
      case '2':
        {
          Orizzontale(posx + 1, posy + h + h - hs/1.5);
          Verticale(posx, posy + h - hs/3);
          VerticaleC(posx + l + hs/1.5, posy + h - hs/3);
          Orizzontale(posx + 1, posy + h - hs/3);
          VerticaleC(posx, posy);
          Verticale(posx + l + hs/1.5, posy);
          Orizzontale(posx + 1, posy);
         break;
        }
      case '3':
        {
          Orizzontale(posx + 1, posy + h + h - hs/1.5);
          VerticaleC(posx, posy + h - hs/3);
          Verticale(posx + l + hs/1.5, posy + h - hs/3);
          Orizzontale(posx + 1, posy + h - hs/3);
          VerticaleC(posx, posy);
          Verticale(posx + l + hs/1.5, posy);
          Orizzontale(posx + 1, posy);
          break;
        }
      case '4':
        {
          OrizzontaleC(posx + 1, posy + h + h - hs/1.5);
          VerticaleC(posx, posy + h - hs/3);
          Verticale(posx + l + hs/1.5, posy + h - hs/3);
          Orizzontale(posx + 1, posy + h - hs/3);
          Verticale(posx, posy);
          Verticale(posx + l + hs/1.5, posy);
          OrizzontaleC(posx + 1, posy);
          break;
        }
      case '5':
        {
          Orizzontale(posx + 1, posy + h + h - hs/1.5);
          VerticaleC(posx, posy + h - hs/3);
          Verticale(posx + l + hs/1.5, posy + h - hs/3);
          Orizzontale(posx + 1, posy + h - hs/3);
          Verticale(posx, posy);
          VerticaleC(posx + l + hs/1.5, posy);
          Orizzontale(posx + 1, posy);
          break;
        }
      case '6':
        {
          Orizzontale(posx + 1, posy + h + h - hs/1.5);
          Verticale(posx, posy + h - hs/3);
          Verticale(posx + l + hs/1.5, posy + h - hs/3);
          Orizzontale(posx + 1, posy + h - hs/3);
          Verticale(posx, posy);
          VerticaleC(posx + l + hs/1.5, posy);
          Orizzontale(posx + 1, posy);
           break;
        }
      case '7':
        {
          OrizzontaleC(posx + 1, posy + h + h - hs/1.5);
          VerticaleC(posx, posy + h - hs/3);
          Verticale(posx + l + hs/1.5, posy + h - hs/3);
          OrizzontaleC(posx + 1, posy + h - hs/3);
          VerticaleC(posx, posy);
          Verticale(posx + l + hs/1.5, posy);
          Orizzontale(posx + 1, posy);
           break;
        }
      case '8':
        {
          Orizzontale(posx + 1, posy + h + h - hs/1.5);
          Verticale(posx, posy + h - hs/3);
          Verticale(posx + l + hs/1.5, posy + h - hs/3);
          Orizzontale(posx + 1, posy + h - hs/3);
          Verticale(posx, posy);
          Verticale(posx + l + hs/1.5, posy);
          Orizzontale(posx + 1, posy);
          break;
        }
      case '9':
        {
          Orizzontale(posx + 1, posy + h + h - hs/1.5);
          VerticaleC(posx, posy + h - hs/3);
          Verticale(posx + l + hs/1.5, posy + h - hs/3);
          Orizzontale(posx + 1, posy + h - hs/3);
          Verticale(posx, posy);
          Verticale(posx + l + hs/1.5, posy);
          Orizzontale(posx + 1, posy);
           break;
        }
      case ' ':
        {
          OrizzontaleC(posx + 1, posy + h + h - hs/1.5);
          VerticaleC(posx, posy + h - hs/3);
          VerticaleC(posx + l + hs/1.5, posy + h - hs/3);
          OrizzontaleC(posx + 1, posy + h - hs/3);
          VerticaleC(posx, posy);
          VerticaleC(posx + l + hs/1.5, posy);
          OrizzontaleC(posx + 1, posy);
          break;
        }
    }
  }
}

void Orizzontale(int posxa, int posya)
{
  if (tft.readPixel(posxa + hs/2 , posya + hs/2) != WHITE)
    for (int a = 0; a < hs; a++)
    {
      tft.drawLine(posxa + abs(hs / 2 - a), posya + a,  posxa + l + (hs / 2 - abs(hs / 2 - a)), posya + a,  WHITE); //orizzontale
    }
      //tft.drawFastHLine(posxa + hs/2, posya + hs/2, 5, RED);

}

void Verticale(int posxa, int posya)
{
  if (tft.readPixel(posxa, posya + hs) != WHITE)
    for (int a = 0; a < hs; a++)
    {
      //tft.drawLine(posxa - (hs/2 - a), posya + abs(hs/2 - a) + 8,  posxa - (hs/2 - a), posya - abs(hs/2 - a) + h,  WHITE); //verticale
      tft.drawLine(posxa - (hs / 2 - a), posya + abs(hs / 2 - a) + hs / 2 + 2,  posxa - (hs / 2 - a), posya - abs(hs / 2 - a) + h,  WHITE); //verticale
    }
}
void OrizzontaleC(int posxa, int posya)
{
  if (tft.readPixel(posxa + hs/2, posya) == WHITE)
    for (int a = 0; a < hs; a++)
    {
      tft.drawLine(posxa + abs(hs / 2 - a), posya + a,  posxa + l + (hs / 2 - abs(hs / 2 - a)), posya + a,  BLACK); //orizzontale
    }
}

void VerticaleC(int posxa, int posya)
{
  //tft.drawFastVLine(posxa, posya + hs, 5, RED);
  if (tft.readPixel(posxa, posya + hs) == WHITE)
    for (int a = 0; a < hs; a++)
    {
      tft.drawLine(posxa - (hs / 2 - a), posya + abs(hs / 2 - a) + hs / 2 + 2,  posxa - (hs / 2 - a), posya - abs(hs / 2 - a) + h,  BLACK); //verticale
    }
}

Oui c'est possible, il y a des tutos en ligne, voilà le premier pointé par google

(NB: généralement on écrit les bibliothèques en anglais (ça augmente l'usage) ou alors ici en français :slight_smile: --> Horizontal pas Orizzontale)

J-M-L:
il y a des tutos en ligne, voilà le premier pointé par google

Excellant tuto que tu as trouvé J-M-L.
Je pense qu'il aurait sa place dans "Tutos et Cours" vu le nombre de débutants qui sont persuadés qu'une bibliothèque se limite à un fichier h.

Je me lance… le fichier .h

#ifndef SavSegNum_h
#define SavSegNum_h
    
#include <Arduino.h>
    
class SavSegNum
{
public:
void setDim(int l=10, int h=17, int hs=3, int inr=12);
void setColors(uint16_t color, uint16_t bColor);
void printSegNum(int posX, int posY, char charToPrint[]);
};
    
#endif

par contre j’ai plein de question. la plus importante:
Comme je vais pouvoir écrire sur mon écran dans mon fichier .cpp qui lui sera configuré dans le sketch? Je dois transférer, je ne sais pas comment, l’objet tft (MCUFRIEND_kbv tft;) du sketch à la librairie.

vous pouvez décider que l’instance du TFT vous est passé dans un begin() ou init() sous forme d’un pointeur sur MCUFRIEND_kbv

Mais alors il faudra que l’utilisateur de ma librairie utilise la librairie MCUFRIEND_kbv et pas d’autre?

savoriano:
Mais alors il faudra que l’utilisateur de ma librairie utilise la librairie MCUFRIEND_kbv et pas d'autre?

dans ce cas oui. mais c'est une librairie fréquemment utilisée

Comme ça?

#ifndef SavSegNum_h
#define SavSegNum_h
    
#include <Arduino.h>
    
class SavSegNum
{
public:
void setDim(int l=10, int h=17, int hs=3, int inr=12);// l=segment length; h=segment heigth; hs= segment thickness, inr=Whitespace character
void setColors(uint16_t color, uint16_t bColor);//color= segment color; bColor= background color
void printSegNum(int posX, int posY, char charToPrint[]);
void init(*tft);
};
    
#endif

Est ce que je dois mettre un
#include MCUFRIEND_kbv dans le fichier .cpp?