Je prépare un code pour la mise en place d'un anémomètre et ce code sera rajouté par la suite dans un code existant qui gère un tracker solaire.
J'ai trouvé plusieurs type de code pour anémomètre et j'en ai mis un en place sur un ttgo t-display, cela fonctionne et reste à confirmer si l'info est assez précise.
J'ai lu pas mal de chose sur les interruption sur l'esp32 et je me pose la question si cela risque de perturber l'esp32 qui est sur le tracker car l'anémomètre va souvent tourner.
Je met le code de mon essai sur le ttgo:
#include <TFT_eSPI.h>
#include <SPI.h>
#include "Free_Fonts.h"
//couleur
#define color0 TFT_WHITE // Blanc
#define color1 0x26FB //Bleu clair
#define color2 TFT_ORANGE // Orange tft_orange
#define color3 TFT_RED // Rouge
#define color4 0xFF80 // Jaune
#define color5 0xF900 // Rouge clair
#define color6 0x07DE //bleu plus clair
#define color7 0xF01D // violet clair
#define color8 0x7FC0 // vert clair
#define color9 0x4249 // gris anthracite
//TFT
TFT_eSPI tft = TFT_eSPI();
const int interruptPin = 36;
volatile unsigned int pulseCount = 0;
float windSpeed = 0.0;
float speedkmh = 0;
void IRAM_ATTR handleInterrupt()
{
pulseCount++;
}
void setup() {
Serial.begin(115200);
tft.init();
tft.setRotation(1);//1 par défaut et passer à 3 pour inversser la rotation
tft.fillScreen(TFT_BLACK);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
}
void loop() {
delay(1000);
detachInterrupt(digitalPinToInterrupt(interruptPin));
windSpeed = ((pulseCount * 8.75)/100);
speedkmh = (3.6 * windSpeed); //converti m/s en km/h
pulseCount = 0;
tft.setFreeFont(FS12);
tft.setCursor(50, 20);
tft.setTextColor(color7);
tft.println("Vitesse du vent");
tft.setFreeFont(FS18);
tft.setTextDatum(MC_DATUM);//
tft.setCursor(50, 80);//
tft.fillRect(0, 40, 135, 50, TFT_BLACK); //efface la zone d'affichage de la vitesse
tft.setTextColor(TFT_WHITE);
tft.println(speedkmh);
tft.setCursor(140, 80);
tft.println("Km/h");
Serial.print(F("Vitesse en km/h du vent: "));Serial.println(speedkmh);
attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
}
Actuellement c'est un test et je n'ai pas eu de problème sur le ttgo après plusieurs essais dehors mais sur celui du tracker le code est bien plus important.
Oui, enfin il faut relativiser, jusqu'à preuve du contraire le soleil ne se déplace pas très vite et l'anémomètre vas faire un nombre limité de tours par seconde.
Si tu n'as pas de fonction bloquante tu ne devrais pas avoir de problème. Donc, par exemple, éviter les delay() dans tes fonctions.
Suivant le nombre d'impulsions que l'anémomètre génère par seconde, mesurer la vitesse du vent sur la base d'une seconde ce n'est pas très bon si le vent est lent. Ne serait-il pas plus malin de mesurer le temps entre 2 impulsions du capteur?
Comme te repose sur un delay pour déterminer la vitesse du vent, je suppose que tu considére que le temps d'execution de ta loop est nulle?
T'es tu assurer que c'était le cas ou que l'approximation de la valeur te convient?
Comme l'indique @fdufnews on peut supposer que la vitesse de déplacement du soleil, s'accomode assez facilement d'être bloqué pendant une seconde.
Mais en regle général, on conseil de passer sur l'utilisation de la fonction millis.qui a l'avantage de ne pas bloquer le reste de ton programme et te donnera à priori une valeur plus juste pour la vitesse.
Pour le delay() c'est juste dans ce code d'essai, dans le code de mon tracker il n'y a pas de delay et uniquement des millis() utilisé.
Pour le code du tracker je compte faire une mesure du vent toutes les 10 secondes voir 15, le but est de lancer la mise à plat du capteur si il y a trop de vent donc quelque test à faire car je pense faire déclencher la mise à plat vers 35 voir 40 km/h max ce qui va me faire en gros une pousser au alentour de 300 kg.
Je ne dis pas le contraire, le tracker ce déplace relativement lentement sur la journéé
Alors j'ai réfléchi comme apparemment l'interruption ne devrait pas poser de problème ( et c'était mon n'inquiétude), je vais voir pour faire une mesure toutes le 10 secondes et peut être faire une moyenne pendant 10 secondes.
Tu veux dire faire une mesure toutes les secondes et faire une moyenne des 10 derniéres ?
Pourquoi tu ne garde pas ton code actuel, mais tu comptes le nombre de pulse pendant ces 10s ?
En me relisant je vois que ce n'est pas cohérent le : je vais voir pour faire une mesure toutes le 10 secondes et peut être faire une moyenne pendant 10 secondes.
Oui je vais garder la partie pour l'anémomètre dans le code, mais pour compter les pulses pendant 10 sec ben je ne suis pas encore assez bon dans le code et je ne sais pas encore faire.
Ensuite , avoir une moyenne es ce vraiment utile , peut être qu'il serait mieux de faire : si vitesse supérieur à 40 on relance la lecture metton 10 fois et si toujours supérieure à 40 cela lance la mise à plat ??
Tu n'a rien à faire de spécial de plus, ton interruption le fait déjà.
la seul chose à faire et la remise à zéro de la variable, lorsque tu as calculé la vitesse et relancé ton compteur pour 10s.
Personnelement, je ne vois pas l'interret par rapport à une mesure sur 10s.
Au risque d'être hors sujet, je me disais que, comme le risque c'est l'effet du vent sur les panneaux, est-ce que ce ne serait pas plus direct d'utiliser une jauge de déformation fixée sur le support d'un des panneaux pour mesurer cet effet.
Ça pourrait aussi être une mesure complémentaire qui permettrait de palier à une éventuelle panne de l'anémomètre.
Cela fait encore un accessoire en plus à gérer, comme j'ai conçu le support capteur je suis pratiquement sure qu'il ne risque pas de se déformer.
J'ai prévu 3 barres de maintien capteur (gauche/milieu et droite)
J'ai pris un 2e anémomètre de secours et j'ai la possibilité de forcer la mise à plat par mqtt
Je pense laisser la mesure ce faire en permane dans la loop car je vais mettre une variable dans le code du tracker qui autorisera les mesures uniquement quand le tracker est en mode Jour ou Veille.
En mode nuit il n'y a pas besoin d'avoir l'anémomètre actif car le tracker sera en position à plat et à l'EST