Projet mesure de vitesse du vent

Bonjour pour mon projet d'anémomètre j'utilise un capteur a effet hall pour mesurer la vitesse donc dans un premier temps il me faudrait le temps entre deux mesure du capteur pour déterminer la vitesse mais je bloque a ce niveaux la voici le bout de code que j'ai qui devrait afficher l'intervalle de temps entre deux mesure `#include <Wire.h>
#include "rgb_lcd.h"

const int hallPin = 2; // Pin du capteur à effet Hall, à adapter selon votre configuration
unsigned long previousMillis = 0; // Variable pour stocker le temps de la dernière détection
int interval = 1000; // Intervalle entre les mesures en millisecondes, à adapter selon vos besoins
int previousDetectionState = LOW; // Variable pour stocker l'état de détection précédent

rgb_lcd lcd;

const int colorR = 255;
const int colorG = 0;
const int colorB = 0;

int Led = 10;    // Définir l'interface de la LED

void setup() {
  Serial.begin(9600);  // Initialise la communication série à 9600 bauds
  pinMode(Led, OUTPUT);    

  // Configuration de l'écran LCD
  lcd.begin(16, 2);
  lcd.setRGB(colorR, colorG, colorB);
  lcd.clear();
}

void loop() {
  // Obtient le temps actuel
  unsigned long currentMillis = millis();

  // Effectue la mesure du capteur à effet Hall
  int hallValue = digitalRead(hallPin);

  // Vérifie si le capteur passe de LOW à HIGH (début de détection)
  if (hallValue != previousDetectionState && hallValue == HIGH) {
    // Affiche l'état de détection actuel
    lcd.setCursor(0, 0);
    lcd.print("Detection : Oui");

    // Affiche l'écart de temps depuis la dernière détection haute
    lcd.setCursor(0, 1);
    lcd.print("Temps  : ");
    lcd.print(currentMillis - previousMillis);
    lcd.print(" ms");

    // Enregistre le temps actuel comme le dernier temps de détection haute
    previousMillis = currentMillis;
    
  
  }
// Met à jour l'état de détection précédent
    previousDetectionState = hallValue;
  

 

  // Autres instructions à exécuter pendant les intervalles de mesure
  // ...
}
``#include <Wire.h>
#include "rgb_lcd.h"

const int hallPin = 2;  // Pin du capteur à effet Hall, à adapter selon votre configuration
unsigned long previousMillis = 0;  // Variable pour stocker le temps de la dernière détection
int interval = 1000;  // Intervalle entre les mesures en millisecondes, à adapter selon vos besoins
int previousDetectionState = LOW;  // Variable pour stocker l'état de détection précédent
rgb_lcd lcd;

const int colorR = 255;
const int colorG = 0;
const int colorB = 0;

int Led = 10;    // Définir l'interface de la LED

void setup() {
  Serial.begin(9600);  // Initialise la communication série à 9600 bauds
  pinMode(Led, OUTPUT);    

  // Configuration de l'écran LCD
  lcd.begin(16, 2);
  lcd.setRGB(colorR, colorG, colorB);
  lcd.clear();
}

void loop() {
  // Obtient le temps actuel
  unsigned long currentMillis = millis();

  // Effectue la mesure du capteur à effet Hall
  int hallValue = digitalRead(hallPin);

  // Vérifie si le capteur passe de LOW à HIGH (début de détection)
  if (hallValue != previousDetectionState && hallValue == HIGH) {
    // Affiche l'état de détection actuel
    lcd.setCursor(0, 0);
    lcd.print("Detection : Oui");

    // Affiche l'écart de temps depuis la dernière détection haute
    lcd.setCursor(0, 1);
    lcd.print("Temps  : ");
    lcd.print(currentMillis - previousMillis);
    lcd.print(" ms");

    // Enregistre le temps actuel comme le dernier temps de détection haute
    previousMillis = currentMillis;
    
  
  }
// Met à jour l'état de détection précédent
    previousDetectionState = hallValue;
  

 

  // Autres instructions à exécuter pendant les intervalles de mesure
  // ...
}

`

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Bonjour yugai

Mets ton programme entre les balises
image
il n'en sera que plus visible :wink:

A+
Cordialement
jpbbricole

Le code n'est pas franchement lisible (voir remarque de @jpbbricole) mais après un premier survol, je pense que ce n'est pas une bonne idée de faire le chronométrage dans le loop()

Si je devais faire un truc comme ça, je mettrait la détection du capteur Hall dans une interruption. Dans l'interruption stocker le millis(), la valeur précédente et un booléen pour signaler la détection.

Dans le loop() tu ne fais alors que l'affichage (et les éventuels calculs) et ceci uniquement dans le cas où il y a détection. Sinon, ne rien faire.

J'ai l'impression, peut-être et probablement je me trompe ( :grinning:) qu'il vient d'y avoir une distribution des sujets pour le bac.

Par expérience, ceux qui se manifestent en décembre sont de loin les meilleurs.

1 Like

et ceux qui bossent dès le mois de novembre alors ? :slight_smile:

C'est plus rare parce que les sujets sont distribués en décembre .

Bon, les plaisanteries les plus courtes sont les moins longues, on ne va pas polluer le sujet. :sweat_smile:

Bonsoir ProfesseurMephisto

