Problème de compteur qui bloquerait une lecture de valeur

Bonjour,
Étant en train d'essayer d'établir mon programme, je me suis rendu compte d'un problème.
Je voudrais que ma carte arduino lise l'état d'une entrée (capteur), tout en effectuant un décompte de 30 secondes par exemple. Plus précisément je voudrais savoir combien de fois le capteur a capté pendant uniquement 30 secondes.

Voici mon programme :

int timer = 30 ;
int score = 0 ;

while (timer>0) {
  if (digitalRead(Capteur) == HIGH) {
    score = score + 2
  }
  delay(1000);
  timer--;
  affichertimer();
  afficherscore();

En l'écrivant, je me suis rendu compte que la carte va vérifier en très peu de temps l'entrée, puis s'arrêter 1 seconde de vérifier, alors que pendant cette seconde le capteur pourrait très bien commuter 1 ou 2 fois (ce serait pour capter le passage de ballon plutôt rapide).
Donc mes résultats seraient faussés, si quelqu'un pourrait m'aiguiller sur une option disponible afin de pouvoir mettre en place un compte à rebours, tout en vérifiant constamment l'état du capteur.

Merci d'avance.
vmtlsh

Il faut utiliser millis(), qui compte les millisecondes écoulées depuis le lancement du code.

unsigned long chrono = 0;
int score = 0;

void setup() {
 // ici d'autres instructions
  chrono = millis();
}

void loop() {
  while (millis() - chrono < 30000ul) {
    if (digitalRead(Capteur) == HIGH) score += 2;
  }
}

Ca c'est la version simple. Il manque l'affichage, car ces fonctions peuvent prendre du temps et empêcher une lecture de capteur. Il faut savoir ce que font ces fonctions pour les inclure dans le code.

1 Like

Merci beaucoup !
Lorsque j'éteins et rallume ma carte arduino, la fonction millis() reviendra donc à chaque fois à 0 c'est bien ça ?

Oui

1 Like

Oui, il y aussi lorsque tu as atteints le temps possible avec un entier sur 32bits, un peu moins de 50 jours(4294967295 ms).
Mais son utilisation est plus sur une différence entre deux appels.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.