Afficher une page web dans un réseau local depuis une carte SD avec wifi shield

Bonjour tout le monde,
je suis un élève de terminal sti2d option sin et je dois dans mon projet faire afficher une page web avec des données d'un capteur de température et d'un capteur de son sur la carte sd connecté a mon arduino wifi shield il y a une page web (dont le nom est index.htm sur la carte sd) de stocker ainsi que les données des deux capteurs, et je souhaiterai que lorsque je tape l'adresse IP généré par la commande WiFi.localIP(); que la page web s'affiche. j'ai réussi avec un module arduino ethernet shield à l'afficher grace a ce programme

/*
Placer sur carte SD les fichiers index.htm et style.css
 */
float valr =0;
#include <Wire.h> // Inclure Bibliothèque Wire
#include <SPI.h> // Inclure Bibliothèque SPI
#include <SD.h> // Inclure Bibliothèque SD
#include <Ethernet.h> // Inclure Bibliothèque Ethernet ( a modifier avec wifi)



int flghtm=0;
//Local ethernet setup
byte mac[] = {0x90,0xA2,0xDA,0x0E,0xCE,0x93};  // Adresse Mac
byte ip[] = {192,168,1,18}; // Adresse Ip ( modifiable)
char rootFileName[] = "index.htm"; // Page de d'accueil
EthernetServer server(80); // Port utliser 



// Configuration de la card SD
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
#define error(s) error_P(PSTR(s))
#define BUFSIZ 48
void error_P(const char* str) {
  PgmPrint("error: ");
  SerialPrintln_P(str);
  if (card.errorCode()) {
    PgmPrint("SD error: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
  while(1);
}



void setup() {
  Serial.begin(9600);
  Wire.begin(); //Configure la carte Arduino pour utiliser les fonctions I2C 
  PgmPrint("Free RAM: ");
  Serial.println(FreeRam());  
//  pinMode(10, OUTPUT);              
//  digitalWrite(10, HIGH);              
  if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");
  if (!volume.init(&card)) error("vol.init failed!");
  PgmPrint("Volume is FAT");
  Serial.println(volume.fatType(),DEC);
  Serial.println();
  if (!root.openRoot(&volume)) error("openRoot failed");
  PgmPrintln("Files found in root:");
  root.ls(LS_DATE | LS_SIZE);
  Serial.println();
  PgmPrintln("Files found in all dirs:");
  root.ls(LS_R);
  Serial.println();
  PgmPrintln("Done");
  Ethernet.begin(mac,ip);
  server.begin();
  Serial.begin (9600);    // ?????????????
}




void loop()
{
    
  int S = 0;        // Variable pour le stockage de la valeur analogique
  int PA0 = 0;  //Numéro du port analogique sur lequel la son est mesurée
  S = analogRead(PA0); // 

  int T = 0;        // Variable pour le stockage de la valeur numerique
  int PA9 = 0;  //Numéro du port analogique sur lequel la température est mesurée
  T = digitalRead(9); 



   T = 15, S = 10;



  char clientline[BUFSIZ];
  char *filename;
  int image = 0;
  int index = 0;

  EthernetClient client = server.available();
  if (client) {
    boolean current_line_is_blank = true;
    index = 0;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
           if (index >= BUFSIZ) 
            index = BUFSIZ -1;

          continue;
        }

        clientline[index] = 0;
        filename = 0;

        Serial.println(clientline);

        if (strstr(clientline, "GET / ") != 0)     // si ligne de commande reçue contient "GET / "
        {
          filename = rootFileName;   // on envoie le fichier index.htm
          flghtm = 1;
        } 
        else
        {
          flghtm = 0;
        }
        Serial.print("flghtm : ");
        Serial.print(flghtm);
        Serial.print("  ");
        if (strstr(clientline, "GET /") != 0)
        {
          if (!filename) filename = clientline + 5; 

          (strstr(clientline, " HTTP"))[0] = 0;

          Serial.println(filename);

          if (! file.open(&root, filename, O_READ)) {
            client.println("HTTP/1.1 404 Not Found");
            client.println("Content-Type: text/html");
            client.println();
            client.println("<h2>Error 404</h2>");
            client.println("<s2>The file does not exist.<s2>");
            client.println("");
            break;
          }
          
          Serial.println("Opened!");
          //File types
          client.println("HTTP/1.1 200 OK");
          if (strstr(filename, ".htm") != 0)
            client.println("Content-Type: text/html");
          else if (strstr(filename, ".css") != 0)
            client.println("Content-Type: text/css");
          else if (strstr(filename, ".png") != 0)
            client.println("Content-Type: image/png");
          else if (strstr(filename, ".jpg") != 0)
            client.println("Content-Type: image/jpeg");
          else if (strstr(filename, ".gif") != 0)
            client.println("Content-Type: image/gif");
          else if (strstr(filename, ".3gp") != 0)
            client.println("Content-Type: video/mpeg");
          else if (strstr(filename, ".pdf") != 0)
            client.println("Content-Type: application/pdf");
          else if (strstr(filename, ".js") != 0)
            client.println("Content-Type: application/x-javascript");
          else if (strstr(filename, ".xml") != 0)
            client.println("Content-Type: application/xml");
          else
            client.println("Content-Type: text");
          client.println();

          int16_t c;
          while ((c = file.read()) >= 0) {
            if ((c==0xff)&&(flghtm==1))  // Variable  Analogique Son(15)
            {client.print(S);
            }
            
            if ((c==0xfe)&&(flghtm==1)) // Variable Numerique Temperature(14)
            {client.print(T);
            }
  

            else
            {
            //Serial.print((char)c); //Prints all HTML code to serial (For debuging)
            client.print((char)c); //Prints all HTML code for web page
            }  
        }
         

      
          file.close();

        } 
        else {
          client.println("HTTP/1.1 404 Not Found");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<h2>Error 404</h2>");
          client.println("");
        }
        break;
      }
    }
   
    client.stop();
  }

}

