Mesurer la durée entre deux états de deux capteurs

Bonjour,

Je voudrais mesurer une durée entre deux états de deux capteurs différents :
capteur 1 passe de high à low, je lance le chrono
capteur 2 passe de low à high, je coupe le chrono et affiche la durée sur le moniteur série

j’essaye depuis plusieurs jours de le faire avec la fonction millis() mais je n’arrive pas au résultat souhaité.

Quelqu’un peut il me dire ce qui ne va pas dans mon code ?

const int pinBouton = 6;
const int pinBouton2 = 5;
const int ledPin = 13;
unsigned long deb=0;
unsigned long start=0;
int nombreDeDetection = 0;
byte etatBouton = 0;
byte etatBouton2 = 0;
byte dernierEtatBouton = 0;
byte dernierEtatBouton2 = 0;


void setup() {
  pinMode(pinBouton, INPUT_PULLUP);
  pinMode(pinBouton2, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
  deb= millis();
}


void loop() {
  etatBouton = digitalRead(pinBouton);
  etatBouton2 = digitalRead(pinBouton2);
   
 if (etatBouton != dernierEtatBouton) {
    if (etatBouton == HIGH && etatBouton2 == LOW) { //test si bouton 1 allumé et bouton 2 éteint alors
    while (etatBouton ==LOW && etatBouton2 == HIGH) ;   
     start = (millis() - deb);                     // chrono commence

      Serial.println("durée action 1");
      Serial.println(start);
      }
         // dernierEtatBouton = etatBouton;

        }

bonsoir,

si à un instant "t" tes boutons sont lus et testés dans un état (chacun le sien) ils ne peuvent pas être testés tout de suite après dans les états inverses sans nouvelle lecture !

Il y une contradiction pour étatbouton2 entre les boucles if et while.

Pour savoir si un bouton passe d’un état low à un état high, il faut comparer son état avec un un état précédent.
Quelque chose du genre :

bool nouvelEtat = digitalRead(pinBouton); // lecture de l’etat du bouton

if (!etat et nouvelEtat){ // le bouton passe de bas à haut
     chronoStart = millis(); // déclenchement du chrono (**)
}
etat = nouvelEtat; // mise à jour de l'état Du bouton

L’arret Du chrono, il faut remplacer (**) par exemple par :
DureeChrono = millis() - chronoStart;
Serial.println(dureeChrono);

Ma remarque habituelle :

  • Tu pars bille en tête sur l'utilisation de la fonction millis.
  • Tu n'as nulle part indiqué la gamme de temps à mesurer.

As tu estimé le temps min et le temps max ?
C'est à mon avis le point de départ essentiel.

Je n'ai pas, à priori, d'inquiétude sur la capacité de millis() a faire ce que tu veux. Mais d'une façon générale si dans un projet on fixe le moyen de mesure avant de borner ce qu'il y a à mesurer, c'est risquer d'aller droit dans une impasse.