Météo du monde : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(Ressources)
(Ressources)
 
(28 révisions intermédiaires par un autre utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
sorte de serre connectée qui reproduit en temps réel le climat d'un endroit du monde !
 
sorte de serre connectée qui reproduit en temps réel le climat d'un endroit du monde !
  
==membres de l'équipe==
+
==Membres de l'équipe==
 
*Martin Jouannic
 
*Martin Jouannic
 
*Guillaume Brosse
 
*Guillaume Brosse
Ligne 10 : Ligne 10 :
 
* Dumas Alexis
 
* Dumas Alexis
  
==Ressources==
+
==Diaporama==
* https://codebender.cc/sketch:344768#Wemos%20D1%20Open%20Weather%20Map.ino
+
* [[Fichier:Météo du monde.pdf]]
 +
 
 +
==Objectif==
 +
 
 +
Le nom de notre projet est "Météo du monde". L'objectif est de récupérer des données climatiques de n'importe quel lieu dans le monde et ensuite de les reproduire dans une serre en temps réel. Cette reproduction prend en compte la création de la pluie, du brouillard, la lumière du soleil et le vent. Sans oublier que le code qui nécessite une connexion internet permet aussi la lecture de la température, la pluviométrie, la vitesse du vent et l'heure du lieu.
 +
 
 +
==Matériel et utilisation==
 +
 
 +
Le projet est divisé en 2 parties. Une partie maquette et une partie informatique
 +
 
 +
Le matériel requis pour le projet est le suivant :
 +
* Carte Wemos
 +
* 3 Ventilateurs
 +
* 1 lampe
 +
* 1 plaque LabDec
 +
* Des câbles
 +
* Une bassine
 +
* Une maison
 +
* Plaques de plexiglass
 +
* Un brumisateur
 +
* Une pompe
 +
* Des relais
 +
 
 +
 
 +
Partie maquette :
 +
 
 +
Nous prenons une bassine que nous divisons en 2 parties. Une partie pour la maquette et une autre pour l’électronique et l'informatique.
 +
Dans la partie maquette, nous installons une pente sur laquelle nous collons une maison réalisée à l'imprimante 3D. Au dessus de la maquette nous installons une plaque de plexiglas percée de plusieurs petit trous. Sur cette plaque nous mettons un tuyau relié à une pompe (située sous la pente) qui fera coulé l'eau sur le plexiglas afin de reproduire la pluie.
 +
 
 +
[[Fichier:Bassine.jpg]]
 +
 
 +
Partie informatique :
 +
 
 +
Dans la partie informatique, nous installons 3 ventilateurs qui reproduiront le vent, une lampe qui reproduit le jour et la nuit, une pompe qui reproduit la pluie ainsi qu'un brumisateur pour reproduire le brouillard. Ensuite, 4 relais sont nécessaire pour commander chacun des composants tels que la lampe, la pompe, le brumisateur et les ventilateurs. Enfin une carte Wemos pour établir une connexion au site météorologique OpenWeatherMap et d'y récolter les données.
 +
 
 +
[[Fichier:IMG 9272.jpg]]  [[Fichier:Ventilateur.jpg]]
 +
 
 +
==Cadre pédagogique==
 +
 
 +
Le projet est destiné à des écoliers et des collégiens dont l'objectif est de faire ressentir le climat et la météo de n'importe quel lieu dans le monde et d'en améliorer la compréhension. De plus il s'agit de faire prendre conscience de la météo en fonction de la différence géographique et de l'influence des différents climats.
 +
 
 +
==Code==
 +
 
 +
<pre>
 +
#include <dummy.h>
 +
 
 +
// Version v1.02 Works with the Wemos D1 board R2 http://bit.ly/WEMOS_D1
 +
 
 +
#include <ESP8266WiFi.h>
 +
#include <ArduinoJson.h>
 +
 
 +
 
 +
 
 +
#define Rainrelais 3 // GPIO3 maps to Ardiuno D0   
 +
#define Windrelais 1 // GPIO1 maps to Ardiuno D1   
 +
#define Brumerelais 16 // GPIO16 maps to Ardiuno D2
 +
#define Sunrelais 5 // GPIO5 maps to Ardiuno D3
 +
#define D4 4 // GPIO4 maps to Ardiuno D4
 +
#define D5 0 // GPIO14 maps to Ardiuno D5
 +
#define D6 2 // GPIO12 maps to Ardiuno D6
 +
#define D7 14 // GPIO13 maps to Ardiuno D7
 +
#define D8 12 // GPIO0 maps to Ardiuno D8
 +
#define D9 13 // GPIO2 maps to Ardiuno D9
 +
#define D10 15 // GPIO15 maps to Ardiuno D10
 +
 
 +
 
 +
 
 +
const char* ssid    = "ClassCode";      // SSID of local network
 +
const char* password = "123456789";  // Password on network
 +
String APIKEY = "edad85124a2f580818f416a0d6872c2f";
 +
String CityName = "brest, FR"; //brest, france
 +
//String CityName = "Saint-Etienne, FR"; //saint etienne france
 +
//String CityName = "Timbuktu, ML";
 +
//String CityName = "Hong Kong, HK";
 +
WiFiClient client;
 +
char servername[]="api.openweathermap.org";  // remote server we will connect to
 +
String result;
 +
 
 +
int  counter = 60;
 +
 
 +
 
 +
String weatherLocation = "";
 +
String Country;
 +
float Temperature;
 +
float Humidity;
 +
float Pressure;
 +
float Wind;
 +
float Rain;
 +
boolean Brume = false;
 +
String Description = "";
 +
 
 +
 
 +
void setup() {
 +
  Serial.begin(115200);
 +
  int cursorPosition=0;
 +
 
 +
  Serial.println("Connecting");
 +
  WiFi.begin(ssid, password);
 +
 
 +
  while (WiFi.status() != WL_CONNECTED) {
 +
    delay(500);
 +
 
 +
    Serial.println(".");
 +
    cursorPosition++;
 +
  }
 +
 
 +
  Serial.println("Connected");
 +
  digitalWrite(D4, HIGH);
 +
  delay(1000);
 +
 
 +
}
 +
 
 +
void loop() {
 +
    if(counter == 60) //Get new data every 10 minutes
 +
    {
 +
      counter = 0;
 +
      displayGettingData();
 +
      delay(1000);
 +
      getWeatherData();
 +
    }else
 +
    {
 +
      counter++;
 +
   
 +
    displayConditions(Temperature,Humidity,Pressure);
 +
    delay(5000);
 +
     
 +
   
 +
      if (Rain  > 1.00)
 +
      {
 +
        digitalWrite(Rainrelais,HIGH);
 +
        }
 +
        else
 +
        {
 +
          digitalWrite(Rainrelais,LOW);
 +
        }
 +
       
 +
       
 +
       
 +
        if (Wind  > 8.333)
 +
      {
 +
          digitalWrite(Windrelais,HIGH);
 +
        }
 +
        else
 +
        {
 +
          digitalWrite(Windrelais,LOW);
 +
        }
 +
       
 +
        if (Humidity > 60 && Wind <2.222 && Wind > 1.111 && (Description=="verry cloudy" || Description=="Verry cloudy"  ))
 +
      {
 +
          digitalWrite(Brumerelais,HIGH);
 +
          Brume = true ;
 +
        }
 +
        else
 +
        {
 +
          digitalWrite(Brumerelais,LOW);
 +
          Brume = false ;
 +
        }
 +
       
 +
         
 +
        if (Brume==true)
 +
      {
 +
          digitalWrite(Sunrelais,HIGH);
 +
        }
 +
        else
 +
        {
 +
          digitalWrite(Sunrelais,LOW);
 +
        }
 +
       
 +
       
 +
    }
 +
}
 +
 
 +
void getWeatherData() //client function to send/receive GET request data.
 +
{
 +
  if (client.connect(servername, 80)) {  //starts client connection, checks for connection
 +
    client.println("GET /data/2.5/weather?q="+CityName+"&units=metric&APPID="+APIKEY);
 +
    client.println("Host: api.openweathermap.org");
 +
    client.println("User-Agent: ArduinoWiFi/1.1");
 +
    client.println("Connection: close");
 +
    client.println();
 +
    Serial.println("Connection: close");
 +
  }
 +
  else {
 +
    Serial.println("connection failed"); //error message if no client connect
 +
    Serial.println();
 +
  }
 +
 
 +
  while(client.connected() && !client.available()) delay(1); //waits for data
 +
  while (client.connected() || client.available()) { //connected or data available
 +
    char c = client.read(); //gets byte from ethernet buffer
 +
      result = result+c;
 +
    }
 +
 
 +
  client.stop(); //stop client
 +
  result.replace('[', ' ');
 +
  result.replace(']', ' ');
 +
  Serial.println(result);
 +
 
 +
char jsonArray [result.length()+1];
 +
result.toCharArray(jsonArray,sizeof(jsonArray));
 +
jsonArray[result.length() + 1] = '\0';
 +
 
 +
StaticJsonBuffer<1024> json_buf;
 +
JsonObject &root = json_buf.parseObject(jsonArray);
 +
if (!root.success())
 +
{
 +
  Serial.println("parseObject() failed");
 +
}
 +
 
 +
String location = root["name"];
 +
String country = root["sys"]["country"];
 +
float temperature = root["main"]["temp"];
 +
float humidity = root["main"]["humidity"];
 +
String weather = root["weather"]["main"];
 +
String description = root["weather"]["description"];
 +
float pressure = root["main"]["pressure"];
 +
float wind = root["wind"]["speed"];
 +
float rain = root["rain"]["3h"];
 +
 
 +
 
 +
weatherLocation = location;
 +
Country = country;
 +
Temperature = temperature;
 +
Humidity = humidity;
 +
Pressure = pressure;
 +
Wind = wind;
 +
Description = description ;
 +
Rain = rain;
 +
Serial.println(Description);
 +
Serial.println(weatherLocation);
 +
Serial.println(Country);
 +
Serial.println( Temperature);
 +
Serial.println( Humidity);
 +
Serial.println(Pressure);
 +
Serial.println( Wind);
 +
Serial.println(Rain);
 +
}
 +
 
 +
 
 +
void displayConditions(float Temperature,float Humidity, float Pressure)
 +
{
 +
 
 +
  Serial.print("T:");
 +
Serial.print(Temperature,1);
 +
Serial.print((char)223);
 +
Serial.println("C ");
 +
 +
//Printing Humidity
 +
Serial.print(" H:");
 +
Serial.print(Humidity,0);
 +
Serial.println(" %");
 +
 +
//Printing Pressure
 +
Serial.print(0,1);
 +
Serial.print("P: ");
 +
Serial.print(Pressure,1);
 +
Serial.println(" hPa");
 +
 
 +
}
 +
 
 +
void displayGettingData()
 +
{
 +
 +
Serial.print("Getting data");
 +
}
 +
 
 +
</pre>
  
  
 +
==Difficultés rencontrées==
 +
Au cours du projet nous avons rencontré quelques difficultés. Au niveau de la maquette, nous avons hésité à brancher les ventilateurs de la maquette car ils étaient en contact avec l'eau. Pour éviter le court-circuit nous avons pensé à mettre que de l'eau déminéralisée mais finalement nous avons décidé de ne pas utiliser les ventilateurs afin de ne prendre aucun risques. L'autre problème le plus important fut celui de la compilation de notre code. Nous avons finalement réussit à compiler le code en téléchargeant une version plus récente d'arduino néanmoins une erreur est apparue dans le code et a empêché son fonctionnement. La récupération des données sur le site fonctionnaient et c'était le pilotage des données par les relais qui ne fonctionnait. Après résolution de l'erreur, le code se compilait correctement et sans erreur.
 +
Au final, la maquette marche correctement et aussi le code. Nous pouvons dire que notre projet est terminé.
  
[[catégorie:enib2018]]
+
==Ressources==
 +
* https://codebender.cc/sketch:344768#Wemos%20D1%20Open%20Weather%20Map.ino
 +
[[Catégorie:enib2018]]

Version actuelle datée du 19 janvier 2018 à 16:21

sorte de serre connectée qui reproduit en temps réel le climat d'un endroit du monde !

Membres de l'équipe

  • Martin Jouannic
  • Guillaume Brosse
  • Maxime Yvonnou
  • Brendan Dennielou
  • Lucas De Laforet
  • Khaled Jallouli
  • Dumas Alexis

Diaporama

Objectif

Le nom de notre projet est "Météo du monde". L'objectif est de récupérer des données climatiques de n'importe quel lieu dans le monde et ensuite de les reproduire dans une serre en temps réel. Cette reproduction prend en compte la création de la pluie, du brouillard, la lumière du soleil et le vent. Sans oublier que le code qui nécessite une connexion internet permet aussi la lecture de la température, la pluviométrie, la vitesse du vent et l'heure du lieu.

Matériel et utilisation

Le projet est divisé en 2 parties. Une partie maquette et une partie informatique

Le matériel requis pour le projet est le suivant :

  • Carte Wemos
  • 3 Ventilateurs
  • 1 lampe
  • 1 plaque LabDec
  • Des câbles
  • Une bassine
  • Une maison
  • Plaques de plexiglass
  • Un brumisateur
  • Une pompe
  • Des relais


Partie maquette :

Nous prenons une bassine que nous divisons en 2 parties. Une partie pour la maquette et une autre pour l’électronique et l'informatique. Dans la partie maquette, nous installons une pente sur laquelle nous collons une maison réalisée à l'imprimante 3D. Au dessus de la maquette nous installons une plaque de plexiglas percée de plusieurs petit trous. Sur cette plaque nous mettons un tuyau relié à une pompe (située sous la pente) qui fera coulé l'eau sur le plexiglas afin de reproduire la pluie.

Bassine.jpg

Partie informatique :

Dans la partie informatique, nous installons 3 ventilateurs qui reproduiront le vent, une lampe qui reproduit le jour et la nuit, une pompe qui reproduit la pluie ainsi qu'un brumisateur pour reproduire le brouillard. Ensuite, 4 relais sont nécessaire pour commander chacun des composants tels que la lampe, la pompe, le brumisateur et les ventilateurs. Enfin une carte Wemos pour établir une connexion au site météorologique OpenWeatherMap et d'y récolter les données.

IMG 9272.jpg Ventilateur.jpg

Cadre pédagogique

Le projet est destiné à des écoliers et des collégiens dont l'objectif est de faire ressentir le climat et la météo de n'importe quel lieu dans le monde et d'en améliorer la compréhension. De plus il s'agit de faire prendre conscience de la météo en fonction de la différence géographique et de l'influence des différents climats.

Code

#include <dummy.h>

// Version v1.02 Works with the Wemos D1 board R2 http://bit.ly/WEMOS_D1

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>



#define Rainrelais 3 // GPIO3 maps to Ardiuno D0     
#define Windrelais 1 // GPIO1 maps to Ardiuno D1     
#define Brumerelais 16 // GPIO16 maps to Ardiuno D2
#define Sunrelais 5 // GPIO5 maps to Ardiuno D3
#define D4 4 // GPIO4 maps to Ardiuno D4
#define D5 0 // GPIO14 maps to Ardiuno D5
#define D6 2 // GPIO12 maps to Ardiuno D6
#define D7 14 // GPIO13 maps to Ardiuno D7
#define D8 12 // GPIO0 maps to Ardiuno D8
#define D9 13 // GPIO2 maps to Ardiuno D9
#define D10 15 // GPIO15 maps to Ardiuno D10



const char* ssid     = "ClassCode";      // SSID of local network
const char* password = "123456789";   // Password on network
String APIKEY = "edad85124a2f580818f416a0d6872c2f";
String CityName = "brest, FR"; //brest, france
//String CityName = "Saint-Etienne, FR"; //saint etienne france
//String CityName = "Timbuktu, ML"; 
//String CityName = "Hong Kong, HK"; 
WiFiClient client;
char servername[]="api.openweathermap.org";  // remote server we will connect to
String result;

int  counter = 60;


String weatherLocation = "";
String Country;
float Temperature;
float Humidity;
float Pressure;
float Wind;
float Rain;
boolean Brume = false;
String Description = ""; 


void setup() {
  Serial.begin(115200);
  int cursorPosition=0;

  Serial.println("Connecting");
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
   
    Serial.println(".");
    cursorPosition++;
  }

  Serial.println("Connected");
  digitalWrite(D4, HIGH);
  delay(1000);

}