//The End /*

donc j'aimerai faire afficher la page web avec le arduino wifi shield et pour l'instant j'ai fais ce programme:

#include <WiFi.h>
#include <Wire.h> // Inclure Bibliothèque Wire
#include <SPI.h> // Inclure Bibliothèque SPI
#include <SD.h> // Inclure Bibliothèque SD

char ssid[] = "dlink";      // le nom du réseau (SSID)
char pass[] = "sti2dsin";   // mot de passe du SSID

int status = WL_IDLE_STATUS;      //écriture d'une variable qui met un statut "au repos"

WiFiServer server(80);

const int chipSelect = 4;

float valr =0;
int flghtm=0;


//Local ethernet setup
char rootFileName[] = "index.htm"; // Page de d'accueil

  // Écouter si un client essaye de se connecter 
  WiFiClient client = server.available();


// Configuration de la card SD
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
#define error(s) error_P(PSTR(s))
#define BUFSIZ 48


void error_P(const char* str) {
  PgmPrint("error: ");
  SerialPrintln_P(str);
  if (card.errorCode()) {
    PgmPrint("SD error: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
  while(1);
}



void setup() {
  
   //Initialisation en série et attends pour le port à ouvrir:
  Serial.begin(9600);   
  
  // vérifie la presence du shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield pas present"); 
    // ne pas continuer:
    while(true);
  } 
  
  // tentative de connection au réseau wifi:
  while ( status != WL_CONNECTED) { 
    Serial.print("tentative de connection au ssid: ");
    Serial.println(ssid);
    // connection au réseau.    
    status = WiFi.begin(ssid, pass);

    // attends 10 secondes pour la connexion:
    delay(10000);
  } 
  server.begin();
  // vous êtes connecté maintenant, affiche le statut:
  printWifiStatus();
  
  
  
  

  Wire.begin(); //Configure la carte Arduino pour utiliser les fonctions I2C 
  PgmPrint("Free RAM: ");
  Serial.println(FreeRam());  
//  pinMode(10, OUTPUT);              
//  digitalWrite(10, HIGH);              
  if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");
  if (!volume.init(&card)) error("vol.init failed!");
  PgmPrint("Volume is FAT");
  Serial.println(volume.fatType(),DEC);
  Serial.println();
  if (!root.openRoot(&volume)) error("openRoot failed");
  PgmPrintln("Files found in root:");
  root.ls(LS_DATE | LS_SIZE);
  Serial.println();
  PgmPrintln("Files found in all dirs:");
  root.ls(LS_R);
  Serial.println();
  PgmPrintln("Done");
  WiFi.begin(ssid,pass);
  server.begin();
  Serial.begin (9600); 
}

//////////////////////////////////////


void loop()
{
    
  int S = 0;        // Variable pour le stockage de la valeur analogique
  int PA0 = 0;  //Numéro du port analogique sur lequel la son est mesurée
  S = analogRead(PA0); // 

  int T = 0;        // Variable pour le stockage de la valeur numerique
  int PA9 = 0;  //Numéro du port analogique sur lequel la température est mesurée
  T = digitalRead(9); 



   T = 15, S = 10;



  char clientline[BUFSIZ];
  char *filename;
  int image = 0;
  int index = 0;

  WiFiClient client = server.available();

  if (client) {
    boolean current_line_is_blank = true;
    index = 0;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
           if (index >= BUFSIZ) 
            index = BUFSIZ -1;

          continue;
        }

        clientline[index] = 0;
        filename = 0;

        Serial.println(clientline);

        if (strstr(clientline, "GET / ") != 0)     // si ligne de commande reçue contient "GET / "
        {
          filename = rootFileName;   // on envoie le fichier index.htm
          flghtm = 1;
        } 
        else
        {
          flghtm = 0;
        }
        Serial.print("flghtm : ");
        Serial.print(flghtm);
        Serial.print("  ");
        if (strstr(clientline, "GET /") != 0)
        {
          if (!filename) filename = clientline + 5; 

          (strstr(clientline, " HTTP"))[0] = 0;

          Serial.println(filename);

          if (! file.open(&root, filename, O_READ)) {
            client.println("HTTP/1.1 404 Not Found");
            client.println("Content-Type: text/html");
            client.println();
            client.println("<h2>Error 404</h2>");
            client.println("<s2>The file does not exist.<s2>");
            client.println("");
            break;
          }
          
          Serial.println("Opened!");
          //File types
          client.println("HTTP/1.1 200 OK");
          if (strstr(filename, ".htm") != 0)
            client.println("Content-Type: text/html");
          else if (strstr(filename, ".css") != 0)
            client.println("Content-Type: text/css");
          else if (strstr(filename, ".png") != 0)
            client.println("Content-Type: image/png");
          else if (strstr(filename, ".jpg") != 0)
            client.println("Content-Type: image/jpeg");
          else if (strstr(filename, ".gif") != 0)
            client.println("Content-Type: image/gif");
          else if (strstr(filename, ".3gp") != 0)
            client.println("Content-Type: video/mpeg");
          else if (strstr(filename, ".pdf") != 0)
            client.println("Content-Type: application/pdf");
          else if (strstr(filename, ".js") != 0)
            client.println("Content-Type: application/x-javascript");
          else if (strstr(filename, ".xml") != 0)
            client.println("Content-Type: application/xml");
          else
            client.println("Content-Type: text");
          client.println();

          int16_t c;
          while ((c = file.read()) >= 0) {
            if ((c==0xff)&&(flghtm==1))  // Variable  Analogique Son(15)
            {client.print(S);
            }
            
            if ((c==0xfe)&&(flghtm==1)) // Variable Numerique Temperature(14)
            {client.print(T);
            }
  

            else
            {
            //Serial.print((char)c); //Prints all HTML code to serial (For debuging)
            client.print((char)c); //Prints all HTML code for web page
            }  
        }
         

      
          file.close();

        } 
        else {
          client.println("HTTP/1.1 404 Not Found");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<h2>Error 404</h2>");
          client.println("");
        }
        break;
      }
    }
   
    client.stop();
  }
    }









