/****************************************************************************************************
*Pour évaluer l'hygrométrie du sol de vos plantes, un ATMega328P et un LCD 2 lignes 16 caractères   *
* à affichage longitudinal type galvanométre à échelle mobile de 0 à 100 %                          *
* https://www.amazing-vacuum-tubes.com/pages/pour-y-arriver/hygrometre-pour-les-fleurs-en-pots.html *
****************************************************************************************************/
#include <LiquidCrystal.h>  // Bibliothèqu de gestion d'écran

// Raccordement de l'écran (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(2, 3, 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, 69); // 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));

  // Ligne 2 : L'unité à droite du curseur
  lcd.setCursor(10, 1); 
  lcd.print("%");
  
  delay(150); // Fluidité du mouvement
}