void loop() {
    if(counter == 60) //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
     
     displayConditions(Temperature,Humidity,Pressure);
    delay(5000);
      
     
      if (Rain  > 1.00)
      {
        digitalWrite(Rainrelais,HIGH);
        }
        else
        {
          digitalWrite(Rainrelais,LOW);
        }
        
        
        
         if (Wind  > 8.333)
      {
           digitalWrite(Windrelais,HIGH);
        }
        else
        {
          digitalWrite(Windrelais,LOW);
        }
        
        if (Humidity > 60 && Wind <2.222 && Wind > 1.111 && (Description=="verry cloudy" || Description=="Verry cloudy"   ))
      {
           digitalWrite(Brumerelais,HIGH);
           Brume = true ;
        }
        else
        {
          digitalWrite(Brumerelais,LOW);
           Brume = false ;
        }
        
          
         if (Brume==true)
      {
           digitalWrite(Sunrelais,HIGH);
        }
        else
        {
          digitalWrite(Sunrelais,LOW);
        }
        
        
    }
}

void getWeatherData() //client function to send/receive GET request data.
{
  if (client.connect(servername, 80)) {  //starts client connection, checks for connection
    client.println("GET /data/2.5/weather?q="+CityName+"&units=metric&APPID="+APIKEY);
    client.println("Host: api.openweathermap.org");
    client.println("User-Agent: ArduinoWiFi/1.1");
    client.println("Connection: close");
    client.println();
    Serial.println("Connection: close");
  } 
  else {
    Serial.println("connection failed"); //error message if no client connect
    Serial.println();
  }

  while(client.connected() && !client.available()) delay(1); //waits for data
  while (client.connected() || client.available()) { //connected or data available
    char c = client.read(); //gets byte from ethernet buffer
      result = result+c;
    }

  client.stop(); //stop client
  result.replace('[', ' ');
  result.replace(']', ' ');
  Serial.println(result);

char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';

StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);
if (!root.success())
{
  Serial.println("parseObject() failed");
}

