Go Down

Topic: [Résolu] - Problème d'utilisation fonction "sprintf" (Read 166 times) previous topic - next topic

Yukony

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 :

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

dbrion06

#1
Sep 17, 2019, 07:29 pm Last Edit: Sep 17, 2019, 07:37 pm by dbrion06
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
Code: [Select]
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)
Code: [Select]

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

Yukony

#2
Sep 17, 2019, 09:27 pm Last Edit: Sep 17, 2019, 10:21 pm by Yukony
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

dbrion06

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

Go Up