C'est vrai que le mode interruption est le plus pratique dans ce genre de mesures.
Une autre chose qui risque de gêner avec sa méthode, est qu'il affiche à chaque "tour", ce qui risque de gêner sur la mesure.

Cordialement
jpbbricole

Surtout quand on voit ça :

Passe systématiquement à Serial.print(115200) et pourquoi pas à 250000.

Les affichages ralentissent la vitesse d'exécution du code.
Tu n'y es pour rien, c'est, hélas, ce qu'on trouve toujours dans la littérature.

9600 bauds, c'était avant le Moyen-Age de l'informatique, même pas le quaternaire !

J'ai mis ton code entre balises
Remarque qu'il est bien plus lisible.

Si tu veux de l'aide, il faut aider les aidants en faisant des efforts de présentation.
Peux-tu retirer la coche "Résolu" qui est gênante pour te répondre, ton sujet est loin dêtre résolu.

Je suis pour 115200 mais Il faut comprendre ce qu’il se passe, chaque octet émis génère une interruption pour charger le registre d’émission et gérer le buffer circulaire.

  • A 9600 bauds vous avez une interruption à chaque millisecondes environ.

  • A 250000 bauds vous avez une interruption toutes les 40 microsecondes.

Il faut aussi savoir que si le buffer de sortie est plein (64 octets) un print ou write devient bloquant donc plus vous émettez lentement plus vous bloquez longtemps et donc plus vous imprimez de contenu plus vous risquez de saturer le buffer et donc de ralentir fortement votre code.

Suivant ce que fait le reste du code et sa dépendance aux interruptions (Neopixels, SPI, I2C, récepteur de télécommande IR, GPS en réception,…) il faut penser à équilibrer le temps CPU dispo pour les fonctions critiques et si le print c’est pour du debug, il ne faut pas être trop bavard car bloquer le code peut jouer sur ce que vous essayez de debugger

Le post de chbing est un spam contenant un lien qui n’a rien à voir.

Abus reporté.

Les capteurs hall peuvent être lus comme des boutons suivant leur type. Pas de souci dans ce cas avec digitalRead.

Les problèmes de rebonds en moins, ce qui est loin d'être négligeable !

oui, plus efficace à ce niveau que des contacts reeds (Interrupteurs à Lames Souples)

Il faudrait commencer par comprendre ce que tu cherches...

La sonde qui tourne au gré du vent génère un signal en créneaux : le signal est alternativement BAS, puis HAUT, puis BAS, etc... chaque palier durant ... un certain temps. Plus il y a du vent, plus la sonde tourne vite et moins les paliers durent longtemps.

La 1ère chose à faire est de compter ces paliers. Pour cela il suffit de compter, par exemple, les transitions BAS-HAUT ou bien HAUT->BAS. Il ne faut pas se contenter, comme dans ton programme, de tester si le niveau est haut ou s'il est bas; selon la cadence à laquelle tu testes, tu vas compter plusieurs états HAUT, puis plusieurs états BAS, etc... Il ne faut compter que les transitions d'état.

2ème, tu dois compter ces transitions pendant un certain temps. Suffisament long pourque ton comptage soit stable, si tu comptes trop vite, tu peux compter 0 transitions, ça ne sert à rien.
De plus tu dois connaitre cet intervalle de temps (pendant lequel tu as compté), tu peux avoir ça en utilisant la fonction millis()

3ème, tu divises le comptage par le temps, et tu as un résultat en transitions/secondes (attention aux unités!). C'est pas fini. Toi tu veux la vitesse de vent, n'est-ce pas ?
Or tu n'as que le nombre de transitions par secondes. Il te faut une formule pour passer à des m/s (vitesse du vent). Cette formule, tu ne peux pas l'inventer, c'est le fabricant de la sonde qui te la fournit. Si tu ne l'as pas, tu es gravement dans le kk.
Dernier espoir si tu ne l'as pas : faire toi même l'étalonnage de la sonde (c-à-d obtenir la formule manquante). Il "suffit" de monter dans une voiture, un jour sans vent, et de rouler successivement à diverses allures: 10 km/h, 20, 30, 40, 50,etc... et de noter à chaque fois le comptage obtenu (en transitions/seconde), pour finalement établir toi-même la formule de conversion.

Il y a deux manière de voir les choses.

1- compter les transitions durant un certain intervalle.
2- chronométrer la durée entre deux transitions successives.

Avantage de 1 :

  • cela lisse les fluctuations de la vitesse du vent sur l'intervalle considéré

Inconvénients de 1 :

  • un vent très faible peut-être compté comme 0 abusivement
  • au démarrage du coup de vent (ou de l'anémomètre) la mesure ne sera disponible qu'à la fin de la première période.

Avantage de 2 :

  • les mesures sont beaucoup plus fréquentes (à chaque tour) et disponible presque immédiatement
  • plus sensible (théoriquement) sur les vents faibles

Inconvénient de 2 :

  • la mesure peut fluctuer plus qu'avec 1.

Pour compenser l'inconvénient de 2, tu peux calculer une moyenne glissante des n dernières mesures. La première mesure est disponible presque immédiatement mais tu perds un peu en dynamique.

À @yugai de voir ce dont il a besoin en priorité. les différents défauts se manifesteront sur les variations de vitesse du vent.

Évidement l'anémomètre est à placer le plus haut possible pour éviter les turbulences liées au sol et autres obstacles.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.