Creation de fonts pour Adafruit_gfx

J'avais converti le font FreeSansBoldOblique9pt7b.h de Adafruit_GFX en FreeSansBoldOblique6pt7b.h
Mais j'ai complètement oublié comment j'y étais parvenu

Il y a un tuto ici :

Bon courage !

Ce n'était pas une création mais une conversion automatique
un changement de dimension des caracteres

Je n'ai jamais fait ça, mais il semble que l'outil fontconvert puisse faire ça.

If you want to create new font sizes not included with the library, or adapt entirely new fonts, we have a command-line tool (in the “fontconvert” folder) for this. It should work on many Linux- or UNIX-like systems (Raspberry Pi, Mac OS X, maybe Cygwin for Windows, among others).

Building this tool requires the gcc compiler and FreeType library. Most Linux distributions include both by default. For others, you may need to install developer tools and download and build FreeType from the source. Then edit the Makefile to match your setup before invoking “make”.

fontconvert expects at least two arguments: a font filename (such as a scalable TrueType vector font) and a size, in points (72 points = 1 inch; the code presumes a screen resolution similar to the Adafruit 2.8" TFT displays). The output should be redirected to a .h file…you can call this whatever you like but I try to be somewhat descriptive:
./fontconvert myfont.ttf 12 > myfont12pt7b.h

L'outil est ici : je ne sais pas s'il est utilisable sous un autre OS que Linux.

J'ai retrouvé!

c'est tout et ça marche
Merci à toi Lesept de t'y être interressé

OK, merci de l'info. Bonne continuation.

Suggestion : tu peux faire un tuto sur ça dans la section idoine... Ca peut servir à d'autres !

Fait!

QUESTIONS :

1 - Pourquoi dans l' iDE y-a-t-il parfois des zones avec l'arrière fond rose?

2- Lorsque je sélectionne un mot , tous les autres mêmes mots sont surlignés .. comment supprimer cela??

capture 2023-10-08 à 10.24.35

En compilant ce sketch j'ai un arrêt de la compilation sans message d'erreur
Une idée?

// VERSION 6 octobre AVEC ANNIVERSAIRES

// --------------- besoins pour affichage anniversaires
#include <SD.h>
#include <SPI.h>

File fichierAniv;
static char buf[50];
int i;
int c;
int ligne = 0;

char *p1;
char *p2;
char *p3;
char *p4;
char *p5;

// --------------- besoins pour affichage horloge
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

int ledPin = 16;

#define SCREEN_WIDTH 128   // OLED display width, in pixels
#define SCREEN_HEIGHT 64   // OLED display height, in pixels
#define OLED_RESET -1      // Reset de l'OLED partagé avec l'Arduino (d'où la valeur à -1, et non un numéro de pin)
#define Oled_ADDRESS 0x3C  // Adresse de "mon" écran OLED sur le bus i2c (généralement égal à 0x3C ou 0x3D)

Adafruit_SSD1306 ecranOLED(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);  // initialisation de l'écran avec le nom ecranOLED (à choisir)

//---------------- choix des polices
// Fonts est le nom du dossier dans lequel se trouvent tous les fonts de la bibliotheque Adafruit_GFX
#include <Fonts/FreeSans6pt7b.h>
#include <Fonts/FreeSansBold9pt7b.h>
#include <Fonts/FreeSansBold12pt7b.h>

//---------------- besoins pour WIFI
#include <ESP8266WiFi.h>
const char *ssid = "WORKGROUP 2.4GHz";
const char *password = "arzene66";
int y;
String BUFFER_H;

//----------------- besoins pour internet
#include <EasyNTPClient.h>
#include <WiFiUdp.h>
#include <Timezone.h>

//------------------ besoins pour extraction données hors du WiFi
WiFiUDP Udp_G;                                                                    // Objet UDP permettant d'envoyer et recevoir des trames Wi-Fi selon le protocole UDP
EasyNTPClient ClientNtp_G(Udp_G, "pool.ntp.org");                                 // Objet NTP synchronisé avec "pool.ntp.org"
TimeChangeRule RegleHeureEteFrance_G = { "RHEE", Last, Sun, Mar, 2, 120 };        // Règle de passage à l'heure d'été pour la France
TimeChangeRule RegleHeureHiverFrance_G = { "RHHE", Last, Sun, Oct, 3, 60 };       // Règle de passage à l'heure d'hiver la France
Timezone ConvertirHeureFrance_G(RegleHeureEteFrance_G, RegleHeureHiverFrance_G);  // Objet de conversion d'heure avec les caractéristique de la métropole française


//------------------- matrice du logo Wifi
const unsigned char logoWIFI[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00,
  0x3f, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x03, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xf8,
  0x00, 0x7f, 0xc0, 0x1f, 0xc0, 0x00, 0x0f, 0xe0, 0x3f, 0x00, 0x00, 0x03, 0xf0, 0x7e, 0x03, 0xff,
  0x01, 0xf8, 0x78, 0x1f, 0xff, 0xe0, 0x78, 0x70, 0x7f, 0xff, 0xf8, 0x38, 0x00, 0xff, 0xff, 0xfc,
  0x00, 0x01, 0xfc, 0x00, 0xfe, 0x00, 0x03, 0xf0, 0x00, 0x3f, 0x00, 0x03, 0xc0, 0x00, 0x0f, 0x00,
  0x03, 0x80, 0x38, 0x07, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00,
  0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0x87, 0xe0, 0x00, 0x00, 0x1e, 0x01, 0xe0, 0x00, 0x00, 0x08,
  0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0xfc,
  0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00,
  0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
} ;

void setup() {  // exécuté 1 fois

  // =========== PARTIE NECESSAIRE POUR HORLOGE ==============

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(115200);
  Wire.begin(4, 5);
  WiFi.begin(ssid, password);

  ecranOLED.begin(SSD1306_SWITCHCAPVCC, Oled_ADDRESS);  // initialize with the I2C addr 0x3C
  ecranOLED.clearDisplay();                             // Vidange du buffer de l'écran OLED

  //---- attente signal WiFi
  unsigned long chrono = millis();  // remplace la fonction delai
  while (millis() - chrono < 3000) yield();
  while (WiFi.status() != WL_CONNECTED) {
    affichagelogoWifi();  // appel sous-programme affichage logowifi clignotant
  }
  digitalWrite(ledPin, HIGH);
}


void loop() {  // executé à l'infini

  time_t HeureLocale_L;
  HeureLocale_L = ConvertirHeureFrance_G.toLocal(ClientNtp_G.getUnixTime());
  AfficherHeureLocale(HeureLocale_L);
}

//================ SOUS-PROGRAMME affichage logoWiFi
void affichagelogoWifi(void) {

  //------------------ affichage logo WIFI
  //drawBitmap(x position, y position, bitmap data, bitmap width, bitmap height, color)
  ecranOLED.drawBitmap(50, 20, logoWIFI, 38, 32, WHITE);  // dessin et position du logo placés dans le buffer
  ecranOLED.display();                                    // affichage sur l'écran du contenu du buffer
  unsigned long chrono = millis();
  //  chrono = millis();  // remplace la fonction delai
  while (millis() - chrono < 600) yield();  // durée logo visible

  //------------------ Extinction logo WIFI
  ecranOLED.clearDisplay();                 // dessin et position du logo placés dans le buffer
  ecranOLED.display();                      // affichage sur l'écran du contenu du buffer
  chrono = millis();                        // remplace la fonction delai
  while (millis() - chrono < 300) yield();  //durée logo éteint
}

//=================== SOUS PROGRAMME centrage textes
void oledDisplayCenter(String text, int Y) {
  int16_t x1;
  int16_t y1;
  uint16_t width;
  uint16_t height;
  
  ecranOLED.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);  // extraction de la longueur width du texte
  ecranOLED.setCursor((SCREEN_WIDTH - width) / 2, Y);              // (largeur écran - longueur du texte) / 2 donne le point de départ du texte
}

