Première question est ce que ce composant vous semble pertinent?
Concernant le programme je suis parti d'un que j'ai trouvé :
unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 1;
int hall_sensor = 19;
int magnetSense = 0;
int counter = 0;
boolean lastState = true; // I changed to boolean type
float windSpeed;
float radius = 0.000207;
float pi = 3.142;
float circumference = 2 * radius * pi;
//-----------------------------------------------------------
void setup() {
Serial.begin(115200);
startMillis = millis();
pinMode(hall_sensor, INPUT);
}
//-----------------------------------------------------------
void loop() {
currentMillis = millis();
magnetSense = digitalRead(hall_sensor);
if (magnetSense == 0 && lastState == true)
{
lastState = false;
if (currentMillis - startMillis >= period)
{
windSpeed = circumference / (currentMillis - startMillis) * 3600000;
startMillis = currentMillis;
counter++;
Serial.println(String(windSpeed) + "km/h");
}
}
else
{
if (currentMillis - startMillis >= period)
{
startMillis = currentMillis;
lastState = true;
}
}
J'ai quelques questions :
J'ai lu des choses sur des pb de rebond faut il modifier ce programme et ajouter des PULLUP (ou est ce surperflux) ou ajouter des résistances ou condo : en fait je suis un peu perdu
Je me suis gratté la tête mais je ne comprends pas la condition suivante :
if (magnetSense == 0 && lastState == true)
Et d'une façon générale pensez vous que ce programme est adapté à mon besoin.
Oui, tout à fait, je n'utilise, quasiment, que ça.
Attention, il ne détecte pas que "l'aimantation", il faut faire attention au sens de l'axe nord/sud de l'aimant:
Avec le capteur KY-003, u ne t'inquiètes plus de tout ça.
Pour ce qui est de ton programme, si c'est le seul ensemble que tu as à contrôler avec ton Arduino, c'est bon, si ce n'est pas le cas, ça va êtte difficile à intégrer dans un autre ensemble, je pense qu'il est préférable de travailler avec une interruption, de compter les impulsions pendant 1 seconde(par ex.) et, de cette somme, en déduire la vitesse du vent.
Je suppose que ce n'est pas les conditions en soit que tu ne comprends pas, mais le principe de fonctionnement?
Tu rentre dans le IF, si les deux conditions sont vérifiées.
Je suppose que ton capteur, indique un état "positif" lorsque ça valeur est 0
Comme cela positionne lastState à false, même si ton capteur est toujours à ca valeur positif, tu ne va pas rentrer dans le IF à nouveau.
Il faudra qu'un temps correspondant à "period" ce soit écouler, pour repositionner "lastState" à True.
Par contre je ne vois pas trop pourquoi startMillis est sauvegardé lorsque l'on a attendu le temps de "period"
Il paraitrait plus logique de compter le temps entre chaque moment ou magnetSense est positif, pour savoir que l'on a fait un tour en un temps donné.
Après il semble important d'attendre un certain temps "pediod" ou 1milliseconde, je suppose pour laisser le temps à magnetSense de revenir négatif.
Si ton programme fonctionne déjà sur une machine à état, l'utilisation d'une interruption n'est pas forcément utile, même si c'est surement ce que j'aurais utilisé
Surtout que cela ne résoudra pas les problèmes de rebonds que tu évoques.
A ce stade je n'ai pas encore intégré cette fonctionnalité à mon programme général je cherche la meilleure solution. donc je suis preneur de vos conseils.
Bien sûre, je ne pense pas avoir indiqué le contraire ?
J'indique juste que sauf, si il y a un risque de louper une pulsation, cela n'a pas vraiment de valeur ajoutée.
Bonjour jbbricole,
J'avais mis mon projet en stand by je viens de m'y remettre, cette fois je me suis connecté sur mon ESP définitif un espressif wroom 32.
J'ai reprise les lignes que tu avais proposé :
// variables anémométre
const int hallSensorPin = 2;
volatile int hallPulsesCompteur = 0; // Comptage des impulsions
const unsigned long vitesseCalculTempo = 5000; // Toutes les 5 secondes
unsigned long vitesseCalculMillis = millis();
if (millis() - vitesseCalculMillis >= vitesseCalculTempo){ // Si temps de calculer la vitesse
Serial.println("Impulsions : " + String(hallPulsesCompteur));
hallPulsesCompteur = 0;
vitesseCalculMillis = millis();
Sinon tu aurais proposé quel type de cartes pour supporter : DHT, SDS011 (mesures de particules) anémométre, pluviométre... selon mes idées, est ce trop juste un ESP32 vroom??
Je reviens à ta proposition qu'est ce qui détecte le changement de champ du capteur, auparavant c'était le attachInterrupt(digitalPinToInterrupt(hallSensorPin), hallSensorComptage, FALLING);mais dans ta proposition je ne vois pas.