Go Down

Topic: Yahoo Weather et arduino (Read 2570 times) previous topic - next topic

metalos

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: [Select]

#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  ;)

icare

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
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

metalos

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

Code: [Select]

#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);
}




barbudor

L'IP semble bonne :
Code: [Select]
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 ?
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 ?

icare

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
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

barbudor

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: [Select]
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ù ?

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 ?

metalos

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: [Select]

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



barbudor

Pourvoir si tu reçoit quelque chose remplace le

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


Par quelque chose du genre

Code: [Select]

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
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 ?

metalos

#8
Oct 01, 2012, 04:20 pm Last Edit: Oct 01, 2012, 04:23 pm by metalos Reason: 1
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.

barbudor

Tu n'as pas du le mettre au bon endroit.
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 ?

metalos

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

barbudor

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: [Select]
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: [Select]
char server[] = "weather.yahooapis.com";

Ci attaché le sketch qui marche, modifié pour fonctionner en mode HDCP
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 ?

icare

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
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

DizHell

Bonjour,

Merci pour ce code Météo.  8)

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/

Go Up