[BAC] Compter des impulsions

Bonjour !

J'ai pour projet de monter une station météo dans laquelle j'aimerais récupérer la vitesse du vent.
J'utilise : - une carte Arduino uno

J'ai fais quelques recherches pour essayer de composer moi même, par exemple une fonction attachInterrupt(), des façon de compter par impulsion avec un des Input dans une broche mais sans réellement comprendre n'y obtenir de résultats...

Pouvez vous me donner un coup de main svp ?

Il y a un exemple ici, qui tient en 12 lignes de code...

attachinterrupt c'est chouette mais ça fait appel aux interruptions.
Sans mauvais jeu de mots, tu interromps quoi? Si ton montage sert uniquement à compter les impulsions, ou MIEUX le TEMPS entre les impulsions, il y a pulseIn. C'est vraiment simple à utiliser. A voir selon ton besoin.
Et ça tient en une ligne :stuck_out_tongue:

J'ai besoin de déterminer une vitesse, il me faut donc le nombre d'impulsions.

pulseIn renvoie seulement le temps de l'impulsion, comment je peux calculer une vitesse à partir ça ?

Si tu sais les détecter, il suffit de les compter. Si tu connais le nombre d'impulsions pendant une durée donnée, tu peux calculer la vitesse angulaire de ton anémomètre. Si tu connais la vitesse angulaire, tu peux en déduire la vitesse du vent (voir la datasheet de ton anémomètre).

Woxet:
J'ai besoin de déterminer une vitesse, il me faut donc le nombre d'impulsions.

pulseIn renvoie seulement le temps de l'impulsion, comment je peux calculer une vitesse à partir ça ?

Bonjour,

pulseIn n'est pas adapté pour compter les impulsions (ni même pour mesurer la période).
Pour compter le nombre d'impulsions il faut compter le nombre de fronts montants (ou descendants) soit par polling soit par interruption, ce qui à mon avis est plus simple et plus précis.

Woxet:
J'ai besoin de déterminer une vitesse, il me faut donc le nombre d'impulsions.

pulseIn renvoie seulement le temps de l'impulsion, comment je peux calculer une vitesse à partir ça ?

Si une impulsion met 1000ms à arriver, t'en as une par seconde...

kamill:
Bonjour,

pulseIn n'est pas adapté pour compter les impulsions (ni même pour mesurer la période).
Pour compter le nombre d'impulsions il faut compter le nombre de fronts montants (ou descendants) soit par polling soit par interruption, ce qui à mon avis est plus simple et plus précis.

Première nouvelle. PulseIn m'a bien satisfait quand j'ai fait mon compte tour, le temps entre les impulsion est donné directement. Tout dépend de l'utilisation qu'il veut en faire...

pulseIn ne donne pas le temps entre deux impulsions, mais la durée de l'impulsion.

Pour avoir le temps entre deux impulsions (période), il faudrait ajouter la durée de l'impulsion HIGH et la durée de l'impulsion LOW.

  long periode=pulseIn(pin,HIGH)+pulseIn(pin,LOW);

Le gros problème est que le deuxième pulseIn n'est pas fait sur la même période que le premier puisqu'il faut attendre le front descendant suivant.
Ceci a pour conséquence que la période mesurée est approximative (peut peu-être être négligé si la période est assez stable) et surtout qu'on ne peut faire une mesure que toutes les 3 périodes.

De plus le programme est bloqué durant la mesure.

Ahhhh, voilà. bah tu vois, ça, je l'avais pas saisi. Ok merci
Bon bah ca pue les interruptions :s Depuis que j'évite ce sujet...

Du coup comment dois-je éditer mon code car à vrai dire je suis un peu perdu ^^'

Difficile de répondre sans voir le code...

Justement, pour concevoir mon code, j’aimerais savoir quelle fonction utiliser pour obtenir mon compteur

Réf et datasheet du capteur pour savoir ce qu'il renvoie? Il marche par effet hall?

Des codes j'en ai trouvé trois sur Gogol sans fouiller, en 5 secondes :wink:

Comme dit plus haut :

Il y a un exemple ici, qui tient en 11 lignes de code...

Et ça compte les impulsions : tu peux prendre ça comme base de programmation. Le capteur est connecté sur la broche 2, qui utilise l'interruption externe 0.

volatile int comptageImpulsion = 0; // variable accessible dans la routine interruption externe 0

void setup()   {
  Serial.begin(115200); // initialise connexion série à 115200 bauds
  attachInterrupt(0, gestionINT0, RISING); // attache l'interruption externe n°0 à la fonction gestionINT0()
}

void loop() {
  // tout se passe dans la fonction de gestion de l'interruption externe
}

void gestionINT0() {// la fonction appelée par l'interruption externe n°0
  Serial.print("Nombre impulsions = ");
  Serial.println(comptageImpulsion);
}