anémomètre arduino

bonjour je voudrais savoir si mon programme est juste et pourquoi il m'affiche toujours la valeur 0 dans moniteur série voici mon code ci-dessous

#define HALL_SENSOR_PIN 8
#define LED 12
#define NB_PULSES_PER_TURN 4
 
volatile int pulses;
int calc;
 
 
// Interrupt routine
void rpm() {
  pulses++;
}
 
void led() {
  digitalWrite(LED, not digitalRead(HALL_SENSOR_PIN));
  if (digitalRead(HALL_SENSOR_PIN)) {
    pulses++;
  }
}
 
// Init routine
void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(HALL_SENSOR_PIN, INPUT);
  attachInterrupt(0, rpm, RISING);
}
 
 
// Main loop
void loop() {
  pulses = 0;   // Init pulses
  sei();        // Enable interrupts
  delay(1000);  // Wait 1 second
  cli();        // Disable interrupts
  calc = pulses * 60 / NB_PULSES_PER_TURN;
  Serial.print(calc, DEC);
  Serial.print(" tr/min\r\n");
}

merci d'avance pour votre aide.

Avez vous affiché (par Serial.print) pulses?
led() ne sert à rien
Avez cous vérifié que votre anemomètre envoye des impulsions?

Bonjour,

Tu ne nous dis pas quelle est ta carte
Mais je vois
#define HALL_SENSOR_PIN 8
et
attachInterrupt(0, rpm, RISING);

Si c'est une UNO, le capteur doit être connecté sur la broche 2

merci beaucoup sa marche j'ai les tours par secondes maintenant je voudrais les m/s puis les km/h du vent comment dois-je faire?

Ca dépend du rayon des pales. On peut obtenir une valeur approchée en calculant la distance parcourue par les pales.
Cependant il y a un coefficient de correction et le fabricant de l'anémomètre donne un coefficient de conversion tr/min -> vitesse du vent.

Une règle de trois doit faire l'affaire... (sinon, vous calculez une valeur à la main, avec votre cerf veau, et vous utilisez "map"; en sachant que 0 impulsions i,doqient 0 kù/h, vous avez les deux points don map a besoin)

désoler mais j'ai pas bien compris comment dans mon programme je dois introduire le rayon puis ce que je doit créer pour rentrer la formule pour avoir les km/h.

La distance parcourue par les pales en une heure que l'on peut assimiler à la vitesse du vent est
2Πrayonntrm60/1000 -> distance en km par heure
rayon: rayon en m
ntrm: nombre de tours/minutes

J'insiste sur le fait que ça donne une valeur (très) approximative. Il faut connaitre le coefficient de l'anémomètre.

Pour connaître le coefficient de l'anémomètre, il faut éspérer qu'il est référencé et que son constructeur -que des yeux téléscopiques ne peuvent pas determiner- l'a renseigné.
Supposons que le rayon fasse 1 mètre; qu'on ait 10 tours par minute, et que le coefficient vaille 1:
vous aurez 3.77 km/h (et avec 0 , vous pouvez alimenter map)

merci j’ai réussi maintenant avec le programme ci-dessous, maintenant je sais pas du tout comment afficher la vitesse du vent sur un écran LCD

const float pi = 3.14159265;  // Nombre Pi
int period = 1000;           // Période de mesure (miliseconde)
int delaytime = 1000;        // Temps entre les mesures (miliseconde)
int radio = 70 ;             // Distance du centre au capteur (mm)
unsigned int Sample = 0;       // Mesure a 0
unsigned int counter = 0;      // compteur
unsigned int RPM = 0;          // Tours par minute
float speedwind = 0;           // Vitesse du vent (km/h)  

int vitmax = 10;    //vitesse du vent max au dela de laquelle mise en securité

void setup()
{
  pinMode(2, INPUT); // sur le port 2
  digitalWrite(2, HIGH); // impulssion haute
  Serial.begin(115200); // Port série a 115200 baud
   
  Serial.println("Anemometre"); // affichage sur moniteur serie
  Serial.println("**********"); // idem
  Serial.print(" Mesure toutes les secondes : "); //idem
  Serial.println();
}
 
void loop()
{
  Sample++;
  windvelocity();
  RPMcalc();
  WindSpeed();
  Serial.print(speedwind); // afficher le vent sur moniteur serie
  Serial.print(" [km/h] "); // afficher sur miniteur serie
  Serial.println();
  delay(5000); // affichage toutes les 5 secondes
  Serial.print(" Mesure suivante... "); // afficher sur moniteur serie
  Serial.println();
}
 
// Mesurer la vitesse du vent
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);  // Calculer tours par minute (RPM)
}
 
void WindSpeed(){
  speedwind = ((((2 * pi * radio * RPM)/60) / 1000) / 1000) * 3600;  // Calculer la vitesse du vent en km/h
}
//declaration de addcount 
void addcount()
{
  counter++;
}

Avez vous un programme de demo de votre lcd?
Celui qui affiche "Salut, monde" en américain?
Que fait-il?

non j'ai pas

C'est quoi ton lcd?

Allez dans fichiers -> exemples et regardez tous les coins de votre menu...
Si votre LCD est classique, vous avez.
Sinon, quel est le vendeur/la référence du LCD (question de Kamill)

c'est un LCD i2c avec 16 broches

Quel est son vendeur? sa référence?
(parce que avec ça , on pourra tenter de savoir quelle est la carte, quel est le circuit d'interface: désolé, on n'a aucun don télépathique)

benjifit:
c’est un LCD i2c avec 16 broches

????Ça fait 12 broches de trop pour un afficheur I2C

Pour étalonner ton anémomètre sans avoir de donnée du fabriquant, tu peux le faire en étant passager dans une voiture qui roule. Tu mets ton capteur dehors en le tenant à bout de bras (attention de ne pas rencontrer d’obstacle). Tu relèves la vitesse du véhicule avec un GPS, tu notes la valeur retournée par ton système. Tu fais plusieurs mesures à plusieurs vitesses différentes…

Bonjour benjifit

benjifit:
merci j’ai réussi maintenant avec le programme ci-dessous, maintenant je sais pas du tout comment afficher la vitesse du vent sur un écran LCD

const float pi = 3.14159265;  // Nombre Pi

int period = 1000;           // Période de mesure (miliseconde)
int delaytime = 1000;        // Temps entre les mesures (miliseconde)
int radio = 70 ;             // Distance du centre au capteur (mm)
unsigned int Sample = 0;       // Mesure a 0
unsigned int counter = 0;      // compteur
unsigned int RPM = 0;          // Tours par minute
float speedwind = 0;           // Vitesse du vent (km/h)

int vitmax = 10;    //vitesse du vent max au dela de laquelle mise en securité

void setup()
{
 pinMode(2, INPUT); // sur le port 2
 digitalWrite(2, HIGH); // impulssion haute
 Serial.begin(115200); // Port série a 115200 baud
 
 Serial.println(“Anemometre”); // affichage sur moniteur serie
 Serial.println("**********"); // idem
 Serial.print(" Mesure toutes les secondes : "); //idem
 Serial.println();
}

void loop()
{
 Sample++;
 windvelocity();
 RPMcalc();
 WindSpeed();
 Serial.print(speedwind); // afficher le vent sur moniteur serie
 Serial.print(" [km/h] “); // afficher sur miniteur serie
 Serial.println();
 delay(5000); // affichage toutes les 5 secondes
 Serial.print(” Mesure suivante… "); // afficher sur moniteur serie
 Serial.println();
}

// Mesurer la vitesse du vent
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);  // Calculer tours par minute (RPM)
}

void WindSpeed(){
 speedwind = ((((2 * pi * radio * RPM)/60) / 1000) / 1000) * 3600;  // Calculer la vitesse du vent en km/h
}
//declaration de addcount
void addcount()
{
 counter++;
}

Tiens, tiens…

Et les corrections?

Et à quoi ça sert qu’ils se décarcassent?

Cordialement,
bidouillelec

bidouilleelec:
Bonjour benjifit

Tiens, tiens.........

http://forum.arduino.cc/index.php?topic=601919.0

Et les corrections?

Et à quoi ça sert qu'ils se décarcassent?

Cordialement,
bidouillelec

ça c'est un coup à ce que je mette les deux topics dans le bak à poux bêle 2019....