rerbonds de contact

Bonjour,

J'ai crée un petit bout de programme pour compter le nombre de tour de roue que je fais sur mon home trainer pendant 15'.
J'ai installé un détecteur magnétique qui fonctionne avec l'aimant de mon compteur.
J'ai pris le front montant du contact et j'additionne bêtement un compteur.
Je ressort le tout sur un ecran lcd.
Le programme fonctionne bien tant que je ne part pas en sprinte, à partir là, il loupait un maximum de front.
J'ai donc opté pour l'interruption qui fonctionne très bien, même en sprinte, les changements d'états sont vues.
Mais car il y à un mais, il détecte le rebonds de mon contact et il compte de manière aléatoire.

Ma question est la suivante, comment faire un filtre pour ne plus prendre en compte le rebond

merci d'avance pour vos réponses.

cordialement.

Bonjour,

C'est quoi comme détecteur magnétique?
Si tu veux qu'on puisse t'aider, mets ton code.
Le principe du filtrage est simple: dans l'interruption: tu testes combien de temps s'est écoulé depuis la dernière interruption et si le temps est trop court tu ne prend pas en compte l'interruption.

// Déclaration de entrées et sorties
bool CAPTEURVELO1 = 2;



/************* Déclaration des variables globales **************/
int compteurVelo1= 0;
boolean etatCapteurVelo1=LOW;
int memoireFrontVelo1=LOW;

void setup() 
{
    Serial.begin(115200);
    Serial.println ( " début de la communication");
  Velo1();
  
}
  
void loop() {   }

 void Velo1()
 {
  attachInterrupt(digitalPinToInterrupt(CAPTEURVELO1), Velo11, RISING);}

  void Velo11()
 {
  if((etatCapteurVelo1 != memoireFrontVelo1) && (etatCapteurVelo1 == HIGH))
              {compteurVelo1++;
              Serial.print ( " compteurVelo1 = ");
              Serial.println (compteurVelo1);}
                    memoireFrontVelo1 = etatCapteurVelo1; 
                    
    
}

Bonjour,
Je comprends votre explication mais je n'arrive pas le programmer.
j'ai tester avec delay puis millis mais le résultat n'était pas probant.

ça

 if((etatCapteurVelo1 != memoireFrontVelo1) && (etatCapteurVelo1 == HIGH))

Ça ne sert a rien. Quand tu entres en interruption tu es sur que l’entrée à changé d’état et est à l’état haut.

Pour filtrer l’interruption tu fais quelquechose comme ça:

void Velo11()
{
  static unsigned long lastMillis = 0;
  if (millis() - lastMillis < 20)   // durée mini entre 2 interruptions: 20 ms A ajuster
    return;   // la durée est trop courte -> interruption parasite on ne fait rien
  lastMillis = millis();
  compteurVelo1++;
  Serial.print ( " compteurVelo1 = ");  // à virer de l'it
  Serial.println (compteurVelo1);  // à virer de l'it
}

Une interruption doit être la plus courte possible et ne pas faire appel à une autre fonction qui utilise les interruption (sauf à le gérer finement). En particulier il ne faut pas faire d’affichage en interruption.
L’affichage doit être fait dans la loop

Bonsoir

Pourquoi ne pas mettre un filtre passe bas (une résistance + un condensateur) en sortie du capteur ? Ça supprimerait le rebond

Et quelle est la durée approximative entre deux passages devant l'aimant ?

Et de meme que kamill, le serial.print() prennent beaucoup de temps. Pour un système rapide, je compterais le nombre de tour sur une minute ou 30s et j'afficherais alors le résultat (éventuellement converti en vitesse)

Bonjour
Je reviens vers vous n’ayant pas pu travailler sur le projet avant.
Merci pour vos réponses.

Je n’arrive pas à régler la durée pour n’avoir qu’un seul comptage par tour avec le programme de Kamill.J’incremente de 3 ou 5 mon compteur à chaque fois.

La durée entre 2 passage sur je prends 60km/h cela me donne 16,66 m/s sachant qu’un tour de roue fait 2,133m j’arrive un temps de 0,128s.
Je dirai une impulsion toutes les 100ms.

Pour le filtre je ne suis pas contre mais comment calculer les valeurs des Résistances et condensateurs???

Personnellement, je les choisis au pif pour commencer en je les ajuste si ça ne marche pas. Mais en général ça marche

Pour être sur de mesurer une impulsion toute les 100ms, je veux un constante de temps au plus 10 fois plus faible. Soit tau < 10ms

Avec tau = RC

Avec C = 100 nF (c’est ce qui traine dans ma boîte a composant)
J’obtiens R < 100 kohm

Bref, je prendrais une résistance de 10k (parce que j’en ai beaucoup en stock)

D’accord je vais regarder ce que j’ai et en terme de tension?

Question : de quel type de contact parles tu. Est-ce que c'est un contact sec et comment est t-il utilisé ?
Est ce qu'il y a déjà une résistance en série soit avec la masse (utilisation peu fréquente mais qui fonctionne tout aussi bien) ou avec l'alim (utilisation plus fréquente parce qu'elle permet d'utiliser les résistance de "pull-up", ou "de tirage" en français, interne des microcontroleur Atmel qui sont dépourvus de "pull-down".

Bonjour
Oui il s’agit d’un contact sec branché en pullup sur l’entrée 2 de làrduino uno pour traiter l’interruption.