Capteur anémomètre

Bonjour,

Je souhaite utiliser un capteur anémomètre avec une carte Arduino UNO + une platine Shield Grove acheté chez Lextronic (https://www.lextronic.fr/P36218-capteur-annomtre.html).

J'ai trouvé sur Internet un code qui permet d'afficher la vitesse du vent en m/s dans le moniteur. J'ai retravaillé ce code pour qu'il m'affiche uniquement le nombre de tours fait par les coupelles en 1 minute (ce dont j'ai besoin). Par contre, il n'affiche aucune valeur dans le moniteur (il affiche "Vitesse de rotation = inf tr/min"). Le câble est branché sur la borne D2 du shield (comme sur le site du vendeur). Je dois sûrement louper quelque chose. Pourriez-vous me dire quoi vu que je suis débutant avec Arduino.

Merci pour votre aide

#define pinANEMO 2


void setup()
{
  pinMode(pinANEMO, INPUT);
  Serial.begin(9600);
}
 
unsigned long millis_old(0);
float deltaTime(0);
float NombreTourSec(0);

bool isActive(false);
 

void loop()
{
    UpdateANEMO();
   
    //convertion periode -> fréquence
    NombreTourSec = (1/deltaTime);
    
    //affichage de la vitesse
    Serial.print("Vitesse de rotation = ");
    Serial.print(NombreTourSec);
    Serial.print(" tr/min\r\n");
}


void UpdateANEMO()
{
    //lecture du capteur
    isActive = digitalRead(pinANEMO);
 
    if(isActive)
    {
        deltaTime = (millis() - millis_old) /1000 ; // div en 1000 pour avoir le résultat en seconde
        millis_old = millis(); // remise à 0 du compteur pour capturer la différence de temps au prochain tour
    }
}

Merci pour votre réponse. Pouvez-vous m'écrire ce que je dois modifier dans le programme pour corriger ceci car j'avoue être un peu perdu.

Merci beaucoup

Bonjour,

Dans UpdateANEMO, il ne faut pas tester l'état de l'entrée, mais le changement d'état.

void UpdateANEMO()
{
 static byte etatPrecedent=LOW;
 //lecture du capteur
 byte etat = digitalRead(pinANEMO);

 if (etat && etat!=etatPrecedent)
 {
   deltaTime = (millis() - millis_old) / 1000.0 ; // div en 1000 pour avoir le résultat en seconde
   millis_old = millis(); // remise à 0 du compteur pour capturer la différence de temps au prochain tour
 }
 etatPrecedent=etat;
}

Comme tu fais la mesure dans la loop, tu ne vas obtenir des résultats corrects acceptables que pour les faibles vitesses. Tu dois utiliser une interruption pour la mesure de durée.

De plus tu calcules la vitesse en tr/s et à l'affichage tu dis que c'est des tr/min
Serial.print(NombreTourSec);
Serial.print(" tr/min\r\n");

Merci beaucoup pour l'aide. Le programme fonctionne. C'est vrai que j'ai manqué de rigueur concernant l'affichage en tr/s et tr/min.

Possible d'avoir un dernier coup de main pour réaliser cette interruption pour la mesure de durée ? Je suis vraiment novice dans ce domaine.

Tu peux essayer ça

#define pinANEMO 2

void setup()
{
 Serial.begin(9600);
 pinMode(pinANEMO, INPUT);
 attachInterrupt(digitalPinToInterrupt(pinANEMO), itAnemo, RISING);
}

unsigned long periode;
bool flagMesure=true;

void loop()
{
 if (flagMesure)
 {
   //convertion periode -> fréquence
   float nombreTourSec = 1000.0 / periode;
   flagMesure=false;

   //affichage de la vitesse
   Serial.print("Vitesse de rotation = ");
   Serial.print(nombreTourSec);
   Serial.print(" tr/s\r\n");
 }
}

void itAnemo()
{
 static unsigned long timeStart=0;
 unsigned long timeCur=millis();
 periode=timeCur-timeStart;
 timeStart=timeCur;
 flagMesure=true;
}

Le code précédent fonctionne mieux. Celui-ci donne des valeurs assez aléatoires. Mais, ce n'est pas grave car je suis déjà très satisfait que l'autre fonctionne. Merci kamill.

Le dernier programme devrait donner des valeurs beaucoup plus stables.
Comment est ce que tu testes la stabilité?

La fréquence est de quel ordre?
Si la fréquence est supérieure à 10 ou 20 Hz tu peux utiliser micros() à la place de millis() pour avoir une meilleure résolution.

Je fais tourner l'anémomètre grâce à un ventilateur et j'ai un anémomètre manuel digital pour contrôler la vitesse. Celui-ci m'affiche une vitesse de 11,5 km/h donc je devrais trouver des valeurs autours de 7,3 tours/s. Voici ce que le moniteur série affiche :

Vitesse de rotation = 20.00 tr/s
Vitesse de rotation = inf tr/s
Vitesse de rotation = 10.42 tr/s
Vitesse de rotation = 22.73 tr/s
Vitesse de rotation = inf tr/s
Vitesse de rotation = 10.99 tr/s
Vitesse de rotation = 20.41 tr/s
Vitesse de rotation = inf tr/s
Vitesse de rotation = 10.42 tr/s
Vitesse de rotation = 23.26 tr/s
Vitesse de rotation = inf tr/s
Vitesse de rotation = 10.87 tr/s
Vitesse de rotation = 20.41 tr/s
Vitesse de rotation = inf tr/s
Vitesse de rotation = 10.64 tr/s
Vitesse de rotation = 22.73 tr/s

Concernant la fréquence, de quelle fréquence parles-tu ? Ma carte arduino est branché sur mon PC sur le câble USB.

Avec micros() à la place de millis(), voici ce que le moniteur affiche :

Vitesse de rotation = 0.02 tr/s
Vitesse de rotation = 25.00 tr/s
Vitesse de rotation = 0.01 tr/s
Vitesse de rotation = 125.00 tr/s
Vitesse de rotation = 22.73 tr/s
Vitesse de rotation = 0.01 tr/s
Vitesse de rotation = 0.02 tr/s
Vitesse de rotation = 25.00 tr/s
Vitesse de rotation = 0.01 tr/s
Vitesse de rotation = 0.02 tr/s
Vitesse de rotation = 0.01 tr/s
Vitesse de rotation = 0.03 tr/s
Vitesse de rotation = 0.01 tr/s
Vitesse de rotation = 0.02 tr/s
Vitesse de rotation = 0.01 tr/s

Je dois sûrement louper des trucs ... Merci pour ta patiente :wink:

C'est extrêmement bizarre.
Il y a bien un pullup sur l'entrée?

Le matériel et le câblage est exactement celui donné en exemple par le site de vente Lextronic :

https://www.lextronic.fr/P36218-capteur-annomtre.html

Donc je n'en sait pas plus sur le pullup.

Je n'ai pas trouvé de schéma, mais sur la photo on voit des résistances qui sont sans doute des pullups.

Dans le doute tu peux activer le pullup interne par

pinMode(pinANEMO, INPUT_PULLUP);

Avec le code pour activer le pullup interne (et millis() ou micros()), le moniteur affiche une seule ligne :

Vitesse de rotation = inf tr/s

Quel casse-tête ...

Je pense qu'il y a un problème hard.
Est ce que tu as essayé le programme de test donné sur la page de l’anémomètre, que tu as donnée dans ton post initial, en tournant à la main.

Oui je l'avais fait dès que j'avais reçu le matériel et je viens de le refaire à l'instant pour revérifier en faisant tourner les coupelles manuellement. Le LED 13 brille en fonction du contact.

Je viens de tester le programme que je t'ai proposé avec un générateur.
Il fonctionne parfaitement, ce qui me conforte dans l'idée qu'il doit y avoir un problème hard.

C'est à dire un dysfonctionnement du capteur en lui-même ou d'un autre matériel ?

Si le programme fonctionne parfaitement, l'essentiel est là car si il y a une défaillance de matériel, je peux voir avec Lextronic.

Merci beaucoup kamill pour le temps que tu as consacré à ma demande.