Aide programation carte Arduino uno + Ethernet Shields

Re,

J'ai testé et débuggé ton code, il est désormais 100% fonctionnel :wink:

Deux petites remarques :

  • Les valeurs constantes sont par convention déclaré en const, cela permet au compilateur d'optimisé un peu derrière
  • Une valeur < 255 tient dans un byte (1 octet) pas la peine d'utiliser un int (2 octets) pour si peu :wink:

Tu avais aussi fait une erreur d'inattention :
if(str == "1")
(...)
else if(str == "2") // tu avais oublié le else :wink:
(...)
else
(...)

Ps: C'est un sujet intéréssant ce systéme de XML, j'en ferais bien un article sur mon blog (si ça te dérange pas bien sur, je voudrai pas que cela puisse nuire à ton sujet), d'accord / pas d'accord ?

#include <SPI.h>      // Librairie SPI pour la communication hardware
#include <Ethernet.h> // Librairie Ethernet

byte mac[] = { // Adresse MAC (n'importe quelle adresse fait l'affaire)
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 

IPAddress server(213, 186, 33, 4); // Adresse IP du serveur distant (ici mon serveur web local)

EthernetClient client; // Création d'un objet EthernetClient 

const byte ledPin = 5;  // LED connectée à la LED de monter
const byte ledPin2 = 6; // LED connectée à la LED de descente
const byte ledPin3 = 7; // LED connectée à la LED d'erreur

// setup()
void setup() {

  pinMode(ledPin, OUTPUT);  // Met la broche numérique en sortie 
  pinMode(ledPin2, OUTPUT); // Met la broche numérique en sortie 
  pinMode(ledPin3, OUTPUT); // Met la broche numérique en sortie 

  Serial.begin(9600);       // Initialisation du port série

  if (!Ethernet.begin(mac)) { // Obtention d'une adresse IP par DHCP
    Serial.println("Erreur DHCP");
    for(;;);                  // En cas d'erreur on bloque le programme dans une boucle infini
  }
  Serial.println("DHCP OK");
}

// loop()
void loop()
{
  String str;   // Chaine de char contenant une ligne de la réponse HTTP
  char c;

  delay(10000); // Delai entre deux requétes

  if (client.connect(server, 80)) {           // Connexion au serveur web
    client.println("GET /flux.xml HTTP/1.0"); // Demande de flux.xml en HTTP 1.1
    client.println("Host: www.e-wok.fr");     // Virtual Host 
    client.println("Accept: */*"); // */
    // A cause d'un bug de l'ide arduino tout /* d'ou avoir son */ même dans une chaine de char
    client.println();
    client.println();
  } 
  else {
    Serial.println("Erreur TCP"); // Si erreur lors de la connexion
    return;                       // Quitte loop()
  }

  for(;;) { // Boucle infini
    if(client.available()) { // Si des données son disponible sur l'objet EthernetClient
      c = client.read();     // Lecture d'un octet
      if(c == '\n') {        // Si fin de ligne atteinte
        // (Pensez à mettre une ligne vide à la fin de flux.xml)
        if(str.startsWith("<action>")) { // Si la ligne commence par <action>
          Serial.println(str);
          str.replace("<action>", "");   // 
          str.replace("</action>", "");  // Enléve les balises XML

          if(str == "1") // Si le flux contient "1" on ouvre le volet. (allumage de la LED du pin 5)
          {
            digitalWrite(ledPin, HIGH);   // Allume la LED
            delay(1000);                  // Attend une seconde
          }
          else if(str == "2") // Si le flux contient "2" on ferme le volet. (allumage de la LED du pin 6)
          {
            digitalWrite(ledPin2, HIGH);   // Allume la LED
            delay(1000);                   // Attend une seconde
          }
          else           // Si le flux contient autre chose il ya un un probleme, on fait clignoter la LED de probleme. (LED du pin 7)
          {
            digitalWrite(ledPin3, HIGH);   // Allume la LED
            delay(1000);                   // Attend une seconde

            digitalWrite(ledPin3, LOW);    // Eteint la LED
            delay(1000);                   // Attend une seconde
          }

          break;  // Sort de la boucle infini
        } 

        str = ""; // Vidage de la ligne
      } 
      else
        str += c; // Concaténation de l'octet recu dans la chaine de char
    }

    if(!client.connected()) // Si la connexion a été perdu
      break;                // Sorti de la boucle infini
  }

  client.stop(); // Fermeture de la connexion avec le serveur
}