Aide programation carte Arduino uno + Ethernet Shields

Bonjour, je suis actuellement en terminal S SI et ait donc un PPE a faire, moi et mes camarade avons choisie de faire un store pilotable depuis une application mobile.
Nous avons choisie d’utilisée une carte Arduino, celle ci doit:

  • Récupéré un flux RSS dans lequel sera inscrit “ouvert” ou “fermé”.

  • Si l’information est “ouvert” on ouvre le store dans le cas contraire on le ferme

le store possède des capteurs pour connaitre sa position “ouvert” “fermé” ou “intermédiaire”, les capteur renvoi cette information a l’Arduino.

  • L’Arduino reçoit les info des capteurs et envoie dans la base de donné du site l’état du volet “ouvert” “fermé” ou “intermédiaire”

Aucun de nous ne connait la programmation C/C++ malheureusement, si l’un de vous pouvez m’aider a réalisé ce programme ça me permettrai de faire un démonstration pendant la soutenance (on possède la carte.

J’ai trouver déjà ce programme sur internet pour récupéré le flux RSS mais le compilateur Arduino trouve plusieurs erreurs :

le programme Code C :

// déclarer l'objet qui contiendra les données RSS
Channel channel;

void setup() {

  // lors de la création de la chaine, on passe l'adresse du flux RSS
  channel = new Channel(this, "http://www.assemblee-nationale.fr/rss/rss_presse.xml");
  channel.on_screen();
}


class Channel {

  String title, description;
  Cri[] cris = new Cri[0]; // créer une liste de Cri vide (chacun avec titre,date,descriptif)

  Channel(PApplet app, String s) {

    XMLElement document;


    try {
      document = new XMLElement(app, s);
    }
    catch (Exception e) {
      println(" erreur ):" + e);  
      return;
    }

    if (!document.getStringAttribute("version").equals("2.0")) return;
    if (0 == document.getChildCount() && !document.getChild(0).getName().equals("channel")) return;

    XMLElement channel = document.getChild(0);

    int nombre_items = channel.getChildCount();

    for (int i = 0; i < nombre_items; i++) {

      XMLElement enfant = channel.getChild(i);

      if (enfant.getName().equals("title")) {
        // chercher le titre (son contenu)
        title = enfant.getContent();
      }

      if (enfant.getName().equals("description")) {
        // chercher le descriptif
        title = enfant.getContent();
      }

      // on a trouvé un <item> (ce qui nous intéresse)
      if (enfant.getName().equals("item")) {

        String titre;
        String date;
        String descriptif;

        // créer des variables temporaires pour les données qui nous intéressent
        try {
          titre = enfant.getChild("title").getContent();
        }
        catch (Exception e) {
          titre = "";
          println(e);
        }

        try {
          date = enfant.getChild("pubDate").getContent();
        }
        catch (Exception e) {
          date = "";
          println(e);
        }

        try {
          descriptif = enfant.getChild("description").getContent();
        }
        catch (Exception e) {
          descriptif = "";
          println(e);
        }

        cris = (Cri[])append( cris, new Cri(titre, date, descriptif) );
      }

    }

  }

  void on_screen() {

    // le debugger


    // s'il n'y a pas eu de données
    if (0 == cris.length) {

      println("Je n'ai pas pu me connecter au flux rss");
      return;
    }  

    // sinon demander à chaque donner de s'afficher
    for(int i=0; i < cris.length; i++) {
      cris[i].read();
    }

  }

  class Cri {

    String titre, date, descriptif;

    // le constructeur de chaque CRI
    Cri(String _titre, String _date, String _descriptif) {
      titre = _titre;
      date = _date;
      if (null == _descriptif) descriptif = "";
      else descriptif = _descriptif;

    }

    // dessiner cette dépêche
    void read() {

      println(titre);

      println(date);

      println(descriptif);
      println("------------------------------------------------------");

    }

  }

}

les erreurs :

sketch_apr03a:1: error: ‘Channel’ does not name a type
sketch_apr03a.cpp: In function ‘void setup()’:
sketch_apr03a:6: error: ‘channel’ was not declared in this scope
sketch_apr03a:6: error: expected type-specifier before ‘Channel’
sketch_apr03a:6: error: expected ;' before 'Channel' sketch_apr03a.cpp: At global scope: sketch_apr03a:14: error: ISO C++ forbids declaration of 'Cri' with no type sketch_apr03a:14: error: expected ';' before 'cris' sketch_apr03a:16: error: expected )’ before ‘app’
sketch_apr03a:135: error: expected `}’ at end of input
sketch_apr03a:135: error: expected unqualified-id at end of input

Si quelqu’un pouvait m’aider a debuger ce programme et faire le second pour récupérer les informations des capteurs.

Si vous voulez on peut vous achetez le programme 5-10e je sait pas combien ça peut valoir.

En tout cas Merci

Bonjour

1) utilise les balises code pour rendre ton code lisible

2) A priori tu commences à utiliser la classe Channel avant de l'avoir déclarer.

  1. Le post n’est pas aux bon endroit “Réalisations et Projets Finis” .
  2. code entre balise code [code][/code]

Goldorak78:
Si quelqu’un pouvait m’aider a debuger ce programme et faire le second pour récupérer les informations des capteurs.

Si vous voulez on peut vous achetez le programme 5-10e je sait pas combien ça peut valoir.

:astonished:
Aide, conseils, tout ce que tu veux, mais tu ne trouveras personnes pour faire le travail à votres place (5-10€ c’est vraiment la crise, à la limite pourquoi pas un coca et un mars :grin:)

Goldorak78:
Aucun de nous ne connait la programmation C/C++ malheureusement

Je sais pas ce qu’est un S SI et PPE , mais il va peut être falloir commencer par apprendre un minimum sinon je sais pas comment vous allez présenter ça ou alors changez de projet pour un que vous maitriseriez mieux ?

sketch_apr03a:1: error: 'Channel' does not name a type

Manque peut être #include <Channel.h> ou libs mal placées ?
Il va le chercher comment le flux rss ton objet Channel ?
XMLElement je ne connais pas de lib arduino ou autre parser xlm ?
Cri(String _titre, String _date, String _descriptif) il manque des chose là …
etc
etc
etc

J’ai trouver déjà ce programme sur internet pour récupéré le flux RSS

Il vient d’où ce code ?
Reprendre du code et faire un mix n’est jamais une bonne idée, ça ne marche jamais au final, mieux vaut l’étudier, le comprendre et le faire sois même.
D’ailleurs d’après ce que je vois là, je ne suis même pas certain qu’il soit prévu pour arduino donc compilateur avr, avr-g++, avr-gcc ou autre ???

Donc si c’est de l’aide dont tu as besoin n’hésite pas, même si ce n’est que pour t’orienter vers la bonne solution.

Bonjour,

Goldorak78:

  • Récupéré un flux RSS dans lequel sera inscrit “ouvert” ou “fermé”.

  • Si l’information est “ouvert” on ouvre le store dans le cas contraire on le ferme

le store possède des capteurs pour connaitre sa position “ouvert” “fermé” ou “intermédiaire”, les capteur renvoi cette information a l’Arduino.

  • L’Arduino reçoit les info des capteurs et envoie dans la base de donné du site l’état du volet “ouvert” “fermé” ou “intermédiaire”

Le projet en soit est assez simple, tu doit obligatoirement utiliser un flux rss ?
Les flux rss sont trés lourd à gérer, et une carte arduino n’as que 2Ko de ram :wink:

Goldorak78:
Aucun de nous ne connait la programmation C/C++ malheureusement, si l’un de vous pouvez m’aider a réalisé ce programme ça me permettrai de faire un démonstration pendant la soutenance (on possède la carte.

On ne peut pas te mâcher le travail, une soutenance permet de voir le travail réalisé.
Regarde sur le siteduzéro pour avoir la syntaxe de base du C/C++, elle n’est pas si compliqué que ça.
Ensuite pour la partie programmation arduino tu peut aller faire un tour sur mon blog, j’ai fait des vidéos tutoriel trés simple même pour un débutant :wink:

Goldorak78:
J’ai trouver déjà ce programme sur internet pour récupéré le flux RSS mais le compilateur Arduino trouve plusieurs erreurs :

le programme Code C :

(…)

Mauvaise pioche ! C’est pas du C/C++ arduino :wink:
C’est du java avec processing, ne jamais tenter de piquer des morceau de code par ci par là, c’est une mauvaise idée :wink:

Goldorak78:
Si quelqu’un pouvait m’aider a debuger ce programme et faire le second pour récupérer les informations des capteurs.

Si vous voulez on peut vous achetez le programme 5-10e je sait pas combien ça peut valoir.

Tetete pas de ça sur le forum :wink:
On peut t’aider autant que nécéssaire mais on ne fait pas le travail à ta place, c’est un forum communautaire pas un e-shop :wink:

Bon revenons à ton projet :

  • quelle est ton matériel actuel ?
  • par quelle moyen l’arduino doit recevoir les ordres ?
  • combien de temps te reste t’il avant ta soutenance ?

Bonjour j’avais oubliez de suivre le sujet :confused:

tu doit obligatoirement utiliser un flux rss ?

L’avantage c’est que c’est sécurisé, on a penser a faire avec un serveur web intégré mais ça posé problème au niveau de l’ip.

quelle est ton matériel actuel ?

Carte Arduino Uno + Arduino Ethernet Shield + une breadboard avec pas mal de composant.

par quelle moyen l’arduino doit recevoir les ordres ?

L’Arduino lis le flux RSS si c’est marqué “ouvrir” il envoi l’ordre au volet de monter si c’est marqué “fermé” il envoi l’ordre au volet de descendre. Le volet est contrôlable par des relais et un Pont en H.

Combien de temps te reste t’il avant ta soutenance ?

Je doit rendre mon dossier au retour des vacances scolaires le 30 avril la soutenance est dans la semaine suivante. Après notre dossier est fini il reste simplement a faire quelques finitions sur le site web et programmé L’Arduino.

Je vais essayer de faire moi même le programme, j’ai réussi a mettre les drivers de la carte et a exécuté un petit programme pour faire clignoté une LED. J’ai ensuite regardé comment marché la carte Ethernet Shield j’ai vu qu’il fallait commencer par lui donner une adresse IP j’ai chercher sur arduino.cc et ils donnent le programme suivant :

#include <Ethernet.h>

// the media access control (ethernet hardware) address for the shield:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
//the IP address for the shield:
byte ip[] = { 10, 0, 0, 177 };    


void setup()
{
  Ethernet.begin(mac, ip);
}

void loop () {}

Mais j’obtiens cette erreur :

In file included from C:\Documents and Settings\Nicolas\Mes documents\Downloads\arduino-1.0\libraries\Ethernet\Dhcp.cpp:4:
C:\Documents and Settings\Nicolas\Mes documents\Downloads\arduino-1.0\libraries\Ethernet\utility/w5100.h:14:17: error: SPI.h: No such file or directory

il manque en effet spi.h dans le dossier :cold_sweat: j’ai fait quelque recherche sur google pour cette erreur mais j’i rien trouver de concluant.

Ajoute #include <SPI.h> avec le include de ethernet.h :wink:

Ensuite pour ce qui est du fichier xml c’est certes pratique et sécurisé mais extrêmement complexe à mettre en place même pour un programmeur expérimenté (il faut faire son parser xml à la main en prenant en compte la limite en terme de taille de la ram, etc …).

Vu le peu de temps d’on tu dispose tu devrais partir sur quelques chose de plus simple utilisant un serveur web avec php :

(Ps: depuis quand dispose tu de ton sujet de PPE ? J’ai comme l’impression que tu as attendu le dernier moment pour le commencer ;))

depuis quand dispose tu de ton sujet de PPE ? J’ai comme l’impression que tu as attendu le dernier moment pour le commencer

On a le sujet depuis décembre et on a commencer a le travaillé en cours en janvier, après comme je l’ai dit notre dossier écrit est presque bouclé et atteint les 100 pages seul la partie programmation de l’Arduino reste a faire :slight_smile: on a juste pris du retard car on était partit sur un serveur web et on a finalement choisie le flux RSS donc on est passé d’une carte PICDEM a une carte Arduino, mais comme les profs nous l’on acheter on doit la programmer pour faire une démo pour la soutenance sinon on aurait juste fait un algorigramme sur papier et ça aurait suffit :stuck_out_tongue:

Après le flux XML est ultra simple c’est :

<?xml version="1.0" encoding="ISO-8859-1"?>
<action>ouvrir</action>

ou

<?xml version="1.0" encoding="ISO-8859-1"?>
<action>fermé</action>

rien d’autre donc je pense que niveau RAM ça peut passer ?

Goldorak78:

<?xml version="1.0" encoding="ISO-8859-1"?>

ouvrir




ou



<?xml version="1.0" encoding="ISO-8859-1"?>

fermé




rien d'autre donc je pense que niveau RAM ça peut passer ?

Si se trouve toujours sur une même ligne c’est jouable.
Tu récupère chaque ligne une par une et tu regarde si elle contient , si oui tu la découpe en morceau avec String.
(Je te prépare un petit exemple ;))

Edit :

#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(10, 0, 0, 19); // Adresse IP du serveur distant (ici mon serveur web local)

EthernetClient client; // Objet EthernetClient 

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

  if (!Ethernet.begin(mac)) { // Opbtention 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.0
    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>
          str.replace("<action>", ""); // Enléve les balises XML
          str.replace("</action>", "");
          Serial.println(str); // Affiche la valeur du noeud XML
          // ... TODO
          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
}

Il te reste deux if(…) et quelques pinMode / digitalWrite à ajouter tu devrais t’en sortir :wink:

Merci beaucoup je test ça demain en cours, j'ai juste quelque interrogation :

L'adresse du flux (ex: http://www.flux.com/flux.xml)

elle ce met comme ça ?

if (client.connect(server, 80)) { // Connexion au serveur web
    client.println("GET /flux.xml HTTP/1.0"); // Demande de flux.xml en HTTP 1.0
    client.println();
  }
if (client.connect("ip du serveur", 80)) { // Connexion au serveur web
    client.println("GET /flux.xml HTTP/1.0"); // Demande de flux.xml en HTTP 1.0
    client.println();
  }

Et les action ouvrir et fermer ce mettent a la ligne

// ... TODO

En tout cas merci beaucoup pour ce code ça m'a l'air super !

Goldorak78: L'adresse du flux (ex: http://www.flux.com/flux.xml)

elle ce met comme ça ?

if (client.connect("ip du serveur", 80)) { // Connexion au serveur web
    client.println("GET /flux.xml HTTP/1.0"); // Demande de flux.xml en HTTP 1.0
    client.println();
  }

Non, en haut du programme tu as :

IPAddress server(10, 0, 0, 19); // Adresse IP du serveur distant (ici mon serveur web local)

Il faut donc que tu récupère l'adresse IP du serveur (avec ping ou nslookup) et que modifie cette ligne suivant l'IP.

Goldorak78: Et les action ouvrir et fermer ce mettent a la ligne

// ... TODO

Ouaip tu aura deux if(str == "quelques chose") { ... } a ajouter ;)

Après deux jour a essayer de mettre le site sur une ip ciblable (mon hébergement mutualisé chez ovh ça marche pas :confused: ) j’ai pu tester le programme. j’ai héberger le site et le fux RSS sur un pc fixe avec WAMP. j’ai redirigé les port de ma freebox pour que le site soit ciblable en dehors de mon réseaux tout marche bien.

Le fichier flux.xml est a la racine : http://88.186.8.191/flux.xml (si il est tard mon pc est éteint donc ça marchera pas :slight_smile: )

pour simulé mon volet j’ai utilisé trois LED,

  • Sur le pin 13 une LED qui simule la monter
  • Sur le pin 12 une LED qui simule la descente
  • Sur le pin 11 une LED qui s’allume en cas d’erreur

Mon circuit est bien cablé, je l’ai tester avec un petit programme K2000 XD

La carte UNO est branché en usb a mon pc portable la carte ethernet est bien emboîter dessus et est branché directement a ma freebox avec un loooooooooong câble RJ45

mon flux xml est :

<?xml version="1.0" encoding="ISO-8859-1"?>
<action>ouvert</action>

avec une ligne vide a la fin.

Le programme Arduino :

#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(88, 186, 8, 191); // Adresse IP du serveur distant (ici mon serveur web local)

EthernetClient client; // Objet EthernetClient 

int ledPin = 13;                 // LED connectée à la broche numérique 13  LED de monter
int ledPin2 = 12;                 // LED connectée à la broche numérique 12  LED de descente
int ledPin3 = 11;                 // LED connectée à la broche numérique 11 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)) { // Opbtention 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.0
    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>
          str.replace("<action>", ""); // Enléve les balises XML
          str.replace("</action>", "");
          Serial.println(str); // Affiche la valeur du noeud XML
          //  TODO
          if(str == "ouvert") //si le flux contient "1" on ouvre le volet. (allumage de la LED du pin 11)
          {
            digitalWrite(ledPin, HIGH);   // allume la LED
            delay(1000);  // attend une seconde
          }
          if(str == "ferme") //si le flux contient "2" on ferme le volet. (allumage de la LED du pin 12)
          {
            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. (clignotage de la LED du pin 13)
          {
            digitalWrite(ledPin3, HIGH);   // allume la LED
          }
          
          
          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
}

Et c’est malheureusement la LED d’erreur qui s’allume :confused: alors est ce que c’est une erreur réseau ou programme ? Si mon programme est juste comment vérifier que la carte est bien connecter a internet ?

Merci :smiley:

bonjour, alors j'ai eu le même problème pour obtenir une ip avec un autre type de router. mais je vois pas le begin de ton ethernet, juste un test de savoir si tu as une connexion, autant faire l'inverse. après tu peux vérifier ou changer ton cable rj45, il doit être droit et non croisé. essaye ceci

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,200 }; //ip de ta carte sur le reseau
byte server[] = { 88, 186, 8, 191 }; //tu marque ton ip server en local, mais c'est pas en local ca
byte gateway[] = { 192,168,0,1 };       // passerelle de la fb, je l'ai plus en tete    
byte subnet[] = { 255, 255, 255, 0 };  // mask du reseau

void setup()
{
     Serial.begin(9600);
    Ethernet.begin(mac, ip, gateway, subnet);
  Serial.println("Connexion au server");
  Serial.println();
 if (client.connect()) {
    Serial.println("connected");
}else{
Serial.print("defaut connexion");
}

}

pour savoir si la carte est bien sur le réseau, ping la.

Goldorak78: Après deux jour a essayer de mettre le site sur une ip ciblable (mon hébergement mutualisé chez ovh ça marche pas :/ ) j'ai pu tester le programme. j'ai héberger le site et le fux RSS sur un pc fixe avec WAMP. j'ai redirigé les port de ma freebox pour que le site soit ciblable en dehors de mon réseaux tout marche bien.

Pour cibler un site sur serveur mutualisé tu doit ajouter une ligne Host aprés le GET ...

GET /flux.xml HTTP/1.0
Host: lenomdetonsite.xxx

Goldorak78: pour simulé mon volet j'ai utilisé trois LED,

  • Sur le pin 13 une LED qui simule la monter
  • Sur le pin 12 une LED qui simule la descente
  • Sur le pin 11 une LED qui s'allume en cas d'erreur

Mon circuit est bien cablé, je l'ai tester avec un petit programme K2000 XD

Tu t'est fait avoir ;) Les broches 10, 11, 12, et 13 sont utilisé par le bus SPI qui permet de communiquer avec la shield ethernet. Donc en utilisant ces broches tu fait bugger la shield et la shield fait bugger ton code. Utilise les broches 5, 6, 7 par exemple ;)

Merci je vais essayer ça comme ça ! mais je crois que mon cable rj45 est mort aussi x) je test dans la soirée et je vous tien au nouvelles !

Re ! désolé mais j’ai mis du temps a avoir un nouveau RJ45 :slight_smile:

Alors le flux est a l’adresse e-wok.fr/flux.xml

j’utilise les pin 5,6 et 7

j’ai changer le flux, il contient 1 pour monter et 2 pour descendre je me suis dit qu’il y aurait moins de bug qu’avec une chaîne de caractère.

le flux :

<?xml version="1.0" encoding="ISO-8859-1"?>
<action>1</action>

le code (c’est peut etre la ligne “client.println(“Host: e-wok.fr”);” que j’ai raté ?) :

#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; // Objet EthernetClient 

int ledPin = 5;                 // LED connectée à la broche numérique 5  LED de monter
int ledPin2 = 6;                 // LED connectée à la broche numérique 6  LED de descente
int ledPin3 = 7;                 // LED connectée à la broche numérique 7 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)) { // Opbtention 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.0
    client.println("Host: e-wok.fr");
    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>
          str.replace("<action>", ""); // Enléve les balises XML
          str.replace("</action>", "");
          Serial.println(str); // Affiche la valeur du noeud XML
          //  TODO
          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
          }
          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);              // pause
            digitalWrite(ledPin3, LOW);    // eteint la LED
            delay(1000);              // pause
          }
          
          
          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
}

Mon problème cette fois est que même la LED d’erreur ne s’allume pas :S je test toujours les circuits donc ça devrai =venir du prog.

L’ip “IPAddress server(213, 186, 33, 4);” est celle de mon serveur mutualisé chez OVH (e-wok.fr)

j’espère que vous pourrez encore m’aidé un peu :slight_smile:

Merci !

Salut, désolé pour le temps de réponse j'étais absent pendant la fin de semaine ;)

Je sort mon arduino et je regarde tous çà ;)

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
}

Génial je test ça mercredi! Bien entendu tu peut publier ce que tu veu ;) pour ce qui est du PPE l'on n'est pas censé connaître de langage de programmation donc il n'y a pas de problème si l'on se fait aider sur cette partie :)

Goldorak78: Génial je test ça mercredi! Bien entendu tu peut publier ce que tu veu ;) pour ce qui est du PPE l'on n'est pas censé connaître de langage de programmation donc il n'y a pas de problème si l'on se fait aider sur cette partie :)

Ok tant mieux alors ^^

Ca marche impeccablement bien ! Je vous donnerais des nouvelles quand j'aurais ma note ^^

Merci énormément !!