// Solution du laboratoire: DOC11.3.5

#include <LiquidCrystal_I2C.h>

#define LCD_LIGNE_NO_1                0
#define LCD_LIGNE_NO_2                1
#define LCD_DEBUT_LIGNE               0
#define LCD_NB_LIGNE                  4
#define LCD_NB_COLONNE                20
#define DELAI_MSG_OUVERTURE           1000
#define LCD_ADRESSE_I2C               0x27
#define NOM_PROJET                    "Labo DOC11.4.4.2"
#define VERSION_PROJET                "sprintf et snprintf"
#define LONGUEUR_MSG                  LCD_NB_COLONNE + 1

LiquidCrystal_I2C ecranLCD(LCD_ADRESSE_I2C,LCD_NB_COLONNE,LCD_NB_LIGNE);
char msg[LONGUEUR_MSG];

void setup() {
  ecranLCD.begin(LCD_NB_COLONNE, LCD_NB_LIGNE);
  ecranLCD.print(NOM_PROJET);
  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_2);
  sprintf(msg, "%s", VERSION_PROJET);
  ecranLCD.print(msg);
  delay(DELAI_MSG_OUVERTURE);
  ecranLCD.clear();
} // setup()

void loop() {

  static int compteur = 0;
  int temperature = 22;
  String moi = "moi moi";  // char moi[] = "moi moi";
  float pi = 3.141592;

  // Exemple 01

  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_1);
  sprintf(msg, "c: %d, t: %d", compteur++, temperature);
  ecranLCD.print(msg);
  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_2);
  sprintf(msg, "Je suis %s", moi.c_str());
  ecranLCD.print(msg); 


  // Exemple 02 - Forcer des espaces à gauche
  /*
  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_1);
  sprintf(msg, "c: %5d, t: %d", compteur++, temperature);
  ecranLCD.print(msg);
  */


  // Exemple 03 - Forcer des 0 à gauche
  /*
  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_1);
  sprintf(msg, "c: %05d, t: %d", compteur++, temperature);
  ecranLCD.print(msg);
  */

  // Exemple 04 - Les nombres réels
  // La fonction sprintf de Arduino IDE ne supporte pas les nombres réels (float, double)
  /*
  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_1);
  sprintf(msg, "PI = %f", pi);
  ecranLCD.print(msg); 
  */

  // Voici une solution
  /*
    ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_1);
    #define LONGUEUR_CHAINE 8
    #define NB_DECIMALES    6
    char szF[LONGUEUR_CHAINE + 1];
    dtostrf( pi, LONGUEUR_CHAINE, NB_DECIMALES, szF );
    sprintf( msg, "PI = %s", szF );
    ecranLCD.print(msg); 
  */
} // loop()