//===================SOUS PROGRAMME positionnementà droite des textes
void oledDisplayDroit(String text, int Y) {
  int16_t x1;
  int16_t y1;
  uint16_t longueur;
  uint16_t height;

  ecranOLED.getTextBounds(text, 0, 0, &x1, &y1, &longueur, &height);

  ecranOLED.setCursor((102 - longueur), Y);
  ecranOLED.print(text);  // text to display
}


// =============== SOUS PROGRAMME AFFICHAGE SUR ECRAN
void AfficherHeureLocale(time_t Heure_P) {
  char BUFFER_H[50];
  char BUFFER_H1[50];
  char BUFFER_H2[50];
  char BUFFER_J[50];
  char BUFFER_D[50];
  char AbreviationMois_L[12][10] = { "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre" };
  char AbreviationJour_L[7][10] = { "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" };

  //----- effacement buffer écran
  ecranOLED.clearDisplay();

  //------création buufer Date = texte affiché
  sprintf(BUFFER_D, "%s - %d", AbreviationMois_L[month(Heure_P) - 1], year(Heure_P));
  ecranOLED.setFont(&FreeSans6pt7b);  //mois, année = petits caractères
  ecranOLED.setTextColor(WHITE);
  oledDisplayCenter(BUFFER_D, 10);
  ecranOLED.print(BUFFER_D);

  //----- création buffer Jour = texte affiché
  sprintf(BUFFER_J, "%s %.2d", AbreviationJour_L[weekday(Heure_P) - 1], day(Heure_P));  // %.2d affiche (01) et %.d affiche ( 1) 
  ecranOLED.setFont(&FreeSansBold9pt7b);  //jour et date = moyens caractères
  ecranOLED.setTextColor(WHITE);
  oledDisplayCenter(BUFFER_J, 30);
  ecranOLED.print(BUFFER_J);

  //----- création buffer heure-minutes = texte affiché
  sprintf(BUFFER_H1, "%d:%.2d", hour(Heure_P), minute(Heure_P));  // creation et remplissage de la variable "BUFFER_H"... %d
  ecranOLED.setFont(&FreeSansBold12pt7b); //heure et minutes = gros caracteres
  ecranOLED.setTextColor(WHITE);
  oledDisplayCenter(BUFFER_H1, 62);
  ecranOLED.print(BUFFER_H1);

  //----- création buffer seconde
  sprintf(BUFFER_H2, "%2d", second(Heure_P));  // creation et remplissage de la variable "BUFFER_H"
  ecranOLED.setFont(&FreeSans6pt7b);
  ecranOLED.setTextColor(WHITE);
  ecranOLED.setCursor(108, 62);
  ecranOLED.print(BUFFER_H2);

  //-------affichage buffer sur écran
  ecranOLED.display();
}


resultat compilation :

C'est qu'il n'y a pas d'erreur.
Maintenant, si tu copiais le contenu de la fenêtre de sortie de compilation au lieu de faire des copies d'écran on pourrait, peut-être, en dire plus.

Tu parles bien de compilation, pas de téléchargement?

Quel thème utilises-tu?

Cela fait partie du thème que tu utilises. Il n'y a pas, à ma connaissance, de moyen de modifier cela sans éditer le thème.

/Volumes/4T-LACIE/CALENDRIER ANNIVERSAIRE/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct.ino: In function 'void AfficherHeureLocale(time_t)':
/Volumes/4T-LACIE/CALENDRIER ANNIVERSAIRE/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct.ino:212:8: warning: unused variable 'BUFFER_H' [-Wunused-variable]
  212 |   char BUFFER_H[50];
      |        ^~~~~~~~
/Volumes/4T-LACIE/CALENDRIER ANNIVERSAIRE/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct.ino: At global scope:
/Volumes/4T-LACIE/CALENDRIER ANNIVERSAIRE/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct/HORLOGE_CALENDRIER_WIFI_AVEC_ANNIVERSAIRES_vers_6_oct.ino:8:13: warning: 'buf' defined but not used [-Wunused-variable]
    8 | static char buf[50];
      |             ^~~
