MeteoPi

L' Anémomètre

Le matériel

Anémomètre - 6410 - Davis Instruments

 Un câble 4 conducteurs de 12 m est fourni avec l'anémomètre-girouette. Si la longueur n'est pas suffisante, le câble peut être rallongé avec des câbles de 2.4 m, 12 m ou 30 m. Acheté chez Chez Météo Shopping

Connexion avec l' Arduino

Le Script

GetWind.ino
#include <math.h>
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Hardware pin definitions
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#define WindSensorPin (3)      // The pin location of the anemometer sensor
#define WindVanePin (A4)       // The pin the wind vane sensor is connected to
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Programme Version
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
char NOM[] = "GetWind";
char VERSION[] = "1.032";
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Variables
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
volatile unsigned long GustPulse;
volatile unsigned long VentPulse;
int VaneValue;			// raw analog value from wind vane
int Direction;			// translated 0 - 360 direction
float WindSpeed;		// Vitesse en Km/heure
float Rafale;
float Vent;
// P nombre de tour - T temps en seconde
// V=P(2.25/T) en mph
float CalWind = 3.621024;
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Timer
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
float TimeGust = 2.5;
float Timesend = 30;
volatile unsigned long CurrentMillis;
volatile unsigned long GustMillis;
volatile unsigned long SendMillis;
volatile unsigned int  TimerGustCount;    	// used to determine 2.5sec timer count
volatile unsigned int  TimerVentCount;    	// used to determine 20sec timer count
volatile unsigned long lastIRQTime;  		// Timer to avoid contact bounce in interrupt routine
/*******************************************************************************
    Fonction IRQ (interruptions)
    Pour le vent et pour la pluie
*******************************************************************************/
void IRQWind()
{
  if ((millis() - lastIRQTime) > 10 )
  {
    GustPulse++;
    VentPulse++;
    lastIRQTime = millis();
  }
}
 
//========================================================================================================
// Routine d'intialisation
//========================================================================================================
void setup()
{
  TimerGustCount = 0;
  TimerVentCount = 0;
  Serial.begin(115200);
  pinMode(WindSensorPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(WindSensorPin), IRQWind, FALLING);
  char Chaine[50] = "";
  sprintf (Chaine, "%s version: %s\t\t| Anemometre Davis", NOM, VERSION );
  Serial.println(Chaine);
  delay (3000);
}
//========================================================================================================
// Boucle Principale
//========================================================================================================
void loop()
{
	CurrentMillis = millis() ;
	if (CurrentMillis > GustMillis )
	{
		WindSpeed = GustPulse * (CalWind / TimeGust);
		if (WindSpeed > Rafale)
		{
			Rafale = WindSpeed;
		}
		GustPulse = 0;
		GustMillis = CurrentMillis + (TimeGust*1000);
	}
	if (CurrentMillis > SendMillis ) 
	{
		getWindDirection();
		Vent = VentPulse * (CalWind / Timesend);
		Serial.print("Vent=");
		Serial.print(Vent, 3);
		Serial.print("|Rafale=");
		Serial.print(Rafale, 3);
		Serial.print("|Compas=");
		Serial.print(Direction);
		Serial.println("|");
		VentPulse = 0;
		Rafale = 0 ;
		SendMillis = CurrentMillis + (Timesend*1000);
	}
}
//========================================================================================================
// Get Wind Direction
//========================================================================================================
void getWindDirection()
{
  VaneValue = analogRead(WindVanePin);
  Direction = map(VaneValue, 0, 1023, 0, 360);
}

Explications

L' arduino envoie au Raspberry (connecté en USB) le message suivant:

Vent=0.241|Rafale=1.448|Compas=336|

Ce message est envoyé toutes les 30 secondes, le vent correspond à la moyenne calculée sur 30 secondes, la rafale est calculée sur une moyenne de 2.5 secondes(Norme Météo FRANCE). Et on conserve la plus forte moyenne.
Le Raspberry se chargeant d'inclure les données dans une Base de données temporaire, en les datant.

meteoduino/anemometre.txt · Dernière modification: 14/07/2017 14:47 par michel
Powered by PHP Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Valid HTML5