Tachymètre vers Anémomètre

Bonjour,

Je suis débutant en matière d’Arduino. J’ai récupéré un capteur d’anémomètre comportant une électronique intégrée et dont la sortie donne des créneaux à raison de 10 Hz par mètre/seconde. Après des recherches sur le web j’ai trouvé un schéma et code de tachymètre (comptage de tours par minute à raison d’une impulsion par tour). Le code est le suivant :

// Easy Peasy Tachometer
//James Rovere 2020
#include <Wire.h>
#include <Adafruit_SSD1306.h>// You may have to edit library for 128x64, //default is 128 x 32.

#define OLED_WIDTH 128
#define OLED_HEIGHT 64

#define OLED_ADDR   0x3C // A very common address for these displays.

Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT);


float value=0;
float rev=0;
int rpm;
int oldtime=0;        
int time;

void isr()          //interrupt service routine
{
rev++;
}

void setup()
{
 display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
 display.clearDisplay();
   
digitalWrite(2 ,HIGH);// Instead of using a pull up resistor
attachInterrupt(0,isr,RISING);  //attaching the interrupt

}

void loop()
{
delay(2000);// 2 second delay
detachInterrupt(0);           //detaches the interrupt while calculating
time=millis()-oldtime;        //finds the time 
rpm=(rev/time)*60000;         //calculates rpm
oldtime=millis();             //saves the current time
rev=0;

  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);// Vertical, Horizontal.
  display.println("RPM:");
  display.setTextSize(5);
  display.setTextColor(WHITE);
  display.setCursor(0,25);
  display.println(rpm); 
  display.display();
  

  attachInterrupt(0,isr,RISING);


}

D’après ce que je comprends, la formule : “rpm=(rev/time)*60000” mesure le délai en millisecondes d’une révolution et convertit en tours minutes en multipliant par 60 000.
J’ai interfacé mon anémomètre (sortie collecteur ouvert) et çà compte correctement avec ce code (bien sur le nombre de tours est erroné puisque 10 impulsions par tour)
Je pensais arriver à mes fins en modifiant la formule par : metresec=(rev/time)*0.1; (en modifiant les noms des variables …) mais il n’y a aucune réaction à la rotation de l’anémomètre …
Je ne vois pas ou il y a erreur (çà compile normalement dans l’IDE).
Une idée ?
Ed

Bonjour,

Il faut que tu définisses metresec comme float, car il peut être inférieur à 1 ce qui va te donner 0 si tu le définis en int.

Merci pour ta réponse. J’ai modifié le code comme suit mais çà ne marche pas … (même si j’ai pas tout compris).
Une autre idée ?

// Easy Peasy Tachometer
//James Rovere 2020
#include <Wire.h> //librairie pour I2C
#include <Adafruit_SSD1306.h>// You may have to edit library for 128x64, //default is 128 x 32. Nota : sur Uno, SDA=A4, SCL=A5 (liaison I2C)

#define OLED_WIDTH 128
#define OLED_HEIGHT 64

#define OLED_ADDR   0x3C // A very common address for these displays.

Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT);


float value=0;
float rev=0;
float metresec;
int oldtime=0;        
int time;

void isr()          //interrupt service routine
{
rev++;
}

void setup()
{
 display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
 display.clearDisplay();
   
digitalWrite(2 ,HIGH);// Instead of using a pull up resistor, pin2=D2
attachInterrupt(0,isr,RISING);  //attaching the interrupt : 0 pour PIN2, ISR=fonction appelée

}

void loop()
{
delay(2000);// 2 second delay
detachInterrupt(0);           //detaches the interrupt while calculating
time=millis()-oldtime;        //finds the time 
metresec=(rev/time)*0.1;      //calcul vitesse en m/s sachant que le capteur donne 10 Hz par m/s
oldtime=millis();             //saves the current time
rev=0;

  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);// Vertical, Horizontal.
  display.println("M/s:");
  display.setTextSize(5);
  display.setTextColor(WHITE);
  display.setCursor(0,25);
  display.println(metresec); 
  display.display();
  

  attachInterrupt(0,isr,RISING);


}

Le calcul de la fréquence est incorrect. Il faut exprimer le temps en secondes.
Si ton capteur donne 10Hz par m/s la formule sera alors:

  metresec = (rev *1000 / time) * 0.1; //calcul vitesse en m/s sachant que le capteur donne 10 Hz par m/s

Mais oui, suis-je bête ... C'est triste de vieillir ! Enfin çà marche ! Merci kamill.

Par contre, histoire d'éclairer ma modeste lanterne : je suis d'accord sur le fait d'exprimer le temps en secondes. Tu as écris :

metresec = (rev *1000 / time) * 0.1;

Est ce qu'il ne serait pas plus correct d'écrire :

metresec = ((rev/time) *1000)*0.1

sachant que rev=révolutions ou tours et que time est exprimé en millisecondes ? (sauf erreur de ma part)
Je n'ai pas essayé ...

Les deux sont équivalents.
On pourrait aussi écrire

metresec = rev *1000 / time * 0.1;

Du point de vue sémantique il serait plus clair d'écrire

metresec = (rev / (time/1000.0)) * 0.1;

time/1000 étant le temps en secondes.
Ca aussi ça donne le même résultat.

OK, merci bien pour l'info :slight_smile: