Skyduino:~#
Articles
arduino, Corrigé, programmation

[Arduino] Commande à distance d’une led avec un fichier xml (via le web)

Bonjour tout le monde !

Aujourd’hui en faisant un peu de tri dans mon dossier « projet » j’ai (re)mis la main sur un morceau de code arduino qui risque d’en intéresser plus d’un 😉

En ce moment c’est limite impossible de rédiger des articles pour le blog (partiels, projet C++ à rendre sous peu, …).
Mais je crois que là on peut appeler les juges du « Guinness World Records », le code arduino en question est resté caché dans mon dossier projet pendant 6 long mois …
(bon ok, j’avoue au final ça m’arrange un peu, le code est fait, testé et tout bien commenté, j’ai juste à le publier)

Le code était à l’origine codé pour une personne qui m’avait contacté par mail.
Le but n’était pas de commander une led mais un volant roulant si je me souviens bien, pour le détails on repassera 😉

Le principe :

Le principe de fonctionnement du code est simple :
– l’arduino se connecte à la box (par ethernet) en DHCP pour pouvoir accéder au web
– tout les 10 secondes l’arduino télécharge un fichier xml depuis un serveur web
– le fichier xml est analysé ligne par ligne
– s’il y a une balise « action » l’arduino agit en conséquence

Le code :

Je ne me rappelle plus quelles raisons obscure avaient bien pu me pousser à utiliser une String (beurk, à éviter si possible !) …
Un bon vieux tableau de char aurait tout aussi bien fonctionné … le mystère reste entier …

Bref, le code :

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

byte mac[] = { // Adresse MAC de l'ethernet shield
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 

IPAddress server(192, 168, 1, 5); // Adresse IP du serveur distant (ici mon serveur web local)

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

// Pin mapping
const int ledPin = 5;  // broche connectée à la LED

// setup()
void setup() {

  pinMode(ledPin, OUTPUT);  // Met la broche en sortie 

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

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

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

  delay(10000); // Délai entre deux requêtes (ici 10 secondes)

  if (client.connect(server, 80)) {              // Connexion au serveur web
    client.println(F("GET /flux.xml HTTP/1.0")); // Demande de flux.xml en HTTP 1.0
    //client.println(F("Host: svweb.local"));    // Virtual Host 
    client.println(F("Accept: */*")); // */
    // A cause d'un bug de l'ide arduino tout /* d’où avoir son */ associé même dans une chaîne de char
    client.println();
    client.println();
  } else {
    Serial.println(F("Erreur TCP")); // Si erreur lors de la connexion
    return;                          // Quitte loop()
  }

  for(;;) { // Boucle infini
  
    if(client.available()) { // Si des données sont 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 == "on") // Si le flux contient "1" on allume la LED
          {
            digitalWrite(ledPin, HIGH);   // Allume la LED
            delay(1000);                  // Attend une seconde
          } 
		  else if(str == "off") // Si le flux contient "2" on éteint la LED
          {
            digitalWrite(ledPin, LOW);   // Éteint la LED
            delay(1000);                   // Attend une seconde
          }
          // Si le flux contient autre chose il y a un un problème, on fait rien ... 

          break;  // Sort de la boucle infini
        } 

        str = ""; // Vidage de la ligne
      } 
      else
        str += c; // Concaténation de l'octet reçu dans la chaîne 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 le fichier xml de commande :

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

Valeur possible de action :
- on = allumage
- off = extinction
- autre = rien

Remarque : ne pas oublier d’ajouter un retour ligne en fin de fichier !
(wordpress l’enlève systématiquement mais il y en a bien un à la fin de mon fichier xml ;))

Voila voila, bon bidouillage à tous 😉

Publicités

Discussion

9 réflexions sur “[Arduino] Commande à distance d’une led avec un fichier xml (via le web)

  1. bonjour,
    merci pour ce code !
    Est ce que ce serait possible d’écrire un fichier sur le serveur distant ?

    Publié par vincent | 16 novembre 2012, 15 h 31 min
    • Avec un script côté serveur qui attend et traitre les données (genre un bête script PHP) c’est possible.
      Sinon en FTP ça doit pouvoir ce faire sans trop ce casser la tête (c’est un protocole texte relativement simple).

      Publié par skywodd | 16 novembre 2012, 17 h 52 min
  2. bonjour,

    je sait que ce post remonte deja un peu, mais voila je suis bloqué dans un de mes projet et ce post m’as intéressé seulement j’ai du mal a l’adapter. voila j’aimerais contrôler plusieurs sortie à l’aide d’une page web tout ceci grâce a un arduino uno et a un shield ethernet R3 seulement, pour me simplifier la vie j’aimerais stocké ma page html sur la carte sd et la sortir sur un site que l’arduino hébergerais. et bien sur récupérer de se site des infos de plusieurs formulaires.

    Cordialement,
    Thibault

    Publié par thibault | 20 avril 2013, 23 h 42 min
  3. J’ai la même demande que thibault, je bute sur la réalisation très minimaliste d’une page web pour gerer quelques E/S.
    Ca fait des heures que je cherche mais en vain, si vous avez des liens je suis preneur.
    Cdt

    Publié par mike77120 | 21 juillet 2013, 3 h 51 min
  4. je vais essayer d’adapter le code pour remonter mes sondes de températures.
    Merci

    Publié par MIKE77120 | 23 juillet 2013, 0 h 29 min
  5. salut
    le ficher xml me semble court
    et il faut le mettre ou?
    merci pour ton travail

    Publié par karlytau | 28 juin 2016, 17 h 37 min

Rétroliens/Pings

  1. Pingback: DENIS | Pearltrees - 19 octobre 2013

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.