Demande d'aide : envoyer des données de la carte arduino vers un site

Bonjour, nous somme actuellement en Tsti2d et nous avons un projet a faire , mais l'on ne sait pas comment proceder.. Le but du projet est un compteur de visiteurs de salon, en gros quand on passe une carte devant un capteur RFID , cela s'affiche sur un site. Sur ce site, il y aura un compteur avec le nombre de personne ayant passé leur carte devant le capteur RFID

On a deja fait le programme pour detecter les carte RFID mais nous avons un probleme pour envoyer les données vers un site: nous disposons d'un ethernet shield. Nous avons essayer de faire un serveur web avec arduino , mais sans grand resultat...

PS: la carte arduino (avec l'ethernet shield) est reliée a un ordinateur par un cable ethernet pour envoyer les données vers un site?.

Merci d'avance !

Comme tout tes petits camarades, si tu veux qu'on t'aide, donne nous les informations suffisantes !

Matériel utilisé, schéma de montage, code, ce qui fonctionne, ce qui ne fonctionne pas, messages d'erreur...

Bonjour, tout d'abord désolé pour la manque de précision. Nous disposons:

Donc le but du projet et de faire un compteur de visiteur dans un salon un visiteur passe sa carte RFID devant le capteur RFID pour rentrer dans le salon, sur un site internet est afficher le nombre de visiteur en temps réel dans le salon. Quand il passe sa carte pour rentrer , cela fait un "+1" sur le compteur. et quand il sort un "-1"

Pour l'instant nous avons fait un programme permettant de détecter les badges RFID.Nous utilisons la liaison série pour le moment. Quand on passe la carte devant le capteur RFID, nous obtenons le numero de la carte en hexa.

Je n'ai pas le programme avec moi maintenant mais je le posterai demain. en gros le but du programme de detection: Si le byte de start est égal a 0x0A , puis qu'on reçoit 10 octet entre temps. Puis par la suite que le byte de stop est 0x0D alors on affiche le numero de la carte sur la liaison serie.

Pour le moment une personne du groupe s'occupe programmer "le compteur " , mais moi je dois trouver comment envoyer ces données vers un site internet , puis les afficher.

j'ai trouver un tutoriel sur internet (http://electro.toile-libre.org/arduino_shield_ethernet.php) Mais la lors du test avec la commande ping rien ne se passe , sur "4 envoyé 0 reçu 100% perte"

Merci d'avance

donne ton code si tu veux qu'on te dise ce qui va pas :sweat_smile:

Tu dois afficher l'info sur une page web ou l'envoyer vers un site distant ? Car si c'est simplement l'afficher sur une page web, tu peux le faire directement en implémentant un serveur web sur ton arduino avec ton shield ethernet.

envoyer les données vers un site

demanderait à être précisé... comme dit juste avant par bigben99, ça pose la question de où doit se trouver l'information au final ?

Si elle reste sur l'arduino pour consultation par des "clients" : http://arduino.cc/en/Tutorial/WebServer

Si elle est envoyée à un serveur pour consultation via ce serveur : http://arduino.cc/en/Tutorial/WebClient

Dans le 1er cas l'arduino gère les requêtes des clients et met en forme la réponse sous forme HTTP/HTML. Dans le 2nd cas il faut gérer les requêtes envoyées par l'arduino avec un script (ex. php) qui reçoit les requêtes de l'arduino, comptabilise, et met en forme la réponse HTML...

Le 1er cas serait peut-être le plus rationnel mais si on vous prend au mot c'est le 2nd cas ("envoyer les données vers un site") qu'il faut implémenter.

Bonjour,

bigben99: Tu dois afficher l'info sur une page web ou l'envoyer vers un site distant ? Car si c'est simplement l'afficher sur une page web, tu peux le faire directement en implémentant un serveur web sur ton arduino avec ton shield ethernet.

je dois afficher l'info sur un site web.

Poogahzi: demanderait à être précisé... comme dit juste avant par bigben99, ça pose la question de où doit se trouver l'information au final ?

Si elle reste sur l'arduino pour consultation par des "clients" : http://arduino.cc/en/Tutorial/WebServer

Si elle est envoyée à un serveur pour consultation via ce serveur : http://arduino.cc/en/Tutorial/WebClient

Dans le 1er cas l'arduino gère les requêtes des clients et met en forme la réponse sous forme HTTP/HTML. Dans le 2nd cas il faut gérer les requêtes envoyées par l'arduino avec un script (ex. php) qui reçoit les requêtes de l'arduino, comptabilise, et met en forme la réponse HTML...

Le 1er cas serait peut-être le plus rationnel mais si on vous prend au mot c'est le 2nd cas ("envoyer les données vers un site") qu'il faut implémenter.

A la fin de notre programme on obtient une variable , qui correspond au nombre de visiteurs. Je dois afficher cette variable sur une page web. Donc je dois transferer cette variable de ma carte arduino vers un site internet. Mais je ne vois pas trop la difference entre les 2 cas . Laquelle serai la mieux selon vous ?

Merci d'avance

Perso, je ferai compter le nombre de visiteurs par le serveur plutôt que l'arduino. Mais les 2 sont bien possibles. Par contre, si y a panne de courant, faut bien comprendre que l'arduino oublie tout, à moins de stoquer sur une carte SD

Bonjour

vohu: Perso, je ferai compter le nombre de visiteurs par le serveur plutôt que l'arduino. Mais les 2 sont bien possibles. Par contre, si y a panne de courant, faut bien comprendre que l'arduino oublie tout, à moins de stoquer sur une carte SD

+1 pour le comptage sur le serveur. Combien de visiteurs maximum en même temps. Car il faut mémoriser toutes les cartes présentes pour le décomptage. L'arduino n'a pas beaucoup de mémoire pour tout stocker ou alors le stockage se fait sur la SD. A chaque passage, lecture intégrale du fichier pour savoir si la personne entre ou sort du salon. Faut voir le temps d’exécution pour la lecture et comparaison des codes pour savoir le sens qui augmentera exponentiellement avec le nombre de visiteurs. Le serveur sera forcement beaucoup plus rapide a ce niveau, la où il ne mettra que quelques millisecondes, l'arduino pourra mettre plusieurs secondes. A voir si c'est compatible avec la vitesse de passage des personnes. a+

Ok, donc on va aller au plus simple pour répondre à ton besoin. Tout va se faire sur l'arduino.

Par contre, tu dois compter le nombre de visiteurs entrés (compteur qui ne fait que s'incrémenter) ou le nombre de visiteurs présents (compteur qui s'incrémente à l'entrée et se décrémente à la sortie) ?

Quoi qu'il en soit, tu as 2 parties à ton projet : 1. Compter les visiteurs 2. Servir une page web

A priori, tu as la première partie qui fonctionne ?

Pour la seconde, va voir ici et reviens quand tu auras avancé sur la partie serveur web.

[Edit] Attention, il s'agit d'un projet d'étude donc je pense que faire simple est déjà largement suffisant. Pas la peine de s'embarquer dans un projet avec client et serveur dissociés

caape> Sans compter que la base de donnée SQL permet en plus de faire des statistiques par la suite. Heures d'influence élevé ou basse, temps min/moyen/max dans les locaux par chaque personne, ou par tranches horaires, etc... tout est possible

D’accord merci a tous pour votre aide !
je vous tiens au courant pour la suite

S'il y a sauvegarde temporaire sur l'Arduino et en supposant qu'on réserve 500 byte pour un stockage tampon et que les tag font 12 bytes de long, ça fait 40 sauvegardes possibles en attendant le rétablissement de la connexion avec le serveur.

Dans un premier c'est à mon avis la meilleure solution. Pour un premier projet implanter du RFID + une communication distante avec un serveur avec gestion de base de données ça sera déjà un sacré boulot. Pour le moment je pense que la SD c'est anecdotique. Ne pas brûler les étapes ...

bigben99 > je suis pas d'accords avec ton choix parce que tu choisis à sa place... Tu n'as réellement aucune idée de ce qu'ils doivent, faire, ne sachant pas lui même ce qu'il doit faire.

Il nous explique à sa façon. Nous on propose des solutions, des pistes. Il sait qu'il y en a plusieurs. Il doit maintenant consulter son prof qui lui, lui dira ce que le jury attend.

theosin56 > Je te fais pas un dessin ;)

vohu: bigben99 > je suis pas d'accords avec ton choix parce que tu choisis à sa place... Tu n'as réellement aucune idée de ce qu'ils doivent, faire, ne sachant pas lui même ce qu'il doit faire.

Il nous explique à sa façon. Nous on propose des solutions, des pistes. Il sait qu'il y en a plusieurs. Il doit maintenant consulter son prof qui lui, lui dira ce que le jury attend.

theosin56 > Je te fais pas un dessin ;)

Aucun problème mais sincèrement, il faut aussi savoir garder les pieds sur terre. Il s'agit d'un projet de fin d'étude de Terminale à rendre d'ici 2 mois ? Comme tu le dis, il ne sait sans doute pas bien lui-même ce qu'il doit faire.

Il y a en effet plusieurs solution : 1. Arduino uniquement avec RFID et Shield Ethernet qui nécessite déjà de s'en sortir avec les notions suivantes : - Programmation Arduino (C/C++) - Ethernet (IP, requête HTTP, HTML) - Utilisation RFID - Utilisation SD

  1. Arduino + serveur Web qui nécessite de s'en sortir avec les notions suivantes :
  2. Programmation Arduino (C/C++)
  3. Ethernet (IP, requête HTTP, HTML)
  4. Utilisation RFID
  5. Base de données et SQL
  6. Dev de site web évolué (PHP, ASP, JSP, ...)

En 2 mois en partant de zéro ou presque... s'embarquer sur la solution 2 c'est du suicide.

Il ne faut pas exagérer non plus... Ils sont minimum 2 pour faire ça.

WAMP s'installe en 30 secondes, et il n'y a plus rien à faire à part la page index.php. Dans cette page, y a un seul SELECT pour faire le minimum (afficher le nombre d'entrées sur une page blanche, rafraîchissement de la page à la main !). Même chose, on trouve ces requêtes toutes faites partout sur le web. (et sur ce site)

La page php qui enregistre les données contient un seul INSERT. Cette page fera 20 lignes au max. Et on en trouve par milliers sur internet, dont beaucoup sur ce même site. Car ils sont pas les premiers à faire ce projet. J'ai voulu faire un truc similaire y a 3 ans, et j'ai trouvé tout ce qu'il fallait très vite.

Ils ont 2 mois pour le faire, oui...(certains ont commencé à poster en décembre ici) En cherchant un tout petit peu, leur projet et faisable pour la plupart en 1 semaine avec un peu de bonne volonté.

Et je pense qu'il est bien plus compliqué de faire de la gestion lecture/écriture de fichier en C (avec parsage pour la lecture) que de faire 2 fichiers PHP.

Je viens de lire le référenciel, ils sont censé avoir fait une étude et un cahier des charges avant de passer au montage. Là comme c'est parti, tout va être fait à l'envers. 1. Montage du projet 2. L'étude : on vient de leur donner toute faite, il suffit de relire tout le fil. 3. Le cahier des charges sera fait après le projet.

vohu: WAMP s'installe en 30 secondes, et il n'y a plus rien à faire à part la page index.php.

Je ne suis pas d'accord avec toi, c'est en disant des choses comme cela qu'après on à des personnes qui croient qu'en 2 clics elles peuvent finir leur projet.

Installer c'est vrai que c'est rapide, mais sans un minimum de connaissance et/ou d'expérimentation (et c'est plus de 30 secondes) ils n'arriveront pas à faire fonctionner leur système.

Il va leur falloir déclarer (ou au minium connaitre l'utilisateur root) l'utilisateur de la base MySQL et définir son mot de passe. Ensuite en PHP, si ils galèrent pour le code arduino, ils vont passer des jours à réussir à se connecter à la base MySQL. Je ne parle même pas d'exécuter une requête SQL.

Lire un fichier sur la carte SD du shield Ethernet et l'envoyer sur le client Ethernet c'est moins de 10 lignes

Ils sont pas censé juste croire. C'est aussi à ça que sert ce projet.

Et ton client il fait quoi avec la liste complète ?

1 s'occupe de la partie PC : installation wamp codage des 2 php. Pour tester le php pas besoin d'arduino !, un simple navigateur et creation de l'url à la main. Même s'il lui faut 3 semaines pour faire ça.. et alors ?

L'autre s'occupe de l'arduino. lecture carte rfid, communication extérieure. Il fait des essais avec n'importe quel site et affiche dans la console serie les pages pour voir comment ça marche. Il prend google par exemple, et s'amuse à composer des requettes et vérifie si les pages reçues sont conforme à ce qu'il voulait. Par exemple : sprintf(url, "https://www.google.fr/#q=%s", "requete post arduino" C'est vraiment cadeau hein !!!!

Après ils fant qu'ils se mettent d'accord, sur les adresses et le nom des variables.

M'enfin, aller. A eux de voir maintenant.

vohu: Et ton client il fait quoi avec la liste complète ?

Il envoie les codes RFID en faisant des requêtes HTTP de type GET

vohu: M'enfin, aller. A eux de voir maintenant.

Oui, maintenant ils ont le choix et avec les explications qui vont bien :)

Bonjour ,
je reviens vers vous car le projet a bien progressé, mais il me reste un probleme a résoudre
Donc ce qui a été fait:
-Détection des badges
-Compteur
-carte sd détecté par arduino
-Création d’un webserver arduino, une page html sur la carte SD et elle s’ouvre quand on branche un cable ethernet entre la carte arduino (shield ethernet) et le PC. elle est accessible sur le navigateur a partir de l’ip qu’on lui a attribué
-quand on passe un badge , le nombre de passage est enregistré dans un fichier .txt sur la carte SD

Et pour finir mon projet , je dois affiché la variable compteur sur la page HTML qui est dans la carte SD, dans la carte arduino !

Voici le programme:

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

byte valeur;
byte badge[11];
byte i;
int comptage;
byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x0A, 0xED};
IPAddress ip(172, 16, 121, 133); // Adresse IP
EthernetServer server(80);  // créé un serveur au port 80
File webFile;

