[Résolu] - Problème d'utilisation fonction "sprintf"

Bonjour,

Dans le cadre d’un projet, je souhaite réaliser un retour d’infos d’un système grâce à un écran LCD.


Matériel :

  • UNO R3
  • IDE : Arduino 1.8.10 (sous W7)
  • Afficheur LCD 16x02 - muni d’un module I²C (puce PFC8547T).

Objectif :

Afficher sur la première ligne un compte à rebours au format (hh : mm : ss). Sur la deuxième, le nombre d’éléments restants sur 3 piles d’approvisionnement.
Le but est d’obtenir le rendu suivant :
┌-------------------------------------------------------------┐
│ hh : mm : ss │
│P1 : x1 P2 : x2 P3 : x3 │
└-------------------------------------------------------------┘

J’ai pu lire que pour ce genre de situation, l’utilisation de sprintf était plutôt adaptée.


Essais
Pour bien comprendre le fonctionnement de sprintf, je me suis appuyé sur des exemples trouvés ici et là sur Internet et ai voulu partir sur un cas simple : afficher un texte.

Mon code :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // frank de brabander 1.1.2

void setup()
{
 lcd.init();
 lcd.backlight();
 lcd.home();
char msg[16]; //tableau pour les 16 caractères d'une ligne
sprintf(msg, "Essai texte:");
}

void loop()
{
  
}

Puis compilation (sans erreurs),mais aucunes données ne s’affichent.
Après recherches et plusieurs modifs, même résultat.

Une librairie manquante ou incompatible, erreurs de codage ? De l’aide serait la bienvenue.


NOTA :

Pas de rapport direct avec mon problème, mais ça m’intrigue :

Pour faire fonctionner l’écran avec les module I²C muni d’une puce PFC8547 avec suffixes T ou A, (et dont les straps n’ont pas été modifiés) j’ai lu ici que l’adresse à renseigner devrait normalement être 0x3F.

Cependant, dans mon cas, ça fonctionne avec 0x27. Pourquoi cette différence ?

Bon, dans votre setup, vous avez rempli votre chaîne avec ce que vous voulez afficher.
Mais
Avez vous pensé à l'envoyer à votre lcd?
peut être qu'un lutin a mangé la ligne

lcd.print(msg);// tout à la fin du setup

Au fait: sur PC ou -incl- RPi, sprintf est déconseillé au profit de snprintf (protège contre débordements de tableaux)

... //setup
snprintf(msg, 16, "Salut');
lcd.print(msg);
}

Effectivement, l'erreur venait de cet oubli (mauvaise compréhension de ma part de la porté de sprintf).

Je prends note de l’utilisation de snprintf.

Merci

Même si, à terme, le compilateur va se mettre à grogner lors de l’utilisation de sprintf (“deprecated”), vos ennuis ne sont pas finis:
dimensionner msg à 16 fait que le dernier caractère de msg sera \0 (fin de chaîne, non imprimable, non visible: que du bonheur, pour dépanner). Si vous voulez utiliser tous les caractères de votre écran -que vous avez acheté-, il faut le dimensionner à … 17.
Si vous tombez sur un lcd ayant 20 caractères par ligne, il vaut mieux dimensionner à 21 (et pour ne pas vous embêter plus longtemps, je vous conseille de le dimensionner à 25: si votre buffer est local, une fois sorti du bloc, la place utilisée (qui semble gaspillée) - ca 1% de la RAM…- sera remise dans un pot commun et ça ne fera pas de mal devant la sérénité que procure le fait d’être dispensé de recherche de fuites mémoires, abominables à détecter et localiser sur arduini…)