Pages: [1]   Go Down
Author Topic: Yahoo Weather et arduino  (Read 2160 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour, je suis débutant sur arduino et j'aimerais pouvoir récupérer les données météo fournit par yahoo. J'ai trouvé ce code sur le forum mais impossible de le faire fonctionner. Je me demande si l'ip de yahoo et la bonne dans le code. Quelqu'un aurait une idée ?

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 222 };
byte gateway[] = { 192, 168, 0, 254 };
byte subnet[] = { 255, 255, 255, 0 };

// Server Yahoo
IPAddress server(87,248,122,181);

EthernetClient client;
TextFinder  finder( client ); 

char place[50];
char hum[30];


void setup()
{
  // Start Ehternet
  Ethernet.begin(mac, ip);
  // Start Serial Port
  Serial.begin(9600);
  Serial.println("Setup...");
}


void loop()
{
  if (client.connect(server, 80))
  {
    // Call Wetter-API
    // w: ID from your City
    // http://weather.yahooapis.com/forecastrss?w=12893459&u=c
    ///
    Serial.println("Connect to Yahoo Weather...");
    client.println("GET /forecastrss?w=12893459&u=c HTTP/1.0");
    client.println("HOST:weather.yahooapis.com\n\n");
    client.println();
    Serial.println("Connected...");
  }
  else
  {
    Serial.println(" connection failed");
  }
 

  if (client.connected())
  {
   
    // Humidity
   if ( (finder.getString("<yweather:atmosphere humidity=\"", "\"",hum,4)!=0) )
   {
     Serial.print("Humidity:  ");
     Serial.println(hum);
   }
   else
   {
     Serial.print("No Humidity Data");
   }
   
   
    // Place/City
    if ( (finder.getString("<title>Conditions for ", " ",place,50)!=0) )
    {
      Serial.print("City:  ");
      Serial.println(place);
    }
   
   
    // Temperature
    if(finder.find("temp=") )
    {
     int temperature = finder.getValue();
     Serial.print("Temp C:  ");
     Serial.println(temperature);
   }
   else
   {
     Serial.print("No Temperature Data");
   }
   
         
  // END XML
  }
  else
  {
    Serial.println("Disconnected");
  }
 
  client.stop();
  client.flush();
  delay(60000);
}



Merci d'avance pour vos réponses et votre aide  smiley-wink
Logged

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1241
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

A la place de l'IP tu peux faire un essai en mettant la chaine de caractères de yahoo.
Voir le post : http://arduino.cc/forum/index.php/topic,124037.msg932725.html#msg932725
icare
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non ca ne marche pas, voici mon code modifié.

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 222 };

// Server Yahoo
char server[] = "http://weather.yahooapis.com/";

EthernetClient client;
TextFinder  finder( client ); 

char place[50];
char hum[30];


void setup()
{
  // Start Ehternet
  Ethernet.begin(mac, ip);
  // Start Serial Port
  Serial.begin(9600);
  Serial.println("Setup...");
}


void loop()
{
  if (client.connect(server, 80))
  {
    // Call Wetter-API
    // w: ID from your City
    // http://weather.yahooapis.com/forecastrss?w=12893459&u=c
    ///
    Serial.println("Connect to Yahoo Weather...");
    client.println("GET /forecastrss?w=12893459&u=c HTTP/1.0");
    client.println("HOST:weather.yahooapis.com\n\n");
    client.println();
    Serial.println("Connected...");
  }
  else
  {
    Serial.println(" connection failed");
  }
 

  if (client.connected())
  {
   
    // Humidity
   if ( (finder.getString("<yweather:atmosphere humidity=\"", "\"",hum,4)!=0) )
   {
     Serial.print("Humidity:  ");
     Serial.println(hum);
   }
   else
   {
     Serial.print("No Humidity Data");
   }
   
   
    // Place/City
    if ( (finder.getString("<title>Conditions for ", " ",place,50)!=0) )
    {
      Serial.print("City:  ");
      Serial.println(place);
    }
   
   
    // Temperature
    if(finder.find("temp=") )
    {
     int temperature = finder.getValue();
     Serial.print("Temp C:  ");
     Serial.println(temperature);
   }
   else
   {
     Serial.print("No Temperature Data");
   }
   
         
  // END XML
  }
  else
  {
    Serial.println("Disconnected");
  }
 
  client.stop();
  client.flush();
  delay(60000);
}



Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'IP semble bonne :
Code:
C:\>nslookup 87.248.122.181
Nom :    api1.weather.vip.ch1.yahoo.com
Address:  87.248.122.181

