Lecture de fichier sur une carte SD en ligne

Bonjour,
Je me demande comment faire pour lire des fichiers sur une carte SD depuis un navigateur web grâce a un shield Ethernet arduino.
Pouvez-vous m'aidez ?
J'ai un shield Ethernet arduino 2.
Merci.

La page web du navigateur envoie une requête
Cette requête est reçue par votre MEGA qui bâtit une réponse HTML en envoyant le contenu du fichier

Ah merci.
Mais quelle requête dois-je dans alors faire mon navigateur, pour que ma mega envoie un fichier de carte SD ?

N’importe quel requête POST ou GET qui est reçu par votre arduino par exemple. Il n’y a rien de particulier c’est ce que renvoie le MEGA en réponse qui compte, il faut écrire le code qui convient (lire le fichier et envoyer les octets

(éventuellement en formatant cela en utilisant le protocole HTML suivant si vous voulez que ce soit un affichage ou un download)

Il n’y a oas d’OS côté arduino pour gérer des requêtes

D'accord merci,
Mais donc comment fait-je pour que ma carte mega lise un fichier et revoit le texte présent dedans et renvoi les données a une sous IP ?
Ex : 155.166.33.12/SD

155.166.33.12 c'est l'adresse du shield ethernet de vote mega ?

si oui vous écrivez un bout de code qui répond à un GET sur le chemin /SD

vous pouvez regarder mon tuto : Exemple d'usage du shield Ethernet pour faire un serveur interactif

ensuite une fois que vous êtes capable de recevoir une requête, vous utilisez la bibliothèque SD ou SdFat pour lire ce qu'il y a dans le fichier et l'écrire vers le client web

Bonjour, alors j'ai réussi a faire plusieurs pages, grâce a votre tuto.
Mais dans l'une de mes page, il y a des boutons qui maintenant ne fonctionne plus. Pouvez vous m'aider ?
Voici mon code. (13.8 KB)

Postez le code ici, je lis depuis mon iPhone

Lisez les recommandations listées dans “Les bonnes pratiques du Forum Francophone” pour fournir toutes les infos nécessaires et formater le code

A oui excusez moi.
Voici le code :

/*
   L'objectif est de créer une page web qui proposera 5 liens.
   Chacun permettra de piloter une LED pour qu'elle soit allumée,
   éteinte ou clignotante (fréquence 0,5 Hz).
   Donnez un titre à votre page web et à la fenêtre,
   par exemple : "Web-Commande de LED".
   Elle doit pouvoir afficher le mode actuel de la LED (ON, OFF, CLIGNOTE)
   et à côté un lien qui permet de changer ce mode. Le lien sera le mot "Changer".

  • Le lien n'enverra pas un état de toutes les LED
  mais l'information d'un changement d'état d'une LED
  (une donnée suffit finalement : le numéro de LED à changer).
  Attention de penser que ce qui est lu est un caractère. Par exemple, '1'
  n'est pas 1 en valeur numérique, mais 49. Il faut donc penser à le convertir en numérique.
  • Il faudra penser à gérer le temps et à permettre au programme de faire d'autres tâches
  pendant qu'il attend de recevoir des données (comme le clignotement des LED).

*/

#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x1A, 0x71};
byte ip[] = {192, 168, 1, 11};
unsigned long tpsDep;         //Tps depart pour la gestion des LEDs
int pinLed[5] = {2, 3, 5, 6, 7};
boolean etatLed[5] = {0, 0, 0, 0, 0};
int modeLed[5] = {0, 0, 0, 0, 0};  // TABLEAU des modes d'allumage (0=eteint, 1=allume et 2=clignotte)
int nbTours = 0;  //pour eviter le second loop du "favicon"
String reception = "";      //Chaine reçue par le serveur (première ligne uniquement <=> requète)
char carLu;
byte d = 0;

EthernetServer serveur(80); // déclare l'objet serveur au port d'écoute

File myFile;

void setup() {

  Serial.begin(9600);

  Serial.print("Initializing SD card...");
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
  }
  Serial.println("initialization done.");
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  for (int m = 0; m < 5; m++)
  {
    pinMode(pinLed[m], OUTPUT);
  }

  Ethernet.begin (mac, ip);
  delay(1000);                                 //Délais d'initialisation du Shield Ethernet 2
  if (Ethernet.localIP() != NULL)              //Petite vérification avant démarrage du serveur
  {
    Serial.print(F("Serveur a l'adresse '"));
    Serial.print(Ethernet.localIP());
    Serial.println(F("' OK!'"));
  }
  else
  {
    Serial.println(F("Erreur serveur"));
  }

  pinMode(4, OUTPUT);   // on met le pin 4 du SPI commun à la carte SD à Output, sinon conflit
  digitalWrite(4, HIGH);
}

