Station méteo GSM

Bonjour à tous

j' ai comme projet la création d'une station météo basée sur arduino , elle serait destinée au vol libre .

Pour cela je souhaiterai mesurer la vitesse moyenne du vente , la direction moyenne du vent , ainsi que la température . Ces données seraient consultable par SMS , il suffirait d'envoyer un SMS pour avoir en retour un SMS indiquant les données . La station sera alimentée par un panneau solaire .

La prochaine évolution serait de la connecter à internet . mais cela ce fera dans un autre temps .

J ai passé beaucoup de temps sur le net a chercher des informations , mais la je n'y arrive plus , j ai besoin d'aide .

le but est d'avoir un topic avec l'ensemble des explications pour que cela soit accessible à tous sans ce faire un nœuds au cerveau

Mon matériel :

  • un carte Arduino Uno
  • un capteur DHT11 pour la température et l'hygrométrie
  • un ensemble girouette et anémomètre SEN 08942
  • un module GSM sim 900
  • module RTC I2C

sketch pour la mesure de la vitesse / direction du vent

Voici le schéma de câblage :

la résistance doit être de 10 000 ohm

sketch permettant de lire la vitesse depuis le moniteur série

// Pin definitions pour la vitesse du vent
# define Hall sensor 2		     // Receive the data from sensor

// Constants definitions
const float pi = 3.14159265;           // pi number
int period = 5000;	             // Measurement period (miliseconds)
int delaytime = 0;	            // Time between samples (miliseconds)
int radius = 69;		   // Radius from vertical anemometer axis to a cup center (mm)

// Variable definitions
unsigned int Sample = 0;	 // Sample number
unsigned int counter = 0;	// magnet counter for sensor
unsigned int RPM = 0;	         // Revolutions per minute
float speedwind = 0;	       // Wind speed (m/s)
float windspeed = 0;           // Wind speed (km/h)

int Direction ; // Wind direction

#define PotPin (A0)    // define the input pin for the wind vane potentiometer
int PotValue = 0;      // variable to store the value coming from the potentiometer
int DirCorr = 0;       // Correction on direction ( - 360  to + 360)

#define PIN_ANEMOMETER  2     // analogique 2

void setup() { 
  // Set the pins
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);     //internall pull-up active
  
  Serial.begin(9600);
}

void loop() { 
  
  
  
  Sample++;
  
  
  windvelocity();
 
  
  RPMcalc();
  
 
  
  Serial.print("vitesse  vent:");
  
  
//*****************************************************************
             
  
//*****************************************************************
//print km/h  
  SpeedWind();
  Serial.print(speedwind*1.538); // la vitesse de base avec le logiciel est de 1.56 km/h par tour , avec le capteur SEN-08942   c est 2.4 km/h par tour  donc je multiplie par 1.58
  Serial.print(" [km/h] ");  
  Serial.println();


  delay(delaytime); 
  
   int sensorValue = analogRead(A0); // lit la valeur analogique sur la broche A0
  // et met le résultat dans la variable
  
  delay(0);
 

// Wind Direction
    Serial.print("Direction du vent: ");
   
   if ((sensorValue>880) && (sensorValue<900)) {
    Serial.println("Nord Ouest");
    } 
   if ((sensorValue>85) && (sensorValue<100)) {
    Serial.println(" Est");
    } 
   if ((sensorValue>180) && (sensorValue<190)) {
    Serial.println("Sud Est");
    } 
   if ((sensorValue>200) && (sensorValue<300)) {
    Serial.println(" Sud");
    } 
    if ((sensorValue>630) && (sensorValue<640)) {
    Serial.println("Sud Ouest");
    } 
    if ((sensorValue>940) && (sensorValue<950)) {
    Serial.println(" Ouest");
    } 
    if ((sensorValue>460) && (sensorValue<470)) {
    Serial.println("Nord Est");
    } 
    if ((sensorValue>780) && (sensorValue<=800)) {
    Serial.println(" Nord");
    } 
    

}

// Measure wind speed
void windvelocity(){
  speedwind = 0;
  windspeed = 0;
  
  counter = 0;  
  attachInterrupt(0, addcount, CHANGE);
  unsigned long millis();			  
  long startTime = millis();
  while(millis() < startTime + period) {
  }
}



void RPMcalc(){
  RPM=((counter*2)*60)/(period/1000);  // calcul le nombre de tour par minute  (RPM)
}

void WindSpeed(){
  windspeed = ((2 * pi * radius * RPM)/60) / 1000;  // Calculate wind speed on m/s ( marche pas ) 
 
}

void SpeedWind(){
  speedwind = (((2 * pi * radius * RPM)/60) / 1000)*3.6;  // Calculate wind speed on km/h
 
}

void addcount(){
  counter++;
}

Lire la température et l'hygrométrie avec un capteur DHT 11

Schéma de câblage :

[url=http://[![|500x443](http://img15.hostingpics.net/pics/680173cablageDHT11.jpg)

Le sketch pour le DHT 11 :

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHT test");

  dht.begin();
}

void loop() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");
  }
}

Sketch pour la lecture de l'heure avec un module RTC DS1307 , de type I2C

Schéma de câblage :

[url=http://[![|500x210](http://img15.hostingpics.net/pics/921883cablageDS1307moduleRTC.png)

Le sketch pour lire l'heure avec le moniteur série :

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
// 2010-02-04 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC;

void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
    
    // following line sets the RTC to the date & time this sketch was compiled
    //RTC.adjust(DateTime(__DATE__, __TIME__));
}

void loop () {
    DateTime now = RTC.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    delay(1000);
}

Voila l'ensemble des données que j'ai réussie à regrouper .

pour commencer je voudrais mesurer la vitesse et la direction du vent sur une moyenne de 10 mn .

avez vous des idées .

Merci d'avance

