Bonjour à tous,
J'ai récupérer des capteurs d'une station météo Campbell, et j'ai voulu réuitliser l'anémo et la giroutte pour les monter sur un voilier afin d'avoir un retour de vent instantaté (rafale si affinité) et de direction du vent par rapport au bateau.
L'anémomètre fonctionne comme un potar, et d'après sa feuille technique, la vitesse du vent est proportionnelle à la fréquence émise, et non à la tension. J'ai ainsi réalisé une petite plaque de prototype avec un filtre passe-bas, un comparateur LM358, des diodes de protections etc. et après moult bidouillage et essai, j'ai réussi à lire la fréquence avec la librairie FreqMeasure
Anémomètre OK.
Pour la girouette, même histoire, et là j'ai trouvé un code de quelqu'un que j'ai réutilisé/bidouillé/adapté, et avec le code indépendant de l'anémo, la girouette fonctionne et me renvoie la valeur entre 0-360 Deg.
Girouette OK
Là ou cela ce complique, c'est pour unifier les codes en un seul. Je me perds entre les délais de mesure de l'anémo, de calcul, de renvoie, d'affichage des deux capteurs etc. J'ai essayé de retirer les delay, d'utiliser une interruption mais sans succès. J'arrive à afficher les valeurs de la giroutte sans problème, mais pour l'anémo, il y a comme un énorme "lag" entre la réalité et l'affichage des valeurs.
Si l'anémomètre s'arrête, il n'affiche pas "0" mais la dernière mesure prise...
Dans l'utilisation finale, j'aimerai afficher (en serial au début puis après sur un LCD) :
- vitesse instantané relevée (mesure à 0,5 secondes)
- vitesse moyenne du vent ( sur une plage de x minutes)
- vitesse des rafales (moyenne des valeurs les plus élevés dépassant de 18km/h la vitesse moyenne sur x minutes)
- direction du vent
J'en appelle donc à vos bons conseils sur le code ci-dessous afin de m'orienter dans mon codage, j'aimerai bien savoir ce qui est de travers et des pistes comment le corriger !
/* Anemomètre et Girouette NRG40C& NRG200P (récup d'une station météo Campbell)
Version 1.0
*/
#include <FreqMeasure.h>
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Hardware pin definitions
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//PIN Signal de l'anémomètre à brancher sur le PIN(8)
const int analogInPin = A0; // Pin A0 du signal de la girouette NRG 200P
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//Définitions des constantes & variables
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
int period = 500 ; //Période de mesure de l'anémomètre en millisecondes
double sum = 0;
int count = 0;
float vit_ms = 0;
float vit_km = 0;
float vit_kn = 0;
float outputValue = 0;
float rawDirection = 0;
float maxSensorValue = 1023;
float minSensorValue = 0;
int sensorValue = 1;
int finalDirection = 0;
int biggestAddingDirection = 0;
int z = 0;
int sensorValue2 = 0;
int n = 0;
int modeSize = 0;
int c = 0;
int degree = 0;
int addingDirection[] =
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279,
280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319,
320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362
};
volatile unsigned long millis_display = 0; // tempo affichage des infos
//========================================================================================================
// Routine d'intialisation
//========================================================================================================
void setup()
{
Serial.begin(57600);
FreqMeasure.begin(); // Initialise la lecture de l'anémomètre
while (degree < 362) // Set all 362 values to zero.
{
addingDirection[degree] = 0;
degree++;
}
maxSensorValue = 984.9999;
}
//========================================================================================================
// Loop
//========================================================================================================
void loop()
{
//Toutes les x secondes, afficher les infos
if (millis() - millis_display > 1000)
{
anemometre();
girouette() ;
afficherInfos();
millis_display = millis();
}
}