String location = root["name"];
String country = root["sys"]["country"];
float temperature = root["main"]["temp"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];
float wind = root["wind"]["speed"];
float rain = root["rain"]["3h"];


weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;
Wind = wind;
Description = description ;
Rain = rain;
 Serial.println(Description);
 Serial.println(weatherLocation);
 Serial.println(Country);
 Serial.println( Temperature);
 Serial.println( Humidity);
 Serial.println(Pressure);
 Serial.println( Wind);
 Serial.println(Rain);
}


void displayConditions(float Temperature,float Humidity, float Pressure)
{

  Serial.print("T:"); 
 Serial.print(Temperature,1);
 Serial.print((char)223);
 Serial.println("C ");
 
 //Printing Humidity
 Serial.print(" H:");
Serial.print(Humidity,0);
Serial.println(" %");
 
 //Printing Pressure
Serial.print(0,1);
Serial.print("P: ");
Serial.print(Pressure,1);
Serial.println(" hPa");

}

void displayGettingData()
{
 
 Serial.print("Getting data");
}


Difficultés rencontrées

Au cours du projet nous avons rencontré quelques difficultés. Au niveau de la maquette, nous avons hésité à brancher les ventilateurs de la maquette car ils étaient en contact avec l'eau. Pour éviter le court-circuit nous avons pensé à mettre que de l'eau déminéralisée mais finalement nous avons décidé de ne pas utiliser les ventilateurs afin de ne prendre aucun risques. L'autre problème le plus important fut celui de la compilation de notre code. Nous avons finalement réussit à compiler le code en téléchargeant une version plus récente d'arduino néanmoins une erreur est apparue dans le code et a empêché son fonctionnement. La récupération des données sur le site fonctionnaient et c'était le pilotage des données par les relais qui ne fonctionnait. Après résolution de l'erreur, le code se compilait correctement et sans erreur. Au final, la maquette marche correctement et aussi le code. Nous pouvons dire que notre projet est terminé.

Ressources