Go Down

Topic: Nouveau Font? (Read 931 times) previous topic - next topic

savoriano

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:

Code: [Select]
#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?
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

J-M-L

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:
Code: [Select]
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
Code: [Select]
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)

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

savoriano

#2
Jun 26, 2019, 09:30 am Last Edit: Jun 26, 2019, 03:26 pm by savoriano
Merci J-M-L.
Quote
Ceci n'est pas correct:
Ok
Quote
Et pas besoin en fait de l'initialiser puisque vous le faites plus loin avec le read()
C'est vrai!
Quote
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".

Quote
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.

Quote
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!).

Quote
(ou utiliser switch/case)
Je utiliserai ça.

Merci encore J-M-L car tu m'a fait réfléchir d'avantage.
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

fdufnews

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.

savoriano

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.
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

kamill

#5
Jun 26, 2019, 05:21 pm Last Edit: Jun 26, 2019, 05:22 pm by kamill
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
Code: [Select]
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
Code: [Select]
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


savoriano

Ça c'est une bonne idée !
Je vais essayer.
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

savoriano

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!
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

kamill

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.

savoriano

#9
Jun 26, 2019, 08:29 pm Last Edit: Jun 26, 2019, 09:07 pm by savoriano
Quote
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.
Quote
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!)

Code: [Select]
#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
    }
}

Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

J-M-L

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
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

savoriano

#11
Jun 26, 2019, 10:14 pm Last Edit: Jun 27, 2019, 09:08 am by savoriano
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.
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

savoriano

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
Code: [Select]
#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
    }
}
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

J-M-L

#13
Jul 06, 2019, 09:48 am Last Edit: Jul 06, 2019, 09:49 am by J-M-L
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 :) --> Horizontal pas Orizzontale)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

68tjs

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.

Go Up