#include <LiquidCrystal_I2C.h>

unsigned long previousMillis = 0;  // Stocke le temps écoulé depuis la dernière mise à jour d'affichage
const long interval = 100;         // Intervalle d'affichage en millisecondes
uint16_t Vout;                     // Valeur lue depuis l'AS5600
int16_t angle, previousAngle;       // Angles actuels et précédents
int16_t tour = 0;                 // Compteur de tours
float distance;                   // Distance totale parcourue
float distanceTour = 8.00;        // Distance parcourue par un tour complet de la roue
bool flag = false;                // Drapeau pour la gestion des tours
int cpt;
LiquidCrystal_I2C lcd(0x27, 8, 2); // Initialisation de l'écran LCD avec adresse I2C

void setup() {//**************************************SETUP***************************************************************************

  Serial.begin(115200);           // Initialisation de la communication série
  lcd.init();                     // Initialisation de l'écran LCD
  lcd.backlight();               // Activer le rétroéclairage de l'écran LCD
  lcd.setCursor(0, 0);           // Positionner le curseur à la position (0,0) sur l'écran LCD
  lcd.print("59jag");                             // Afficher un message de bienvenue
  previousAngle = 0.0;                            // Initialiser l'angle précédent à zéro
}

void loop() {//**************************************LOOP******************************************************************************
  
  Vout = analogRead(A0);         // Lecture de la valeur analogique depuis le capteur AS5600
  //angle = (Vout * (36000 / 1024);  // Convertir la valeur lue en angle en degrés
  angle =( map(Vout,1023,0,3596,0)/10);
  int deltaAngle = angle - previousAngle;  // Différence entre l'angle actuel et l'angle précédent

  if (deltaAngle > 180) {            // Passage de 360° à 0° (rotation dans le sens antihoraire)
    tour--;                         // Décrémenter le compteur de tours
  } else if (deltaAngle < -180) {    // Passage de 0° à 360° (rotation dans le sens horaire)
    tour++;                         // Incrémenter le compteur de tours
  }
  
  distance = (distanceTour * tour) + (angle / 360.0) * distanceTour;  // Distance totale en cm

 
 if (millis() - previousMillis >= interval && angle/2 != previousAngle/2) {  // Vérifier si 100ms se sont écoulées et angele different
     previousMillis = millis();                  // Mettre à jour le moment de la dernière mise à jour
     Serial.print(angle);                       // Afficher l'angle actuel
     Serial.print(" degres \t");                // Afficher l'unité de l'angle
     Serial.print(distance);                    // Afficher la distance totale parcourue
     Serial.println(" cm");                     // Afficher l'unité de la distance

     lcd.setCursor(0, 0);                      // Positionner le curseur à la ligne 0 de l'écran LCD
     lcd.print(angle);                         // Afficher le nombre de tours
     lcd.print(" tours   ");                  // Afficher le texte pour le nombre de tours
     lcd.setCursor(0, 1);                      // Positionner le curseur à la ligne 1 de l'écran LCD
     lcd.print(distance, 2);                   // Afficher la distance avec 2 décimales
     lcd.print(" cm    ");                    // Afficher l'unité de la distance
   cpt++;
 }
  previousAngle = angle;                   // Mettre à jour l'angle précédent avec l'angle actuel
}