void loop()
{
  gestionClient();    //fonction de gestion de la communication client
  gestionLeds();      //fonction de gestion des leds
  //    for (int i=0; i<5 ; i++)
  //    {
  //      Serial.print("Led ");
  //      Serial.print(i);
  //      Serial.print(" : mode = ");
  //      Serial.print(modeLed[i]);
  //      Serial.print(" - etat = ");
  //      Serial.print(etatLed[i]);
  //      Serial.println();
  //    }
}



//  *****************************************************  FONCTIONS  *******************************************************

//FONCTION de gestion de la communication client
void gestionClient()
{
  EthernetClient client = serveur.available();  //on ecoute le port
  if (client)   //si le client existe
  {
    reception = "";
    if (client.connected())
    {
      Serial.println(F("Client connecte"));
      if (client.available()) carLu = client.read();
      while (client.available() && carLu != 10) //Tant qu'il reste au moins 1 octet à lire sur la première ligne
      {
        reception = reception + carLu;
        carLu = client.read();
      }
      Serial.print(F("\n'reception' = "));
      Serial.println(reception);
      if (reception.startsWith("GET")) {                       //Si la chaine reçue contient une requète
        if (reception.startsWith("GET / HTTP/1.1")) {         //Requête sans paramètre => affichage de la page
          accueil();
        }
        if (reception.startsWith("GET /?0 ")) {         //Requête sans paramètre => affichage de la page
          accueil();
        }
        if (reception.startsWith("GET /?1 ")) {         //Requête sans paramètre => affichage de la page
          accueil();
        }
        if (reception.startsWith("GET /?2 ")) {         //Requête sans paramètre => affichage de la page
          accueil();
        }
        if (reception.startsWith("GET /?3 ")) {         //Requête sans paramètre => affichage de la page
          accueil();
        }
        if (reception.startsWith("GET /?4 ")) {         //Requête sans paramètre => affichage de la page
          accueil();
        }
        if (reception.startsWith("GET /disonect ")) {
          client.println("HTTP/1.1 401 OK");
          client.println ("WWW-Authenticate: Basic realm=\"something\"");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("mot de passe incorrect");
          client.println("</html>");
        }
        if (reception.indexOf("test.txt") != -1)       //Si demande d'envoi du fichier 'style.css'
        { //(balise <link> dans le fichier html)
          if (d >= 1) {
            Serial.print("Client autorisé : ");
            Serial.println(d);
            if (SD.exists("test.txt"))                        //Si le fichier "style.css" existe on l'ouvre en
            { //lecture, puis on lit son contenu caractère par
              d--;
              File fichier = SD.open("test.txt", FILE_READ);  //caractère que l'on envoie en même temps vers
              while (fichier.available())                      //le client pour affichage.
              {
                char carTemp = fichier.read();
                Serial.write(carTemp);
                client.write(carTemp);
              }
              fichier.close();
            } else {
              Serial.println(F("Fichier 'test.txt' absent"));
              return;
            }
          }
          else {
            Serial.print("Client interdit : ");
            Serial.println(d);
          }
        }
      }
      else Serial.println(F("Requete non conforme"));
      delay(1);                                               //La transmission est rapide mais pas instantanée
      client.stop();
    }
  }
}

//                                         ******************************

// FONCTION gestion des leds
void gestionLeds()
{
  unsigned long tpsAct = millis();   //on recupere le temps actuel
  if (tpsAct - tpsDep > 250)
  {
    for (int i = 0; i < 5 ; i++)
    {
      if (modeLed[i] == 0)  //led eteinte
      {
        etatLed[i] = 0;  //on eteind
      }
      else if (modeLed[i] == 1)  //led allumee
      {
        etatLed[i] = 1;  //on allume
      }
      else if (modeLed[i] == 2)   //led clignotte
      {
        etatLed[i] = !etatLed[i];  //on fait clignotter en basculant
      }
      digitalWrite(pinLed[i], etatLed[i]);  // mise a jour du pin
      tpsDep = tpsAct;    //on initialise le temps
    }
  }
}

//                                         ******************************

//FONCTION GET
void GET(EthernetClient cl)
{
  boolean lu = 0;
  String chaine = "";        //////////////////////////////

  while (cl.available())  //tant qu'il y a des infos a transmettre
  {
    char c = cl.read();
    chaine += c;             //////////////////////////////

    delay(1);
    if (c == '?' && lu == 0)  // debut de lecture des donnees
    {

      nbTours ++;
      if (nbTours < 2)
      {

        c = cl.read();
        int led = int(c) - 48;  //conversion de l'ascii en numérique (49 devient le 1 pour la seconde led)
        modeLed[led] = (modeLed[led] + 1) % 3 ;   //on change l'etat de la led
        delay(1);
        lu = 1;
        //      Serial.print("La chaine est avec : ");
        //      Serial.print(c);
        //      Serial.println();
        break;

      }
      nbTours = 0;
    }

  }
  Serial.println(chaine);    //////////////////////////////
}