Tu dis que ca ne marche pas mais tu ne dis pas où ca bloque.
Qu'est-ce qui s'affiche, qu'est-ce qui ne s'affiche pas ?
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1241
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Peut être une piste de recherche !

Dans le navigateur avec : http://api1.weather.vip.ch1.yahoo.com -> ne trouve pas la page
Dans le navigateur avec : http://weather.yahooapis.com/ -> ne trouve pas la page
Dans le navigateur avec : http://weather.yahooapis.com/forecastrss?w=12893459&u=c -> météo à Schofhausen, CH

icare
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Effectivement http://api1.weather.vip.ch1.yahoo.com/forecastrss?w=12893459&u=c  retourne une erreur

Mais c'est un problème d'alias de noms de serveur :

Code:
C:\>ping weather.yahooapis.com

Envoi d'une requête 'ping' sur eu-weather.a05.yahoodns.net [87.248.122.181] avec 32 octets de données :
Réponse de 87.248.122.181 : octets=32 temps=157 ms TTL=53
...

C:\>nslookup  87.248.122.181
Serveur :   dns2.proxad.net
Address:  212.27.40.241

Nom :    api1.weather.vip.ch1.yahoo.com
Address:  87.248.122.181

Donc l'IP est bonne et le nom aussi.

Donc c'est le code...

Je repose ma question : ca marche jusqu'à où ?

Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Désolé barbudor j'ai oublié de mettre le détail du moniteur série. J'ai du changement car j'arrive à me connecter mais je n'obtient aucune données météo.

Voici ce que dit le moniteur série avec le même code de mon deuxième post.

Code:
Setup...
Connect to Yahoo Weather...
Connected...
Disconnected

Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pourvoir si tu reçoit quelque chose remplace le

Code:
if ( client.connected() )
{
...
}
else
{
    Serial.println("Disconnected");
}

Par quelque chose du genre

Code:
while( client.connected() )
{
  if ( client.available() )
  {
     Serial.print( client.read() );
     delay( 100 );
  }
}
Serial.println("Disconnected");

Ca devrait afficher ce que tu reçoit si tu reçois quelque chose
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si je remplace la partie comme tu me le demande j'ai une erreur de compilation sur la boucle "while" et le compilateur me dit que "while" n'est pas déclaré ???

PS: la traduction de l'interface de la version 1.0.1 de l'IDE et fausse. Dans édition au lieu de "Copier" il ont mis "Coller" lol.
« Last Edit: October 01, 2012, 09:23:19 am by metalos » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu n'as pas du le mettre au bon endroit.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Désolé de la réponse tardive, je t'avouerais que je suis complètement largué avec ce langage.
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon, je viens de recevoir ma carte Ethernet chinoise. Le temps d'essayer 2 examples, je teste ton truc.

1er problème : cette MAC address ne marche pas chez moi :
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

Je pique celle ci dans les exemples de la Lib Ethernet et je change le code de setup pour utiliser le DHCP
Code:
byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };

J'arrive alors au même résultat que toi : connecting ... disconnected

Au bout de quelque secondes, la lumière :
Ca c'estpas bon :
char server[] = "http://weather.yahooapis.com/";

Il faut juste le nom du serveur lui même qu'il faut mettre, pas besoin de http://

Code:
char server[] = "weather.yahooapis.com";

Ci attaché le sketch qui marche, modifié pour fonctionner en mode HDCP

* yahoo_weather.ino (2.3 KB - downloaded 20 times.)
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1241
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bonsoir,

Juste pour info, pour ceux qui cherchent des infos météo le site my-meteo.fr est pas mal surtout http://www.my-meteo.fr/meteo+webmaster.html
icare
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 63
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Merci pour ce code Météo.  smiley-cool

Pour ceux qui cherche l'ID de votre ville il suffit de taper dans votre explorateur :
http://where.yahooapis.com/geocode?q=toulouse+france

Remplacer Toulouse par votre ville et sur la page afficher vous regardé la valeur du champ : "<woeid>628886</woeid>"

Ensuite dans votre code arduino vous remplacé l'ID (dans l'exemple "12893459") par celui de votre ville
Quote
client.println("GET /forecastrss?w=12893459&u=c HTTP/1.0");

Voilà

La source : http://developer.yahoo.com/geo/placefinder/
Logged

Pages: [1]   Go Up
Jump to: