Go Down

Topic: Internet vers arduino (Read 10692 times) previous topic - next topic

bichtrack2

salut,
j'ai réactivé un projet commencé ya un petit moment sur la récupération  d'information d'un site web qui déclencherais l'arduino.
par exemple les modifications d'un site météorologique viendrais déclencher une led.
Est ce que vous avez des pistes dans ce sens
merci pour votre précieuse aide


jvpython

Pour 55 US tu peux acheter une WiShield, si tu a WiFi. C'est tres rapide et efficace. Je l'utilise pour envoyes de l'information a un seveur qui la publis ensuite sur un site web. Les biblioteque sont tres bien faite.

http://www.asynclabs.com

bichtrack2

Merci pour vos  réponses
mais je vais passer par le flux rss ca va être plus simple.Alors la je récupère le flux rss avec processing reste maintenant à sélectionnez ce qui m'interresse dans le flux pour déclenchez un sevomoteur via arduino.
MERCI encore
reste ouvert à toutes suggestions

Gaiden

Tout dépend si l'arduino doit être autonome ou pas.

je suis sous Windows et j'utilise serproxy et php pour publier et interroger mon arduino à distance sur internet.

serproxy sert à router un flux serie (port COM) en créant un socket TCP/IP sur ton pc (interrogeable en php etc ..)

Tu pourrais faire tourner un serveur web sur ton pc avec un script qui se déclenche tout les X temps et qui vérifie ton flux rss et ses publications.
Tu n'aura ensuite qu'a envoyer une commande à l'arduino via ton script php par le biais de serproxy et de son socket<=>com .





bichtrack2

#5
May 25, 2010, 12:31 pm Last Edit: May 25, 2010, 12:32 pm by bichtrack Reason: 1
salut gaiden
ta piste me semble très prometeuse :D j'explore ca  de suite et te tiens au courant

Gaiden

Pas de problème , si il te faut du code ou des exemples je suis la

bichtrack2

RE GAIDEN
Mes premières recherches mon amené ici
http://protolab.pbworks.com/TutorialFlashSetup2009
Et tout de suite je me demande après une lecture sommaire  si ce n'est pas possible  de faire un peu plus simple. Ne puis je pas "commander" directement un actionneur monté sur arduino avec le rss que j'obtiens deja via processing ?

Gaiden

Si tout à fait.
J'ai utiliser php et un serveur web car je désire contrôler mon arduino via internet.

Dans ton cas tu récupère des infos déjà publiées pour agir en conséquence.
Ta méthode est la meilleur pour ton application.

Et j'avoue tres humblement que je ne maitrise pas assez processing comparé à php.  :-[

Sur quel point bloques tu ? tu arrives a éclater ton rss et à trouver ce que tu veux dedans ? c'est la partie communication avec l'arduino qui bloque?






bichtrack2

Salut
du coté  flux rss  ya pas de problème après coté arduino
il faut que
- jétablisse la communication de processing vers arduino et que
-je parvienne à coder quelque chose comme :
si le title ou l'item  du rss change ou à chaque fois qu'il ya une actulisation du rss > déclencher un actionneur en l'occurrence ici un mini compresseur relié à l'arduino.
Autant la communication de arduino vers processing je connais autant l'inverse je bloque deja

bichtrack2

#10
May 30, 2010, 11:42 pm Last Edit: May 31, 2010, 12:08 am by bichtrack Reason: 1
salut
bon voila  le code processing pour récupèrer le  rss désiré mais après je ne sais pas trop par ou commencer pour récupèrer avec arduino l'item ou le title
Code: [Select]
// déclarer l'objet qui contiendra les données RSS
Channel channel;
boolean DEBUG = true;
void setup() {
size(500,500);
  // 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_cri.xml");
}
void draw() {
  background(255);
 if (DEBUG) channel.draw();
 }
class Channel {

 PFont affichage;

 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;

   affichage = createFont("dialog",9);

   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 draw() {

   // le debugger
   textFont(affichage);
   textAlign(CENTER,CENTER);

   // s'il n'y a pas eu de données
   if (0 == cris.length) {
     fill(0);
     text("Je n'ai pas pu me connecter au flux rss", random(18,20), random(18,20));
     return;
   }  

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

 }


 class Cri {

   float x,y;
   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;
     x = random(width);
     y = random(height);
   }

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

     x += random(-1,1);
     y += random(-1,1);

     fill(255,0,0);
     text(titre, x, y);
     fill(0,255,0);
     text(date, x, y+10);
     fill(0,0,255);
     text(descriptif, x, y+20);
   }

 }

}




L'idée c'est que chaque changement rss déclenche un actionneur monté sur arduino
merci pour l'aide

Gaiden

Pour qu'il y est detection de changement d'état , il faut stocker l'etat predecent quelque part ... je ne vois pas comment tu va t'y prendre.

Gaiden

Salut

je viens de travailler su ton projet.

J'ai modifier le code source pour avoir un affichage clair.

Deux problèmes majeures arrivent :
 
    1) Le code ne rafraichit pas le flux , donc si il y a de nouvelle info , on ne le sait pas

    2) Quand on aura réglé le problème de rafraichissement, il faudra stocker la dernière news (la plus récente) et la comparer avec la plus récente après rafraichissement.


Par contre le passage de la commande de ton actionneur vers l'arduino ne sera pas un problème.

Je continu de chercher , ça m'a prit un quart d'heure ce soir , on avance bien ;)

PS: le code modifié

Code: [Select]
// 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("------------------------------------------------------");

   }

 }

}

Gaiden

Hop la j'ai fini

Tout fonctionne ;)

Quand le flux RSS se met a jour , j'allume une led sur mon arduino pendant 3 secondes (on peut imaginer toute sorte d'action : LCD , relais, son ...)

J'attends ton retour pour te donner les deux bouts de code et des explication sur tout ça !  :D




bichtrack2

Salut,
désolé pour la réponse un peut tardive, mais l'idée devait murrir avant d'aller plus avant. Finalement je laisse le rss au chaud . Toujours avec la même idée de commander arduino via le net, il s'agit cette fois ci de faire en sorte qu'a chaque fois que quelqu'un se connecte au site internet sela déclenche l'arduino.
La création d'une page PHP dans cette optique te semble t-elle pertinente ?
Merci pour ta réponse et encore désolé pour le retard
http://marcserazin.blogspot.com/

Go Up