Problème anémomètre

Bonsoir, je suis actuellement en plein projet pour mon bac, et dans mon projet je dois récupérer la vitesse du vent d'un anémomètre.

Anémomètre en question : https://www.sparkfun.com/products/8942

J'ai trouvé sur internet le programme qui me semble le plus judicieux pour récupérer la vitesse du vent, mais le problème c'est que l'afficheur de série ne m'affiche rien, page blanche. :o

Code:

unsigned long tempsDebut;  // passage précédent de l'aimant

int etatPrecedent;  // lors de du dernier passage dans le loop,
                    // l'aimant était là, ou pas? 

void setup() {
  pinMode(8, INPUT);   // interrupteur Reed à la pin 8
  pinMode(13,OUTPUT);  // LED indicatrice à la pin 13
  Serial.begin(9600);  // moniteur série
  etatPrecedent = digitalRead(8); // on vérifie si l'aimant est là ou pas
}

void loop() {

  int etat, delai;
  unsigned long tempsFin;

  etat = digitalRead(8);  // on vérifie si l'aimant est là ou pas
  
  digitalWrite(13,etat);

  if ((etat) && (!etatPrecedent)){ // l'aimant vient d'arriver
    if (tempsDebut > 0){  // nous connaissons le moment du début de ce tour
      tempsFin = millis();  // quelle heure est-il?
      delai = tempsFin - tempsDebut;  // durée du tour qui vient de se terminer
      Serial.print("Periode :" );
      Serial.print(delai);
      Serial.print("  millisecondes,  Vitesse :");    
      Serial.print(36*2*3.1416*0.15*1000/delai);
      // (cette vitesse ne tient pas compte de la fonction d'étalonnage)
      Serial.println(" km/h");        
    }
    
    tempsDebut = tempsFin;  // mise à jour de la variable
  }
  
  etatPrecedent = etat;  // mise à jour de la variable
}

Source : http://electroniqueamateur.blogspot.fr/2016/06/fabrication-dun-anemometre-arduino.html

Pourtant j'ai bien vérifier le nombre de bauds, les ports, COM,autre PC, ect... mais rien n'y fais. J'ai alors essayer de supprimer quelque ligne à la fin, pour voir si l'afficheur afficher quelque choses, et cela fonctionne, mais malheureusement cela m'aide pas de déterminer la vitesse du vent vu que ces lignes sont importante pour le fonctionnement du programme.

Si vous pouvez m'aider à résoudre le problème d'affichage du moniteur série ou de trouver une autres solutions qui permet de déterminer la vitesse du vents , je vous serais très reconnaissent. :D

Bonjour,