. Variables and constants in RAM (global, static), used 29296 / 80192 bytes (36%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ DATA     1548     initialized variables
╠══ RODATA   1196     constants       
╚══ BSS      26552    zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 60931 / 65536 bytes (92%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ ICACHE   32768    reserved space for flash instruction cache
╚══ IRAM     28163    code in IRAM    
. Code in flash (default, ICACHE_FLASH_ATTR), used 264256 / 1048576 bytes (25%)
║   SEGMENT  BYTES    DESCRIPTION
╚══ IROM     264256   code in flash   

Il n'y a aucune erreur.
Quel est ton problème?

Cela fait partie du thème que tu utilises. Il n'y a pas, à ma connaissance, de moyen de modifier cela sans éditer le thème.

Pareil sur tous les themes

Je ne lancais que la compilation et je n'avais pas le message habituel de compilation terminée, j'ai crû qu'il y avait un arrêt dans la compilation
En lançait la compil et le teléversement en même temps cela fonctionne

merci

Pareil sur tous les thèmes.

Si tu installes des thèmes autres que ceux proposés par défaut, tu as la possibilité de les éditer pour changer les couleurs, tu peux alors faire un peu ce que tu veux.

Ne pas négliger quand même l'avantage de la mise en surbrillance des occurrences d'une variable dans le code. Lorsqu'on sélectionne une variable l'éditeur met en surbrillance toutes les occurrences de cette variables mais la couleur est différente si la variable est utilisée ou si on lui affecte une valeur. Cela permet de voir assez vite si on modifie une variable accidentellement (typiquement lorsqu'on se trompe et que l'on utilise = au lieu de == dan un test)
Par exemple dans la copie d'écran on voit que mask est en bleu ou en gris suivant que c'est une utilisation ou une affectation de la variable.

Pour installer des thème tiers voir ici l'explication

Je ne te cacherais pas que la recherche d'un thème est plutôt laborieuse.
Mais une fois que tu en as un, tu peux le modifier assez simplement.
les fichiers .vsix sont des zip on peut donc les décompresser pour en éditer le contenu.
Ils ont cette forme

nom-du-theme/  
  ├── [Content_Types].xml  
  ├── extension/  
  |            └──themes
  |            |           └── le-nom-du-theme.json     
  |             packages.json
  └── extension.vsixmanifest  

L'affectation des couleurs se trouve dans le-nom-du-theme.json
Le nom des champs est suffisamment explicite pour que l'on trouve sans trop tâtonner ce que l'on désire.
On peut laisser le thème décompressé dans plugins pour travailler dessus.
Il faut quitter l'IDE et le relancer pour que les modifications soient prises en compte.
Il faut penser à changer le nom du fichier de thème sinon on ne sait plus s'y retrouver dans la liste des thèmes dans les préférences.
Il faut aussi mettre à jour le contenu de:

  • extension.vsixmanifest
  • packages.json

Pour que le contenu des fichiers soit cohérent avec le nouveau nom du thème.

Cela parait complexe mais mérite qu'on s'y interesse et que l'on essaye de maitriser ces themes
Merci

Ce sont juste des messages pour t'indiquer que tu déclares des variables qui ne sont pas utilisées par la suite. Rien de grave, ce n'est pas une erreur.

Comme l'indique @lesept les messages d'avertissement que tu as, n'ont pas d'incidence mais ce n'est pas toujours le cas.
Je te conseillerais, surtout quand on n'est pas un programmeur expérimenté de ne pas laisser de "warning"

Un mystère pour moi
Pourquoi quand j'écris ceci :
Serial.print ( AbreviationMois_L[month(Heure_P) - 1]);
la compilation passe et j'obtiens dans le moniteur par exemple octobre

Mais quand plus loin j'écris ceci :

char charmois = AbreviationMois_L[month(Heure_P) - 1]; 
String stringOne = String(charmois);
stringOne.toInt();   // conversion CHAR en INT

if (stringOne = p4) {  // P4 est un nombre
        Serial.println("anniversaire de Joseph");
    }
      Serial.println("pas d'anniversaire");
char charmois = AbreviationMois_L[month(Heure_P) - 1];

La compil me donne cette erreur :

Compilation error: 'AbreviationMois_L' was not declared in this scope

Je vois plusieurs problèmes juste dans ce petit bout de code :

month est une fonction ?
Pour ce genre de problème, il nous faut connaitre le code entier pour pouvoir répondre.

Une comparaison c'est avec '==' !

Ici tu déclares un seul caractère / octet. Est-ce bien ce que tu veux ?
Enfin, tu le déclares deux fois de suite, le compilateur ne doit pas aimer trop...

Il faut aussi donner l'ensemble du message d'erreur : il contient d'autres informations utiles, comme par exemple le numéro de la ligne. Ici on ne sait pas s'il pointe sur le première ou la seconde définition.