Création d'une fonction pour affichage LCD

Bonjour,

Je dispose d'un écran LCD, branché en I2C que j'utilise via la bibliotheque LiquidCrystal_I2C. Comme je modifie régulièrement les données affichées sur l'écran, j'ai créé une fonction dans mon programme :

void affiche_texte_lcd(byte caractere, byte ligne, const char* texte)
{
  lcd.setCursor(caractere, ligne);
  lcd.print(texte);
}

Ainsi l'appel de la fonction affiche_texte_lcd(0,0,"pH ="); fonctionne très bien.

J'ai un souci par contre quand je veux afficher la valeur d'une variable. Par exemple, la commande affiche_texte_lcd(0,0,valeur); (valeur est un float), j'obtiens un message d'erreur :
cannot convert 'float' to 'const char*' for argument '3' to 'void affiche_texte_matrice(byte, byte, const char*)'

Y-a-t-il un moyen de faire en sorte que je puisse afficher du texte et la valeur d'une variable ?

Merci d'avance pour votre aide

faites une autre fonction avec le même nom

void affiche_texte_lcd(byte caractere, byte ligne, const float valeur)
{
  lcd.setCursor(caractere, ligne);
  lcd.print(valeur);
}

et vous laissez le compilateur décider quelle version appeler en fonction du type de paramètre que vous avez

PS/
un paramètre optionnel en plus pour la précision serait utile

void affiche_texte_lcd(byte caractere, byte ligne, const float valeur, byte precision = 2)
{
  lcd.setCursor(caractere, ligne);
  lcd.print(valeur, precision);
}

sinon une macro va faire le job aussi et sera multiforme:

#define LCD_print(x, y, ...)  {lcd.setCursor((x),(y)); lcd.print(__VA_ARGS__);}

avec ça vous pouvez appeler

LCD_print(0,0, 'X');                  // caractère
LCD_print(0,0, "Hello World");        // cString (constante ou pas)
LCD_print(0,0, F("Hello World"));     // cString en mémoire flash
LCD_print(0,0, 10);                   // nombre
LCD_print(0,0, 10, HEX);              // nombre avec format
LCD_print(0,0, 123.45678, 5);         // nombre décimal avec la précision souhaitée

tout ce qui fonctionne dans print() va fonctionner

Bonjour

Merci pour l'astuce : je ne pensais pas qu'on pouvait laisser le choix au compilateur !
Je suis limite en mémoire dynamique donc je pense que je ne vais pas passer par la macro

la macro prendra un peu plus de place en flash (puisqu'on injecte à chaque fois un peu de code) mais pas en SRAM

Si vous êtes limite en SRAM, pensez à utiliser F("pH =") au lieu de "pH =" (idem pour tous les textes). ça va vous libérer de la SRAM (mais si vous conservez votre fonction alors le type de paramètre pour l'appel de fonction doit être const __FlashStringHelper *)

le C++ permet d'avoir le même nom de fonction avec différentes signatures pour les paramètres et le compilateur choisit celle qui est le plus adaptée en fonction de ce que vous passez.

Merci pour tout : j'utilisais les F string pour d'autres textes effectivement, en utilisant la macro, je n'ai plus de problème de mémoire.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.