Ton programme doit fonctionner (même si la méthode utilisée n'est pas la plus précise). Tu n'as des affichages que si tu as des impulsions en entrée. Tu es sur que ton anémomètre tourne et envoi des impulsions?

hello
ton moniteur est bien initialisé en 9600 bauds? ( voir en bas à droite de la fenêtre du moniteur)

Oui , mon anémomètre envoie bien des impulsions , j'ai vérifier en analogRead et avec un ossilo, j'ai bien des signaux de type carré a chaque passage du courant.

Je suis bien aussi à 9600 bauds, j'ai demandé à mon prof mais il n'a pas pu vraiment m'aider, c'était je crois au dessus de ces capacités.

Pouvez vous Essayer chez vous mon code, vous verrez dans votre moniteur que rien ne s'affiche , même si vous avez pas d'anémomètre, il aurait du afficher quelque choses.

hello
ton code dans un uno, rien sur le moniteur.

en mettant simplement un bout de cable dans l’entrée 8, le moniteur se remplit

J'ai essayé avec un générateur et pas de problème.

refait avec un générateur sur 1 Hz

Capture_1hz.PNG

Ton capteur est connecté comment ?

Effectivement cela fonctionne pour vous, malheureusement je suis pas chez moi et je n'est pas d'arduino sur le moment. Je vais essayer se weekend et je vous tien au courant.

Je vous poste d'ici 5min la photo de mon montage cablage que j'avais prise avant de partir. Encore merci de m'aider :D

Voici le montage http://www.noelshack.com/2017-12-1490300925-img-20170323-175302.jpg

Et http://www.noelshack.com/2017-12-1490301025-img-20170323-175252.jpg

Je sais pas si vous arriver à voir complètement le câblage.

hello à priori, ton cablage est correct la partie led et sa résistance n'était pas obligatoire puisque tu as déjà une led sur la platine arduino qui est raccordée sur la patte 13

on voit bien que l'entrée 8 est à GND par une résistance en push down on suppose que le fil rouge plus 5 V va vers le contact sec de l'ils de ton anémomètre et que le retour d'info se fait par le fil vert qui est raccordé à l'entrée 8.

non, tout semble correct

quelle valeur la résistance en push down?

Effectivement, le câblage semble correct. Mais avec une breadboard, un faux contact est vite arrivé. Je te conseille d'afficher l'état de l'entrée avec Serial.print(digitalRead(8));. En tournant les pales de l'anémomètre à la main, ça doit passer de 0 à 1.

J'ai une alternative pour le programme, j'avais le même problème mais il n'affichait pas les données dans le moniteur série

unsigned long temps1; // passage précédent de l'aimant unsigned long temps2;

int etatPrecedent; // lors de du dernier passage dans le loop, // Présence de l'aimant? int etat; int delai;

void setup() { pinMode(2, INPUT); // interrupteur ILS en entrée 2 pinMode(13, OUTPUT); // LED indicatrice à la pin 13 Serial.begin(9600); // moniteur série Serial.println("Begin"); attachInterrupt(digitalPinToInterrupt(2), Interruption, CHANGE); //etatPrecedent = digitalRead(2); // on vérifie si l'aimant est là ou pas }

void loop() { noInterrupts(); unsigned long dt = temps2 - temps1; // durée du tour qui vient de se terminer interrupts();

Serial.print("Periode :"); Serial.print(dt); Serial.print(" millisecondes, Vitesse :"); Serial.print(36 * 2 * 3.1416 * 0.15 * 1000 / dt); // (cette vitesse ne tient pas compte de la fonction d'étalonnage) Serial.println(" km/h"); delay(1000); }

void Interruption() { temps1 = temps2; temps2 = millis(); }

Le problème est qu'il n'affiche pas les bonnes valeurs, je pense que l'erreur vient du mode CHANGE dans la ligne

attachInterrupt(digitalPinToInterrupt(2), Interruption, CHANGE);

au démarrage tempsDebut est nul et donc on ne rentre jamais dans le if et on ne met pas temps 2 à jour et donc …

J'ai donc opté pour ce programme qui est plus précis:

unsigned long temps1; // passage précédent de l'aimant unsigned long temps2;

int etatPrecedent; // lors de du dernier passage dans le loop, // Présence de l'aimant? int etat; int delai;

void setup() { pinMode(2, INPUT); // interrupteur ILS en entrée 2 pinMode(13, OUTPUT); // LED indicatrice à la pin 13 Serial.begin(9600); // moniteur série Serial.println("Begin"); attachInterrupt(digitalPinToInterrupt(2), Interruption, RISING); //etatPrecedent = digitalRead(2); // on vérifie si l'aimant est là ou pas }

void loop() { noInterrupts(); unsigned long dt = temps2 - temps1; // durée du tour qui vient de se terminer interrupts();

Serial.print("Periode :"); Serial.print(dt); Serial.print(" millisecondes, Vitesse :"); Serial.print(36 * 2 * 3.1416 * 0.15 * 1000 / dt); // (cette vitesse ne tient pas compte de la fonction d'étalonnage) Serial.println(" km/h"); delay(1000); }

void Interruption() { temps1 = temps2; temps2 = millis(); }

Le problème maintenant est que le moniteur série m'affiche ceci, lorsque l'anémomètre tourne ou non:

|500x199

Bonjour,

Il faut que tu ajoutes un flag pour indiquer qu'une mesure a été faite

unsigned long temps1;  // passage précédent de l'aimant
unsigned long temps2;
bool flagMesure=false;

// Présence de l'aimant?
unsigned long delai;

void setup() {
 pinMode(2, INPUT);   // interrupteur ILS en entrée 2
 pinMode(13, OUTPUT); // LED indicatrice à la pin 13
 Serial.begin(9600);  // moniteur série
 Serial.println("Begin");
 attachInterrupt(digitalPinToInterrupt(2), Interruption, RISING);
}

void loop() {
 if (flagMesure)
 {
   noInterrupts();
   unsigned long dt = temps2 - temps1; // durée du tour qui vient de se terminer
   flagMesure=false;
   interrupts();

   Serial.print("Periode :");
   Serial.print(dt);
   Serial.print("  millisecondes,  Vitesse :");
   Serial.print(36 * 2 * 3.1416 * 0.15 * 1000 / dt);
   // (cette vitesse ne tient pas compte de la fonction d'étalonnage)
   Serial.println(" km/h");
 }
}

void Interruption() {
 temps1 = temps2;
 temps2 = millis();
 flagMesure=true;
}

Remarque:

Tu es en train de squatter le sujet de Hapghan au lieu de continuer sur le tien

Je viens d’appliquer ce programme et le moniteur série m’affiche des valeurs
Je ne sais pas si elles sont cohérentes et il m’affiche toujours des “inf”, savez vous comment les éliminer au maximum pour plus de visibilité ?

Voilà une capteur de ce qu’il m’est affiché maintenant

Tu as bien un pullup (dans l'anémomètre ou externe)?

Dans le doute, tu peux essayer d'activer le pullup interne

pinMode(2, INPUT_PULLUP);   // interrupteur ILS en entrée 2

Il se peut aussi que l'ILS ait du rebond, dans ce cas il faudrait faire un filtrage