Yahoo Weather et arduino

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 ?

#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 :wink:

Bonjour,

A la place de l'IP tu peux faire un essai en mettant la chaine de caractères de yahoo.
Voir le post : [Résolu] Mise en oeuvre Ethernet Shield - #3 by skywodd - Français - Arduino Forum
icare

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

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

L'IP semble bonne :

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 ?

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

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 :

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

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.

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

Pourvoir si tu reçoit quelque chose remplace le

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

Par quelque chose du genre

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

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.

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

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

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

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://

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

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

yahoo_weather.ino (2.3 KB)

bonsoir,

Juste pour info, pour ceux qui cherchent des infos météo le site my-meteo.fr est pas mal surtout Widget météo : Ajoutez gratuitement la météo sur votre site web
icare

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 : "628886"

Ensuite dans votre code arduino vous remplacé l'ID (dans l'exemple "12893459") par celui de votre ville

client.println("GET /forecastrss?w=12893459&u=c HTTP/1.0");

Voilà

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