//                                         ******************************

//FONCTION en-tete de page
void enTete(EthernetClient cl)
{
  //infos sur le navigateur
  cl.println("HTTP/1.1 200 OK");  //type de HTML
  cl.println("Content-Type: text/html; charset=ascii");  //type de fichier et encodage de caracteres
  cl.println("Connection: close");    //fermeture de la connexion quand toute la reponse a ete envoyee
  cl.println();

  //balises d'entete
  cl.println("<!DOCTYPE HTML>");
  cl.println("<html>");
  cl.println("  <head>");
  cl.println("    <meta http-equiv='content-type' content='text/html; charset=windows-1252'>");
  cl.println("    <title>Web commande de leds</title>");
  cl.println("    <META http-EQUIV='Refresh' CONTENT='60; url=http://192.168.1.11/'>");
  //balises d'entete
  cl.println("  </head>");
  cl.println("  <body>");
  cl.println("    <h1>");
  cl.println("      <strong>Commande de leds</strong>");
  cl.println("    </h1>");
  cl.println("    <hr>");
  cl.println("      <br />");
  //cl.print("<META http-EQUIV='Refresh' CONTENT='1; url=http://192.168.1.11/'>");
}


//                                         ******************************

//FONCTION corps de page
void corps(EthernetClient cl)
{
  //boucle pour construire chaque ligne en fonction des leds
  for (int t = 0; t < 5; t++)
  {
    cl.print("        <br />LED ");
    cl.print(t);
    cl.print(" ");
    ///Serial.println(t);
    switch (modeLed[t])
    {
      case 0:
        cl.print(" Etat = OFF ");
        cl.print("<a class='case0' target=_self> &#x2794;</a>");
        break;
      case 1:
        cl.print(" Etat = ON ");
        cl.print("<a class='case1' target=_self> &#x2794;</a>");
        break;
    }
    cl.print("<button class='btled");
    cl.print(t);
    cl.print("' type='button' onclick='window.location.href = `?");    //creation du lien inutile de repeter l'adresse du site
    cl.print(t);
    cl.println("`' target=_self>Change</button><br />");
  }
}

//                                         ******************************

//FONCTION pied de page
void piedPage(EthernetClient cl)
{
  cl.println("      <br />");
  cl.println("    <hr>");
  myFile = SD.open("test.txt");
  if (myFile) {
    cl.println("<iframe src='test.txt'></iframe>");
  }
  cl.println("    <style>");
  cl.println("      .btled0{position:absolute; left:150px}");
  cl.println("      .btled1{position:absolute; left:150px}");
  cl.println("      .btled2{position:absolute; left:150px}");
  cl.println("      .btled3{position:absolute; left:150px}");
  cl.println("      .btled4{position:absolute; left:150px}");
  cl.println("      /* Flèche vers bouton */");
  cl.println("      .case0{position:absolute; left:130px}");
  cl.println("      .case1{position:absolute; left:130px}");
  cl.println("      .case2{position:absolute; left:130px}");
  cl.println("    </style>");
  cl.println("  </body>");
  cl.println("    ");
  cl.println("</html>");
}

//                                         ******************************

void accueil() {
  EthernetClient client = serveur.available();  //on ecoute le port
  char    headerLine[80];
  char    headerIndex;
  bool    passwordOk;
  boolean currentLineIsBlank = true;
  passwordOk = false;
  headerIndex = 0;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();

      // 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) {

        if (passwordOk) {
          GET(client);  //appel de la fonction de decodage GET
          enTete(client);
          corps(client);
          piedPage(client);
          d++;
        }
        else
        {
          //---- envoi code d'erreur 401 ----
          client.println("HTTP/1.1 401 OK");
          client.println ("WWW-Authenticate: Basic realm=\"something\"");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("mot de passe incorrect");
          client.println("</html>");
        }
        break;
      }
      if (c == '\n') {

        //---- test ligne d'entete avec mot de passe
        headerLine[headerIndex] = 0;
        headerIndex = 0;
        Serial.println (headerLine);
        if (strcmp (headerLine, "Authorization: Basic dGVzdDp0ZXN0ZQ==") == 0)
          passwordOk = true;

        // you're starting a new line
        currentLineIsBlank = true;
      }
      else if (c != '\r') {

        //---- mémorisation ligne d'entete courante
        if (headerIndex < 79)
          headerLine[headerIndex++] = c;

        // you've gotten a character on the current line
        currentLineIsBlank = false;
      }
    }
  }
}

quel rapport entre cela et votre explication de lecture de carte SD ?

est-ce un projet scolaire ?

Non c'est un projet personnel.
L'explication a l'introduction est que j'ai récupéré sur internet le code initial de la page html avec les boutons.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.