[webservice] caricare pagine da SD con valori dei sensori

Ciao a tutti, ho acquistato arduino UNO rev3 + l'ethernet shield e con gli esempi online e quelli di arduino ho provato a fare un webservice e fin qui tutto ok, funziona.

Il problema nasce quando voglio provare a mettere una pagina html dentro l' SD ( come saprete meglio di me, l'ethernet shield ha anche il controller per l'SD integrato )
come faccio a visualizzare da web questa pagina dentro l' SD Card con i valori di un eventuale sensore che ho su arduino? praticamente dovrebbe essere una pagina dinamica.

Grazie mille in anticipo per ogni suggerimento/risposta :slight_smile:

E' un argomento del quale ne abbiamo parlato allo sfinimento.

Cerca su google:

arduino webserver html sd
arduino html sd
arduino web sd
domotichome
webduino
tinywebserver
Arduino load page sd

insomma incrocia le chiavi e vedrai che esce da leggere fino a pasqua

ciao

Ho già provato a cercare, ma non ho trovato quello che cercavo o almeno non ci sono riuscito.
per questo ho deciso di scrivere qui...

Qui trovi un esempio che carica la pagina index.htm da sd

Oppure questo, un utente ha messo a disposizione il progetto completo di pagine su SD e sketch vari

e ancora
http://www.webweavertech.com/ovidiu/weblog/archives/000484.html

ciao

Prima leggi i link di pablos, fai le tue ricerche e poi leggi il mio post.

]:slight_smile:

Anche io ho avuto lo stesso tuo problema la prima volta che ho avuto una Ethernet Shield, ed ho risolto semplicemente integrando gli esempi Ethernet con quelli SD. Con piacere ti posto lo sketch che ho scritto per un webserver basico:

/*
  Author: Antonio Ceccato
  
  An Arduino W5100 based Ethernet SD Server, capable of serving HTML, PNG, JPEG, GIF and audio MP3 files
  with any other filetype being sent as plain text. Be warned that the SD files are limited to 8.3 file names.
  I suggest using "<img src="URL">" instead of base64 image encoding since it's faster.
*/

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

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 0, 177);

EthernetServer server(80);
File reqFile;
String request, strbuf;
char reqStr[32], dir[32];

void setup(){
  pinMode(10, OUTPUT);
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  if(!SD.begin(4)){
    Serial.println("SD Init error!");
    while(1);
  }
  else Serial.println("SD Init success!");
}

void loop(){
  EthernetClient client = server.available();
  if(client){
    Serial.println();
    Serial.println("Client connected.");
    int i=0;
    boolean currentLineIsBlank=true, firstLine=true;
    while(client.connected()){
      if(client.available()){
        char c = client.read();
        if(firstLine){
          if(c=='\n'){
            firstLine=false;
          }
          else{
            reqStr[i] = c;
            i++;
          }
        }
        //Ora abbiamo reqStr che contiene la prima riga dell'header

        if(c=='\n' && currentLineIsBlank){
          //Legge la directory della richiesta
          strbuf = String(reqStr); //SI PUO EVITARE di usare un char array sfruttando [] su String
          request = strbuf.substring(4); //Toglie "GET "
          request = request.substring(0, request.lastIndexOf(" HTTP/1.1")); //Toglie " HTTP/1.1" e lascia la directory
          Serial.print("Request: ");
          Serial.println(strbuf);
          Serial.print("It wants: ");
          Serial.println(request);
          
          if(request.endsWith("/") || request == "/") request = request + "index.htm"; //Se la dir richiesta finisce con / o è solo /
          if(!request.endsWith("/") && !(request[request.length()-4] == '.')) request = request + "/index.htm"; //Se la dir richiesta non finisce con /
                                                                                                                //e non è un file *.3
          request.toCharArray(dir, request.length()+1); //Converte String in char array
          Serial.print("I send: ");
          Serial.println(dir);
          
          if(!SD.exists(dir)){
            client.println("HTTP/1.1 404 Not Found");
            client.println("Content-Type: text/html");
            client.println("Connnection: close");
            client.println();
            client.println("<html><h2>404 Not Found</h2></html>");
            break;
          }

          client.println("HTTP/1.1 200 OK");
          if(request.endsWith(".htm")) client.println("Content-Type: text/html"); //File HTML
          else if(request.endsWith(".png")) client.println("Content-Type: image/png"); //Immagine PNG
          else if(request.endsWith(".gif")) client.println("Content-Type: image/gif"); //Immagine GIF
          else if(request.endsWith(".jpg")) client.println("Content-Type: image/jpeg"); //Immagine JPEG
          else if(request.endsWith(".mp3")) client.println("Content-Type: audio/mpeg"); //Audio MPEG
          else client.println("Content-Type: text/plain"); //Caso default
          client.println("Connnection: close");
          client.println();

          reqFile = SD.open(dir, FILE_READ);
          while(reqFile.available()){
            server.write(reqFile.read());
          }
          reqFile.close();

          break;
        }
        if(c=='\n') currentLineIsBlank = true;
        else if(c!='\r') currentLineIsBlank = false;
      }
    }
    delay(1);
    client.stop();
    Serial.println("Client disconnected.");
    for(int j=0; j<32; j++) reqStr[j] = '\0'; //Pulisce il buffer per evitare errori al prossimo giro
  }
}

So che non è un gran ché commentato ma spero tu riesca a capire (se non riesci, prima cerca di capire gli esempi di Ethernet e SD). Questo server praticamente aspetta un client e la sua richiesta (in più logga tutto via Serial), estrapola dalla richiesta il file chiesto, invia gli header HTTP (decidendo il MIME type in base all'estensione del file [ad esempio text/html per .html, audio/mp3 per .mp3, text/plain per testo semplice o .txt], gestisce anche il 404 File not found), carica il file dall'SD e lo invia al client (senza passare per un buffer) e poi chiude aspettando altre connessioni. Il mio codice non è stato testato molto estensivamente ma non credo abbia bug troppo pesanti, oltre ad essere poco performante dato che non ci ho studiato tanto sopra.
Potendo essere di aiuto, ciao!

** Con quel codice, in download arrivo a 2,9KB/s tramite router ed indirizzo privato.

pablos:
Qui trovi un esempio che carica la pagina index.htm da sd
Tutorial Arduino Ethernet e SD Card - Mauro Alfieri Wearable Domotica Robotica Elettronica

Oppure questo, un utente ha messo a disposizione il progetto completo di pagine su SD e sketch vari
https://sites.google.com/site/circuitiarduino/home/antigelo-caldaia

e ancora
http://www.webweavertech.com/ovidiu/weblog/archives/000484.html

ciao

Grazie mille pablos, credo che quello di cui ho bisogno si trova nell'esempio della caldaia.. ancora non ho provato ma dovrebbe andare.
Faccio delle prove, smanetto un po' e cerco di capire.. ora so come muovermi !

Grazie anche a te antony :slight_smile: