Durée d'allumage d'une diode

Bonjour,
Je suis en train d'essayer de faire un programme qui me calcule la durée d'allumage d'une diode.
Concrètement, j'ai une photorésistante qui vérifie si la luminosité descend en dessous d'une certaine valeur. Si c'est île cas, une diode verte s'allume. Et là je voudrai vérifier/compter le temps d'allumage de cette diode.
Mon soucis est que dans mon moniteur série, les valeurs du temps compté sont "étranges".

15:27:27.835 -> #####################Début du programme#####################
15:27:32.816 -> Valeur minimale:581
15:27:32.851 -> Valeur maximale:727
15:27:32.885 -> Valeur de départ du chronomètre:0
15:27:32.919 -> 0'' 0
15:27:37.841 -> 0'' 0
15:27:42.858 -> Valeur seuil de 36 dépassée. Allumage de la LED verte pendant: 15'' 22
15:27:47.876 -> Valeur seuil de 41 dépassée. Allumage de la LED verte pendant: 20'' 31
15:27:52.878 -> Valeur seuil de 36 dépassée. Allumage de la LED verte pendant: 25'' 40
15:27:57.922 -> 25'' 40
15:28:02.928 -> 25'' 40
15:28:07.921 -> Valeur seuil de 50 dépassée. Allumage de la LED verte pendant: 40'' 51
15:28:12.927 -> 40'' 51
15:28:17.953 -> 40'' 51

Mon code est le suivant:

int sensorValue;
int sensorLow=1023;
int sensorHigh=0;
const int ledPin = 13;
unsigned long millisecondes; 
unsigned long start;

void setup() {
  Serial.begin(9600);
  start=millis();
  Serial.println("#####################Début du programme#####################");
  pinMode(3,OUTPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);


   // Calibration de la photorésistance
  while (millis() < 5000){
    digitalWrite(3,HIGH);
    sensorValue=analogRead(A0);
    if (sensorValue > sensorHigh){
      sensorHigh = sensorValue;
    }
    if (sensorValue < sensorLow){
      sensorLow = sensorValue;
    }
  }
  Serial.print("Valeur minimale:");
  Serial.println(sensorLow);
  Serial.print("Valeur maximale:");
  Serial.println(sensorHigh);
  Serial.print("Valeur de départ du chronomètre:");
  Serial.println(millisecondes);
  
digitalWrite(ledPin, LOW);
}

void loop() {
  digitalWrite(3,LOW);
  sensorValue = analogRead(A0);
  if (sensorValue < sensorLow / 3){

  // On commence à compter le temps d'allumage de la LED verte.
  millisecondes = millis()-start;
 
    Serial.print("Valeur seuil de ");
    Serial.print(sensorValue);
    Serial.print(" dépassée. Allumage de la LED verte pendant: ");
    digitalWrite(3,HIGH);
     
  }
  Serial.print (( millisecondes / 1000) % 60);      // Affichage des secondes.
  Serial.print ("'' ");
  Serial.println ( millisecondes % 1000);           // Affichage des millièmes de secondes.   
 delay(5000);
}

Quelqu'un aurait une idée?
Petite précision: je débute en Arduino!
Merci!
Antoine

la loop() n'est pas fonctionnelle...

il faut virer le delay() sinon comment voulez vous mesure quoi que ce soit. ensuite il faudrait mémoriser que vous avez commencé à compter et attendre dans ce cas le nouvel état pour faire la différence entre le millis() de départ et de fin

--> c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Merci de ta réponse.
J'ai revu la "logique" de mon code entièrement.
Ça donne ça désormais pour ma loop. En gros, ça calcule le temps pendant lequel je cache la luminosité de ma photorésistance.

void loop() {

  while (compteur <2){
    sensorValue = analogRead(A0);
    
      while (sensorValue <sensorLow /4 && compteur == 0){
        
        if (compteur != 1 && sensorValue <sensorLow /4){
            digitalWrite(3,HIGH);
            compteur = compteur + 1;
            temps_debut=millis();
        }
      }
      
      if (compteur == 1 && sensorValue > sensorHigh /2){
          compteur = compteur + 1;
          temps_fin=millis();
      }
  }
  
  if (compteur == 2){
    duree=temps_fin-temps_debut;
    Serial.print("Durée: ");
    Serial.println(duree);
  }
}

J'imagine que on peut faire beaucoup plus simple.Par contre, le seul hic c'est que dans mon moniteur série, ça boucle sur l'affichage de la durée.
Comment puis-je arrêter ça?

si tu veux arrêter l'affichage fais un

compteur = compteur + 1;

juste après

Serial.println(duree);

comme ça ton compteur sera égal à 3 et du coup tu ne fera plus rien, c'est comme si tu utilise des étapes
étape 0 je fais la 1ere mesure
étape 1 je fais la 2eme mesure et je calcule
étape 2 affiche le résultat
étape 3 ne fait rien ...

modif de ton programme avec le nom de la variable compteur renommée en etape :

void loop() {
  
  sensorValue = analogRead(A0);

  
  if (etape==0) { // mesure début
     if (sensorValue <sensorLow /4){
         digitalWrite(3,HIGH);        
         temps_debut=millis();
         etape=1; // aprés la mesure on change d'étape
      }
  }
  
  if (etape==1){ // mesure fin
     if (sensorValue > sensorHigh /2){
        temps_fin=millis();
        etape=2; // aprés la mesure on change d'étape
      }
  }
  
  if (etape==2){ // affichage
    duree=temps_fin-temps_debut;
    Serial.print("Durée: ");
    Serial.println(duree);    
    etape=0; // retour au début pour une nouvelle mesure
  }


}