void printWifiStatus() {
  // affiche le SSID du réseau auquel on est attaché 
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // affiche l'adresse IP du wifi shield 
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);


  // affiche la force du signal reçu:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

mais lorsque je charge avec mozilla l'adresse ip généré rien ne charge...
quelqu'un sais comment afficher cet page web ???

merci beaucoup d'avoir lu mon pavé :stuck_out_tongue:

Salut,

Si le souci semble être la carte wifi... Alors essaie les exemples de la librairie wifi.h ( surtout l'a exemple wifiwebserver) pour vérifier que la carte fonctionne bien ... Sinon c'est peut être une mise à jour du firmware de la carte wifi qu'il faut faire

J'ai mis a jour le firmware et j'ai utilisé l'exemple mais ça marche pas :frowning:

déja rien que la il y a des incohérences ... (tu dis analog et tu lis du digital ... tu lis des valeurs puis tu les initialises juste après ...)

  int S = 0;        // Variable pour le stockage de la valeur analogique
  int PA0 = 0;  //Numéro du port analogique sur lequel la son est mesurée
  S = analogRead(PA0); // 
  int T = 0;        // Variable pour le stockage de la valeur numerique
  int PA9 = 0;  //Numéro du port analogique sur lequel la température est mesurée
  T = digitalRead(9);
  T = 15, S = 10;

utilises aussi le formattage automatique (menu Outils) pour avoir un code proprement présenté...

après tu dis : ça marche pas ... mais à quel niveau ?

le wifi se connecte ? tu as des messages dans la console du port série ? à quel niveau ça marche pas ?

Salut, tu à bien paramétré ton shield pour le même réseau wifi que ton ordi? si oui tu n' a pas de proxy?

Si tous sa est ok, ton shield prend une adresse par défaut, ok mais ta box accepte tel ce style d'adresse? pas sur, vérifie que le format soit le même que les autres machines sur ce réseau wifi et aussi que cette adresse est libre.

Sinon, mets des traces via le serial, tu pourras voir si les init ce font, si l'adresse est bonne etc.

Alex.

Skizoh j'ai enlevé le proxy et j'ai mis le même réseau wifi que mon ordi et avec des tests précédents l'adresse marchais...
Comment on met des traces avec le serial ?
merci de ta réponse :slight_smile:

Par traces avec serial c'est, que régulièrement aux endroits stratégiques de ton programme tu fais des serial.print("je suis ici"); pour suivre l'exécution pas à pas de ton programme ... Et vérifier le contenu de certaines variables ...

Tu utilise l'adresse : 192.168.1.18, si elle est disponible ton ordi à le même style d'adresse 192.168.1.xx, si ce n'est pa le cas ton adresse est fausse, prend le même format d'adresse que ton ordi, une fois ceci fait, démarre ton arduino et essaye de le pinguer : ping xx.xx.xx.xx , si il répond sa sera déjà une bonne chose.

Après sa tu pourra dire c'est l'envoie de ma page web qui marche pas.

Skizo.