/***********************************************************************************************
*Un affichage original, façon galvanomètre longitudinal, avec un afficheur LCD 2 lignes de 16  *
* caractères. en sovoir plus sur:                                                              *
* https://www.amazing-vacuum-tubes.com/pages/et-entre-autre/un-galvanometre-sur-lcd-2x16.html  *
***********************************************************************************************/
#include <LiquidCrystal.h>  // Bibliothèqu de gestion d'écran

// Raccordement de l'écran (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(11, 12, A5, A4, A3, A2);
int backLight = A1 ;  // Cmde du retroeclairage

// Echelle graduée avec 8 espaces pour le défilement du début et de la fin
String echelle = "        0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%        ";

void setup() {
  // Initialisation de l'afficheur
  lcd.begin(16, 2);

  // Allume le rétroéclairage
  pinMode (backLight,OUTPUT);
  digitalWrite (backLight, HIGH);
  
  // Création du curseur flèche vers le haut
  byte curseur[8] = {
    B00100,
    B01110,
    B11111,
    B00100,
    B00100,
    B00100,
    B00100,
    B00100
  };
  lcd.createChar(1, curseur);
}

void loop() {
  // Lecture d'une valeur analogique sur l'entrée A0 (0 à 100)
  int valeur = analogRead(A0); 
  int valeurMapper = map(valeur, 0, 1023, 0, 50); // Ajuster selon la longueur de la Chaîne de caractères

  // On extrait 16 caractères de la chaîne "echelle" selon la valeur
  String affichage = echelle.substring(valeurMapper, valeurMapper + 16);

  // Ligne 1 : L'échelle qui glisse de gauche à droite et réciproquement
  lcd.setCursor(0, 0);
  lcd.print(affichage);

  // Ligne 2 : Le curseur fixe au centre (caractère 7 ou 8)
  lcd.setCursor(7, 1);
  lcd.write(byte(1)); 
  
  delay(150); // Fluidité du mouvement
}