void setup ()
            {
              Serial.begin(2400); 
              valeur=0;
              for(i=0;i<11;i++){badge[i]=0;}
              Ethernet.begin(mac, ip);  // initialise la conexion Ethernet
              server.begin(); 
              Serial.print("Serveur accessible sur l'ip: ");
              Serial.println(Ethernet.localIP());
              // initialize SD card
              Serial.println("Initialisation de la CARTE SD...");
              if (!SD.begin(4)) {
                   Serial.println("ERROR - Echec de l'initialisation de la CARTE SD");
                   return;    // échec de l'initialisation
               }
              Serial.println("SUCCESS - CARTE SD initialisee.");
               // vérification du fichier index.htm
              if (!SD.exists("index.htm")) {
                   Serial.println("ERROR - Fichier index.htm introuvable");
                   return;  // fichier index introuvable
               }
              Serial.println("SUCCESS - Fichier index.htm trouve");  
           }
            
            
void loop ()
{
 if (Serial.available() > 0)   
  { 
    valeur = Serial.read();
   
    if (valeur == 0x0A)    // reconnaissance byte de start
     {
      for (i=0;i<11;i++)
         {
          valeur = Serial.read();
          (badge [i] = valeur);
          }
    while(Serial.read() != -1); //lit toutes les données (vide le buffer de réception)       
      if(valeur == 0x0D)
         { 
          comptage=comptage+1;
          valeur=0;
          Serial.print("nombre de passages : ");   
          Serial.print(comptage);
          Serial.println(" ");
          int dataString = comptage;
           //ouvrir le fichier pour ecrire dedans
         File dataFile = SD.open("log.txt", FILE_WRITE);
         if(dataFile)
         {
        dataFile.println(dataString);
        dataFile.close();
        Serial.println(dataString);
       }
       else
       {
       Serial.println("impossible d'acceder au fichier");
       }  
       }
       delay(1000);
    }
  }
 //listen for incoming clients
 EthernetClient client = server.available();
 if (client) {
   Serial.println("new client");
   // an http request ends with a blank line
   boolean currentLineIsBlank = true;
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
       Serial.write(c);
       // if you've gotten to the end of the line (received a newline
       // character) and the line is blank, the http request has ended,
       // so you can send a reply
       if (c == '\n' && currentLineIsBlank) {
         // envoi d'une réponse http standard
         client.println("HTTP/1.1 200 OK");
         client.println("Content-Type: text/html");
         client.println("Connection: close");  // la connection sera fermée après l'achèvement de la réponse
         client.println("Refresh: 2");  // actualise la page automatiquement toutes les secondes 2 sec
         client.println();
         // envoi page web
                   webFile = SD.open("index.htm");        // ouvre le fichier page web
                   if (webFile) {
                       while(webFile.available()) {
                           client.write(webFile.read()); // envoi page web au client
                       }
                       webFile.close();
                   }
                   break;    
       }
       if (c == '\n') {
         // début d'une nouvelle ligne
         currentLineIsBlank = true;
       }
       else if (c != '\r') {
         // you've gotten a character on the current line
         currentLineIsBlank = false;
       }
     }
   }
   // give the web browser time to receive the data
   delay(1);
   // stoppe la connection
   client.stop();
   Serial.println("
   client disconnected");
 } 

}

Merci d’avance !