Sébastien

](http://www.hostingpics.net/viewer.php?id=921883cablageDS1307moduleRTC.png)](http://www.hostingpics.net/viewer.php?id=680173cablageDHT11.jpg)

bonjour,
deux choses
1/
pourquoi prendre un capteur dont les données sont des plus oneagainmorebistoufly :slight_smile:
un dht22-23 serait nettement mieux, surtout pour du vol libre.

2/
pourquoi utliser un rtc?
tu peux avoir l'heure via le gsm

Bonsoir,

Une piste pour simplifier énormément la prise en compte de la réception du SMS (demande des relevés) :

Utiliser la broche RI du SIM900 (accessible sur certains shields) pour déclencher une interruption sur l'Arduino

ça marche très bien et c'est simple (pas de lecture et parsing de SMS) !

Bonsoir

Oui en effet le DHT 11 n'est vraiment pas précis , mais bon j' ai acheté un kit avec pas mal de module , et je n'ai que ça pour le moment . Ce qui intéresse vraiment c est la température , l'hygrométrie c'est pour le fun .
Etant frigoriste , j’utilise très souvent des sonde de températures PT100 qui sont très fiable dans le temps , je vais essayer de trouver un sketch la dessus .

Pour le module RTC je souhaitais avoir l'heure , je ne savais pas que je pouvais l'avoir avec le module GSM .

Voila une photo de mon matériel :
[url=http://[![|500x375](http://img15.hostingpics.net/pics/82869220160129224408resized.jpg)](http://www.hostingpics.net/viewer.php?id=82869220160129224408resized.jpg)]

Comment faire pour faire un moyenne de la vitesse et de la direction du vent sur une periode de 10mn ?

merci

Bonsoir.

Au passage, étant passionné de météo, sympathique projet et bon amusement !

Cependant même la température sur le DHT11 ne reste qu'un entier. Pour avoir une précision à 0.1, vaut mieux, comme le dit infobarquee, s'orienter sur le DHT22. Sinon il y a aussi la sonde DS18B20, si l'humidité ne vous intéresse pas, qui en plus est étanche et flexible donc très pratique pour l'installation en exterieur (abri météo par exemple).

Au passage, si la pression atmosphérique vous tente pour vos applications, il existe un shield combo sonde de pression et température MPL3115A2 en i2c, aussi facile au cablage et à programmer, mais plus onéreux que le DHT22 ...

Pour la vitesse du vent, à voir le datasheet, ils parlent de 2,4 km/h si un tour de l'hélice en 1 seconde (fermeture du contact). Il suffit de compter ces fermetures en un laps de temps puis de faire des conversions.

Bon courage pour la suite !

Bonjour

je pense améliorer la station dans l'avenir , mais pour le moment je préfère aller sur le principale .

j ' ai besoin de faire la vitesse moyenne du vent sur une période de 10 mn , pareil pour la direction du vent .

il faut que je trouve une fonction pour la mise en mémoire temporaire des donnée , en faire la somme et la divisée par le nombre de mesure .

le top serai d'avoir un mesure toute les 20 seconde sur 10 mn

Cette fonction devra ce répétée mais aussi s'effacer pour éviter de remplir la mémoir .

avez vous des pistes .

merci

pour le vent, il suffit de compter et faire un tableau de X données.
par contre, a savoir si capteur anémo en ILS ou autre pour compter les impulsions.

mais 10mn parait long, je mettrais 1mn en glissant.
ca permet si on recoit un sms, de faire le calcul plus vite, surtout pour du vol libre.
ca peut changer énormément en 10mn avec un vent thermique par exemple.

après, est ce que tu veux conserver ou non les données pour faire un historique sur l'année par exemple?

si pas besoin, tu envoie le sms, le nono fait les mesures sur 1 mn, puis envoie les données en retour.

serais tu le seul a demander les données?

Salut

je vais voir ce que cest le tableau de X données , après pour la vitesse du vent c'est pas mal la moyenne de 5 mn , admettons une mesure toutes les 20 secondes sur 5 mn , soit 15 mesures .ca permet de moyenner la vitesse avec les passages thermiques ; généralement ont attend 2/3 mn entre deux passages mais ça varie pas mal , sa dépend de la journée :wink: .
Il serai bien aussi d'avoir la vitesse maxi sur la période d'enregistrement .

concernant les données pas besoin de faire d'historique , enfin pour le moment car c est déjà assez compliqué , mais dans l'avenir je souhaiterai pouvoir les envoyer sur le net . ( mais plus tard )

il faudrait que le mesure moyenne soit stockées temporairement entre deux cycle de mesure , pour avoir une réponse rapide lors de l'envoie d'un SMS.

je souhaite que tout le monde puisse consulter la station , simplement en envoyant un sms . le module GPRS retournerai un sms avec le numéro du sms d'appel .

J' aimerai avoir une réponse de ce type :

Site de vol libre de Marlens
Date : 30/01/2016 15h30
Température : 16 °c
Vitesse moyenne : 20 km/h
Vitesse max :30
Direction moyenne : Ouest

pour la moyenne, c'est pas compliqué
pour le max, non plus, tu prends une base de 0km/h en départ, si lecture > départ, on garde et départ vaut nouvelle valeur

moyenne vent, si en degrés, idem, on fait la moyenne et les degrés sont retournés en mot (ouest par exemple)

en effet ça n'a pas l'air d’être trop compliqué pour toi , pourrais tu m'aider en compilant le code de départ , après je ferais le reste .

merci

Bonjour à tous,

J'ai lu attentivement, du moins je l'espère, tout ce qui a été dit dans ce post et peut être pourrez vous m'aider :

J'ai récupéré l'anémomètre et la girouette de tête de mât du bateau d'un ami. L'état mécanique de l'ensemble me paraît excellent. En approchant le moulinet d'une boussole, l'on observe une déviation. La girouette quant à elle, fait carrément tourner l'aiguille aimantée. L'ensemble provient d'un combiné NAVMAN Wind 3100. La sortie du câble blindée comprend quatre fils de couleur et la masse et (d'après la doc. p29, voir ci-dessous) celle-ci était reliée à un boitier de raccordement et l'afficheur etc... :

http://www.navmanmarine.net/upload/Marine/Internet_Manuals/3000/3100_wind_MN134_1951320B_fre_web.pdf

Je suppose et j'espère que les deux fonctionnent par effet Hall.

J'aimerai vous l'avez compris utiliser cet ensemble avec Arduino, et réaliser une station météo avec le complément indispensable.

Je pense que les signaux délivrés par l'anémo et la girouette peuvent être utilisé directement sur Arduino. Il me reste à déterminer quels sont les fils de couleur associés à l'anémo et à la girouette sans détruire quoique ce soit. Je pensais m'inspirer pour le branchement du sketch proposé par Paraseb. Auriez vous des suggestions à me faire?

Nota: je débute en programmation sur Arduino ...

Bonjour
Vous je voudrais savoir si vous avez réussi a faire votre anémomètre car je suis intéressé pour en faire un identique

Salut les amis

il faut vivre avec son temps , je vais remplacer le module GSM par une carte Arduino MKR FOX 1200.

Je la reçoit dans dans 2 jours .

L'idée c est pas passer par le réseau sigfox pour envoyer les données .

Mais pour le moment il faut deja que j'arrive a faire marcher l'anémomètre . ça ne fonctionne pas .

Pour info je vais tour reprendre depuis le début

Seb

Salut

j' ai reçu mon mon MKR FOX1200 , mais les problèmes commence :wink:

concerne la première config avec l'enregistrement du produit .

Dans l'IDE -> EXEMPLES-> MKRFOX1200 -> Firstconfiguration

un problème survient lors de la vérification :

Arduino : 1.8.4 (Windows 7), Carte : "Arduino MKR FOX 1200"



C:\Users\seb\Documents\Arduino\libraries\ArduinoLowPower-master\src\samd\ArduinoLowPower.cpp:49:11: error: 'class RTCZero' has no member named 'isConfigured'

  if (!rtc.isConfigured()) {

           ^

C:\Users\seb\Documents\Arduino\libraries\ArduinoLowPower-master\src\samd\ArduinoLowPower.cpp:54:6: error: 'class RTCZero' has no member named 'setAlarmEpoch'

  rtc.setAlarmEpoch(now + millis/1000);

      ^

C:\Users\seb\Documents\Arduino\libraries\ArduinoLowPower-master\src\samd\ArduinoLowPower.cpp: In member function 'void ArduinoLowPowerClass::attachInterruptWakeup(uint32_t, voidFuncPtr, uint32_t)':

C:\Users\seb\Documents\Arduino\libraries\ArduinoLowPower-master\src\samd\ArduinoLowPower.cpp:65:20: error: no matching function for call to 'RTCZero::begin(bool)'

     rtc.begin(false);

                    ^

C:\Users\seb\Documents\Arduino\libraries\ArduinoLowPower-master\src\samd\ArduinoLowPower.cpp:65:20: note: candidate is:

In file included from C:\Users\seb\Documents\Arduino\libraries\ArduinoLowPower-master\src/ArduinoLowPower.h:11:0,

                 from C:\Users\seb\Documents\Arduino\libraries\ArduinoLowPower-master\src\samd\ArduinoLowPower.cpp:3:

C:\Users\seb\Documents\Arduino\libraries\RTCZero\src/RTCZero.h:42:8: note: void RTCZero::begin()

   void begin();

        ^

C:\Users\seb\Documents\Arduino\libraries\RTCZero\src/RTCZero.h:42:8: note:   candidate expects 0 arguments, 1 provided

Utilisation de la bibliothèque Arduino_SigFox_for_MKRFox1200 version 1.0.4 dans le dossier: C:\Users\seb\Documents\Arduino\libraries\Arduino_SigFox_for_MKRFox1200 
Utilisation de la bibliothèque SPI version 1.0 dans le dossier: C:\Users\seb\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.17\libraries\SPI 
Utilisation de la bibliothèque ArduinoLowPower-master version 1.2.0 dans le dossier: C:\Users\seb\Documents\Arduino\libraries\ArduinoLowPower-master 
Utilisation de la bibliothèque RTCZero version 1.4.1 dans le dossier: C:\Users\seb\Documents\Arduino\libraries\RTCZero 
exit status 1
Erreur de compilation pour la carte Arduino MKR FOX 1200

C est la misere je compte sur vous pour m'aider

paraseb:
Salut

j' ai reçu mon mon MKR FOX1200 , mais les problèmes commencent :wink:
concerne la première config avec l'enregistrement du produit .
...
C'est la misère je compte sur vous pour m'aider

j'ai posté un petit tuto pour détailler ce que j'avais fait quand j'ai reçu le mien. Jetez un oeil

Bonjour à tous,

Je travaille également sur une mesure de direction et de vitesse du vent avec un ensemble Anémomètre-Girouette de marque DAVIS 7911 que j'ai récupéré.

Je n'ai que deux mois d'expérience sur Arduino et j'apprends en tâtonnant et grâce à ce forum.

Ces caractéristiques sont ici :

https://www.meteo-shopping.fr/files/mode_emploi/Anemometre-girouette-standard-7911_SS.pdf

Je ne sais pas bien comment le brancher sur l'Arduino au niveau électronique.

Faut-il le câbler comme sur le circuit utilisé par ParaSeb ?

Ce capteur était utilisé sur une balise Météo FFVL. Les fils jaune et vert sont reliés ensemble.

Donc, je sollicite votre aide pour le câblage.

Pour l'instant, j'ai un programme qui fonctionne pour l'Anémomètre que j'ai câblé direct entre la masse et l'entrée digitale 2.

Je ne traite pas l'anti-rebond et il faudra sans doute que je le fasse comme indiqué sur le schéma de ParaSeb. Votre avis ?

Je poste ci dessous le code qui fonctionne après pas mal d'essais :

Merci pour votre aide.

//Anémomètre DAVIS 7911 - Doc : https://www.meteo-shopping.fr/files/mode_emploi/Anemometre-girouette-standard-7911_SS.pdf
//Inspiré de la discution : http://forum.arduino.cc/index.php?topic=501458.0
//Fonctionne mais non encore testé pour voir si valeurs cohérentes !

const byte interruptPin = 2;
unsigned long timeold;
int nombreTourSec = 0;
float vitesseVent(0);
float FEtalonage(1);
volatile unsigned int comptageILS = 0; // une variable utilisée dans une interruption doit être déclarée "volatile"

void interruptILS() //comptage de l'ILS
{
  comptageILS++;
}

void setup()
{
  Serial.begin(9600);
  pinMode(interruptPin, INPUT_PULLUP);
  //  attachInterrupt(digitalPinToInterrupt(interruptPin), interruptILS, CHANGE);
  attachInterrupt(digitalPinToInterrupt(interruptPin), interruptILS, FALLING);
  timeold = millis();
}

void loop()
{
  if ((millis() - timeold) > 1000) { // durée d'1 seconde
    nombreTourSec = comptageILS; //comptage du nombre de tours par seconde
    vitesseVent = 0.2762 * nombreTourSec;
    Serial.println(comptageILS);
    comptageILS = 0; // réinitialisation du comptage
    Serial.print("Vitesse du vent = "); // affichage des valeurs
    Serial.print(vitesseVent);
    Serial.print(" km/h\r\n");
    timeold = millis();
    vitesseVent = 0;
  }
}