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
}
}