Chronométrage d'une LED à l'aide de bouton poussoir

Bonjour,

j'ai un souci avec mon programme, il s'agit d'un chronomètre qui compte le temps d'allumage d'une LED en appuyant sur un bouton poussoir , affiche le temps mesuré et ensuite transfère chaque mesure dans un tableau de 4 cases le tout sur un écran LCD . En effet, lorsque je l'implémente sur l'Arduino, et que le chronomètre effectue le comptage pour la LED active, et en appuyant sur le bouton poussoir , j'ai remarqué qu'à partir de 10 secondes d'allumage de la LED , l'écran affiche les 10 secondes et le "s" de secondes se reproduit 2 fois, ce phénomène se répète dans le tableau quand il le transfère et toutes les valeurs mesurées après les 10 s , apparaissent sur l'ecran avec les deux "s" . Pouvez vous m'aider à résoudre ce problème d'affichage?

voici le code ci-dessous

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Initialisation de l'écran LCD (adresse I2C, taille 20x4)
LiquidCrystal_I2C lcd(0x3F, 20, 4);

// Broches
const int bouton = 4;   // Bouton poussoir
const int led = 12;     // LED

// Variables
int etatbouton;             // Variable pour stocker l'état du bouton
unsigned long startTime = 0;  // Temps de début d'allumage
unsigned long totalTime = 0;  // Temps total d'allumage en millisecondes
bool isLedOn = false;         // État de la LED
unsigned long lastUpdate = 0; // Temps de la dernière mise à jour (1 minute)

//Variable du Timer pour la comparaision des mesures de Temps de Cavitation------------------------------------
#define mes 4
// Tableau pour stocker 4 valeurs mesurées
unsigned long valeurs[mes] = {0, 0, 0, 0};

void setup() {
  pinMode(bouton, INPUT);     // Configurer le bouton en entrée
  pinMode(led, OUTPUT);       // Configurer la LED en sortie
  etatbouton = LOW;           // Initialiser la variable du bouton
  Serial.begin(9600);         // Initialiser la communication série

  lcd.init();                 // Initialiser l'écran LCD
  lcd.backlight();            // Activer le rétroéclairage
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Chrono LED Ready");
  delay(500);                // Attente avant de commencer
  lcd.clear();
}

void loop() {
  etatbouton = digitalRead(bouton); // Lire l'état du bouton

  if (etatbouton == HIGH) {
    if (!isLedOn) {
      // Si le bouton est pressé et que la LED est éteinte
      isLedOn = true;
      startTime = millis(); // Enregistrer le temps de démarrage
    }
    digitalWrite(led, HIGH); // Allumer la LED
  } else {
    if (isLedOn) {
      // Si le bouton est relâché et que la LED était allumée
      isLedOn = false;
      totalTime += millis() - startTime; // Ajouter le temps écoulé au total
    }
    digitalWrite(led, LOW); // Éteindre la LED
  }

  // Afficher le temps d'allumage en cours
  if (isLedOn) {
    unsigned long elapsed = (millis() - startTime + totalTime) / 1000; // Temps en secondes
    lcd.setCursor(0, 0);
    lcd.print("TeC: ");
    lcd.print(elapsed);
    lcd.print(" s");
    
  } else {
    lcd.setCursor(0, 0);
    lcd.print("TeC: ");
  }

  // Vérifier si 1 minute est écoulée pour afficher le temps total
  if (millis() - lastUpdate >= 15000) { 
    lastUpdate = millis(); // Réinitialiser le temps de la dernière mise à jour

    // Calculer et afficher le temps total
    unsigned long totalSeconds = totalTime / 1000; // Temps total en secondes
    lcd.setCursor(0, 1);
    lcd.print("Temps total: ");
    lcd.print(totalSeconds);
    lcd.print(" s");

    // Décalage des valeurs dans le tableau pour enregistrer le nouveau temps d'allumage
    for (int i = 3; i > 0; i--) {
      valeurs[i] = valeurs[i - 1]; // Décaler les valeurs vers la droite
    }
    valeurs[0] = totalSeconds;


// Affichage des quatre derniers temps d'allumage
     //Affichage
    lcd.setCursor(0, 1);
    for (int i = 0; i < 4; i++) {
      lcd.print(valeurs[i]);
      lcd.print(" s");
       if (i < 3) lcd.print(",");}
  
    totalTime =0;
      


    // Éventuellement, mettre une pause pour afficher les données
    delay(500); // Pause de 3 secondes pour lire les données
   
  }
}

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Bonjour k-cd

Essaies d'écrire ainsi:
lcd.print(" s ");
Avec un espace à droite.

Cordialement
jpbbricole

Bonjour,

Je l'ai fait , il marche à merveille. Merci beaucoup
peux tu savoir la raison de cette anomalie?

Merci pour la remarque, c'est noté.

Bonjour k-cd

C'est un grand classique de l'affichage LCD :wink:

Si tu affiches 122 s et qu'ensuite tu affiches 99 s la fin de ton affichage a "reculé" d'une case, de ce fait l'affichage avec les nouvelles données ne concerne plus la fin de l'ancien affichage donc le s précédent reste.
Il faudrait même écrire:
lcd.print(" s ");
avec 2 espaces en fin si tu veux passer de 100 à 5, par exemple.

Ais je été assez clair :wink:

Cordialement
jpbbricole

Merci beaucoup pour cette astuce, j'ai compris.

Super, bonne continuation :wink: