Calculer le temps entre deux états

Bonjour à tous, je viens vous déranger car je ne trouve vraiment pas la solution par moi même. J'essaye de faire une petit programme tout bête, qui s'incrémente de +1 à chaque pression d'un bouton poussoir.

Je voudrais ensuite calculer le temps qui s'écoule entre deux pressions. J'ai essayé d'utiliser la fonction timer, mais pas moyen d'obtenir ce que je veux

J'ai tenté avec ça:

static unsigned dureeAllumage=0;
static unsigned debutAllumage=millis();
dureeAllumage+=millis()-debutAllumage;

Mais pas moyen de calculer mon temps entre deux pressions :cry:

Voici mon programme:

const int pinBouton = 6;
const int ledPin = 13;



int nombreDeDetection = 0;
int etatBouton = 0;
int dernierEtatBouton = 0;

void setup() {

  pinMode(pinBouton, INPUT_PULLUP);

  pinMode(ledPin, OUTPUT);

  Serial.begin(9600);
}


void loop() {

  etatBouton = digitalRead(pinBouton);


  if (etatBouton != dernierEtatBouton) {

    if (etatBouton == LOW) {

      nombreDeDetection++;

      Serial.println("Detection pression");
      Serial.println("_______________");
      Serial.println();
      Serial.print("Nombre de pression: ");
      Serial.println(nombreDeDetection, DEC);
      Serial.println();

      digitalWrite(ledPin, HIGH);
    }


    else {

      digitalWrite(ledPin, LOW);
      Serial.println();
      Serial.println("_______________");
      Serial.println();
      Serial.println("En attente de pression");
      Serial.println("_______________");
      Serial.println();
      Serial.println();

    }
    dernierEtatBouton = etatBouton;
  }

}

J'ai retiré mes tentatives infructueuse du code

Un grand merci du coup de main!

hello le motard

il te faudra jouer avec micros() plutôt que millis()

const int pinBouton = 6;
const int ledPin = 13;
unsigned long dureeAllumage=0;
unsigned long deb=0;
int nombreDeDetection = 0;
byte etatBouton = 0;
byte dernierEtatBouton = 0;

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


void loop() {

  etatBouton = digitalRead(pinBouton);
  if (etatBouton != dernierEtatBouton) {
    if (etatBouton == LOW) {
      dureeAllumage = (millis()-deb);// voir micro()
      deb= millis();
      nombreDeDetection++;
      Serial.println("Detection pression");
      Serial.println("_______________");
      Serial.println();
      Serial.print("Nombre de pression: ");
      Serial.println(nombreDeDetection, DEC);
      Serial.println();
      Serial.println(dureeAllumage);
      digitalWrite(ledPin, HIGH);  
    }
    else {
      digitalWrite(ledPin, LOW);
      Serial.println();
      Serial.println("_______________");
      Serial.println();
      Serial.println("En attente de pression");
      Serial.println("_______________");
      Serial.println();
      Serial.println();
    }
    dernierEtatBouton = etatBouton;
  }
}

Je marche sur des œufs vu les dernières réactions de certains demandeurs.

Pour mesurer un temps la solution va dépendre de la valeur du temps à mesurer.
On ne mesure pas de la même façon quelques cycles horloges, quelque µs, quelque ms, quelques s ou quelques heures.

As tu déjà une idée de la valeur que tu veux mesurer ?

Si non, il faut des essais

  • commencer avec millis(),
  • si ce n'est passer précis essayer micro(). Attention micro() a un pas de mesure de 4µs --> c'est uniquement dû à la configuration "en mode arduino" du timer 0.
  • si le temps est encore plus court et peut se mesurer en cycles horloges passer par la lecture du compteur d'un timer correctement configuré.

Tu fais ton choix et si tu as besoin d'aide indique sur quelle méthode il te l'a faut.

je pense que notre ami se penche sur l'allumage de sa moto

Désolé l'allumage dans un moteur ne me dit absolument rien.
La seule indication qui me parle c'est la valeur de la gamme de temps à mesurer.

Merci à vous deux! J'ai même mon petit surnom et tout maintenant :stuck_out_tongue: D'ailleurs j'ai vendue ma belle bleue (avec son montage qui est maintenant étanche, et 0 problèmes ni dégâts a signaler après démontage)

Non plus sérieusement, j'ai un petit projet qui touche à l'allumage d'un véhicule dans un coin de ma tête, mais non, pas cette fois-çi

Dans le cadre des mes études pour l'équipe de Kart de mon IUT, on m'a demandé si je pouvais faire un compteur de tours effectués sur piste, à l'aide d'une led IR et d'un TSOP32138. Donc pour cette partie là, pas de problème, c'est fait depuis un petit moment.

Mais je me suis dit, pourquoi ne pas ajouté les temps fait pour chaque tours

Exemple: nombre de tours effectués: 2 - Temps pour le tour 2: 1min32

C'est pour cette raison que j'ai voulu essayer d'utiliser millis(), pour pouvoir au moins utiliser quelques minutes. Mais c'est ma 1ière expérience avec la gestion de temps en arduino, et je vous avoue que mes 1iers essais n'ont pas été fameux :stuck_out_tongue:

millis() indique le temps écoulé depuis le démarage du timer 0.
millis() déborde au bout d'environ 30 jours il me semble avoir lu (à vérifier).

Il suffit d'enregistrer la valeur de millis à chaque passage et de faire la différence avec la valeur enregistrée au tour précédent.
Tout va dépendre du traitement que tu va faire sur cette différence exprimée en milliseconde pour obtenir un résultat en minute, secondes, et dixième de seconde.
Voir division classique et division entière.

Pour des temps de l'ordre de la minute et si tu n'a pas besoin d'une précision inférieure à la seconde tu as aussi la solution d'une horloge externe (RTC = real clock time).
Comme par exemple la DS3231 ( il faut oublier la DS1307) qui s'interroge en I2C, elle accepte même le mode "fast I2C" à 400 kHz au lieu des 100 kHz classiques.
Et là tu obtiendra directement les valeurs heures, minutes, seconde, mais pas de 1/10 de seconde ce n'est pas disponible.

Je vais tenter avec millis(), ça me paraît être la solution la plus simple (surtout pour l'usage simpliste)

Je vais me repencher dessus demain matin, merci des conseils

J'ai testé avec ta méthode dfgh, c'est parfait! J'ai pu finioler comme je le voulais

Un grand merci!

cool, toujours sympa d'avoir un retour :slight_smile: