Avoir la vitesse du vent en m/s

Bonjour,
Je dois programmer un anémometre ( http://www.lextronic.fr/P28025-capteur-anenometre.html ) avec un Arduino uno afin d’afficher la vitesse du vent en m/s sur le moniteur série du logiciel Arduino . J’ai fais un programme pour compter le nombre de tour qu’aura fais l’anémomètre et au bout d’une seconde la boucle while s’arrêtera pour effectuer le calcul pour ensuite obtenir une valeur en m/s . Je ne sais pas si c’est au niveau de la boucle while d’une seconde que ça ne marche ( si il manque une librairie ou une mauvaise manip de ma part ) ou si c’est ma boucle qui est complètement fausse.

#include <time.h>

int compteurfm = 0;
int nbrtour = 0;
unsigned long compte_temps;
int increm_temps = 1;
int anemometre = 0;

void setup()
{
  pinMode (2, INPUT);
  attachInterrupt (0, anemometre, RISING);
  Serial.begin(9600);
}

void loop()
{
  while(1)
  {
    anemometre = 0;
    long temps_depart = System.currentTimeMillis();
    long duree = 1000;
    while((temps_depart - System.currentTimeMillis()) < duree)
    {
      if (2 = 1)
      {
        anemometre = anemometre + 1;
      }
    }
  nbrtour = anemometre / 2;   
  Serial.print(2 * 3.1415 * 0.05 * nbrtour);
  Serial.println (" m/s");
  }
}

Merci de votre aide

bonjour,
tu peux expliquer ca?

if (2 = 1)

l’anémo fonctionne comment?
par impulsion?

Je ne sais pas si c'est au niveau de la boucle while d'une seconde que ça ne marche pas

while(1)

Cela ne risque pas de fonctionner. Tu as juste fait une boucle infinie.
Relis un peu la documentation sur la boucle while et tu comprendra immédiatement.

infobarquee:
tu peux expliquer ca?
if (2 = 1)

Les plus anciens se souviendront d'une émission télé avec Jean Yanne et Javques Martin et qui s'appelait 1=3 :grin:

Infobarquee , oui c'est un capteur a impulsion et 2 impulsions correspondraient a 1 tours de l'anémometre, mais c'est vrai que maintenant que tu le dis je ne comprend pas trop pourquoi j'ai mis ca ou du moins la logique de ce que j'ai mis, s'il y'en a une

68tjs, je débute vraiment ,mais je pensais prendre en compte de l'heure a laquelle le programme débute et arrêter la boucle lorsque qu'on dépasse les 1 secondes par rapport au temps de départ

donc il faut que tu fasse un comptage des impulsions durant 1s via un digitalRead

Dans la parenthèse du while il faut mettre une condition.
Le résultat de la condition est un booléen.
Un booléen ne peut prendre que deux états VRAI ou FAUX.
En C (et sans doute dans d'autres languages) on considère que le 0 correspond à FAUX et que tous les autres entiers , pas seulement 1, correspondent à VRAI.
Donc quand tu écris while(1) cela revient à écrire une condition qui sera toujours vraie et donc la boucle ne peut pas s'arréter.

Par contre tu as le droit d'écrire :
test = 1;
while (test)
{
........................
......................
Si condition machin est vraie alors test = 0;
}
Dès que la condition "machin" sera vraie la boucle s'arretera.

J'ajouterais que si tu veux sortir de ton while immédiatement tu peux utiliser le mot clé break;
Ca peut être utile quand on ne veut pas exécuter la fin du bloc quand la condition de sortie est vérifiée (ça marche aussi pour les autres types de boucles).

pour ce qui est de if (2=1), j'assume que tu voulais lire la pin D2 ?

essais plutot : if (digitalRead(2) ==1)

Conseil : pour débuter il y a une bible indispensable à savoir le tuto d'Eskimon.
C'est une mine d'or pour l'initiation à la programmation et aux micros-contrôleurs.

Il parait être un gros pavé mais il est bien structuré et peut se lire chapitre par chapitre.

Juste une remarque.
Vouloir afficher la vitesse du vent en m/s n'implique pas nécessairement de compter les impulsions pendant 1 seconde. Parce que la précision (voir la pertinence) va s'en ressentir. En particulier, si le vent est faible le résultat sera complètement incohérent.
Donc peut être réfléchir à compter sur une période de temps plus longue pour avoir une mesure représentative.

Ou voir le sujet dans l'autre sens :

  1. se fixer une nombre d'impulsion
  2. déterminer le temps qui a été nécessaire pour obtenir le nombre fixé d'impulsion .

j’utilise ce capteur ainsi qu’ un capteur de pluie sur un projet
j’ai utilisé les interruptions matérielles 0 et 1 pour les capteurs, a chaque interruption j’incrémente un compteur
j’ai programmé une interruption mstimer 2 toutes les secondes qui vient lire les compteurs et faire les différents calculs …

rjnc38 cela veut dire que dans ton cas il n’y a pas de 2eme boucle ?

Regarde là :

http://playground.arduino.cc/Main/ReadingRPM

Tu pourra déjà t'en inspirer

Felowing:
rjnc38 cela veut dire que dans ton cas il n'y a pas de 2eme boucle ?

les sous programmes d'interruptions doivent être les plus court possible
les inter 0 et 1 incrémentent un compteur
l'inter mstimer mémorise le max, calcule la moyenne ... et remet a zero les compteurs
loop met a dispo les mesures
ps: il faut obligatoirement faire un circuit anti-rebond sur ces capteurs

Je ne pense pas mettre bien exprimé , j'ai ce code :

while(){ //durée 1s

if (anem ==1)
{
anemometre = anemometre + 1;

}

Je voudrais faire cette boucle pendant 1 seconde et au bout d'une seconde quitter cette boucle

Tu as un example ici :

Voir attachement

calcul_avec_capteur_luminosite.ino (11.6 KB)

J’ai trouvé autre chose et j’arrive maintenant a afficher la vitesse du vent mais maintenant je voudrais faire tourner un moteur 5 secondes si la vitesse du vent est supérieur à 20 m/s sauf que la mon moteur tourne a chaque affichage de valeur même si elle est inférieur a 20 m/s , je ne pense pas qu’il est une grosse erreur peut etre un mauvais placement de la condition , voici le programme

// Constants definitions
const float pi = 3.14159265;  // Nombre Pi
int period = 10000;           // Measurement period (miliseconds)
int delaytime = 10000;        // Time between samples (miliseconds)
int radio = 225 ;             // Distance from center windmill to sensor (mm)
char* winds[] = {"Calme", "vent", "petite brise", "douce brise", "brise modéré", "brise", "grosse brise", "coup de vent", "coup de vent", "gros coup de vent", "Tempête", "Violente tempête", "Ouragan"};

// Variable definitions
unsigned int Sample = 0;       // Sample number
unsigned int counter = 0;      // B/W counter for sensor 
unsigned int RPM = 0;          // Revolutions per minute
float speedwind = 0;           // Wind speed (m/s)
unsigned short windforce = 0;  // Beaufort Wind Force Scale
int motord = 3;
int motorg = 4;
int limite = 0;

void setup()
{
  // Set the pins
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
  pinMode(motord, OUTPUT);
  pinMode(motorg, OUTPUT);
 
  
  // sets the serial port to 115200 
  Serial.begin(115200);
  
  // Splash screen
  Serial.println("Anemometre");
  Serial.println("**********");
  Serial.print("Periode: ");
  Serial.print(period/1000);
  Serial.print(" secondes toutes les ");
  Serial.print(delaytime/1000);
  Serial.println(" secondes.");
  Serial.println();
}

void loop() 
{
  Sample++;
  Serial.print(Sample);
  Serial.print(": Lancer la mesure...");
  windvelocity();
  Serial.println("   fini.");
  Serial.print("Compteur: ");
  Serial.print(counter);
  Serial.print(";  RPM: ");
  RPMcalc();
  Serial.print(RPM);
  Serial.print(";  Vitesse du vent: ");
  WindSpeed();
  Serial.print(speedwind);
  Serial.print(" [km/h]  (+/- 0.07 km/h);  Force du vent : ");
  Serial.print(windforce);
  Serial.print(" - ");
  Serial.println(winds[windforce]);
  Serial.println();
  delay(5000);
   
}

// Measure wind speed
void windvelocity(){
  speedwind = 0;
  counter = 0;  
  attachInterrupt(0, addcount, CHANGE);
  unsigned long millis();                     
  long startTime = millis();
  while(millis() < startTime + period) {
  }
  detachInterrupt(1);
}

void RPMcalc(){
  RPM=((counter/2)*60)/(period/1000);  // Calculate revolutions per minute (RPM)
}

void WindSpeed(){
  speedwind = (((2 * pi * radio * RPM)/60) / 1000);  // Calculate wind speed on m/s
  
 if (speedwind > 20);
  {
    digitalWrite(motord, HIGH);
    digitalWrite(motorg, LOW);
    delay(5000);
    digitalWrite(motord, LOW);
    digitalWrite(motorg, LOW);
    }
    
}

void addcount(){
  counter++;
}