arduino ethernet più pagine

Salve come si possono inserire più pagine nel web server del mio arduino? Ad esempio un file index.html poi ciao.html ecc? L'accesso si realizza con ip\nomepagina.html

Non capisco la domanda. Ciao Uwe

Devi fare uso di una SD, un webserver che carichi da essa e che riconosca dall'header il nome del file e dell'estensione, di sicuro le pagine non potrai metterle sullo sketch, se non ricordo male hai una UNO...

Se fai 2-3 ricerche trovi molto sull' argomento

luigialab: Salve come si possono inserire più pagine nel web server del mio arduino? Ad esempio un file index.html poi ciao.html ecc? L'accesso si realizza con ip\nomepagina.html

Se ho capito le tue intenzioni questo funziona. Lo ho provato. http://www.mauroalfieri.it/elettronica/tutorial-arduino-ethernet-e-pagine-multiple-su-sd-card.html

Grazie per le risposte , sto vedendo per il link che Lollo82 mi ha postato. Devo fare dei test perchè nelle varie pagine dovrei inserire collegamenti che comporterebbero l'accensione e lo spegnimento di led, inoltre dovrei inserire una pagina dedicata al JSON. Comunque faccio delle prove e vi faccio sapere. Grazie.

Hai una UNO?

se ho capito bene la tua richiesta qui trovi quello che ti serve

Arduino WebServer multi page

Si ho una UNO ma a breve prenderò una Mega compatibile.
Per testare la mia SD ho utilizzato questo codice :

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,254);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);
File htmlFile;

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   if (!SD.begin(4)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  if (!SD.exists("indice.htm")) {
        Serial.println("ERROR - Can't find the .htm file!");
        return;  // can't find index file
    }
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // 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) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println();
          
          htmlFile = SD.open("indice.htm");
          if (htmlFile) {
            while (htmlFile.available()) {
                client.println(htmlFile.read());
                Serial.println(htmlFile.read());
            }
            // close the file:
            htmlFile.close();
          }
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          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);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

Il problema è che accedendo all’indirizzo 192.168.0.254/ mi trovo davanti una pagina un bel pò strana :slight_smile: ovvero:

60 116 108 10 104 97 62 60 116 108 62 35 116 108 49 123 9 111 116 102 109 108 58 111 105 32 97 115 77 59 9 111 116 115 122 58 52 120 10 99 108 114 98 117 59 125 60 115 121 101 10 116 116 101 10 116 101 110 116 83 105 108 32 32 68 60 116 116 101 10 47 101 100 10 98 100 62 9 99 110 101 62 9 60 50 10 9 69 104 114 101 32 104 101 100 9 60 104 62 9 47 101 116 114 10 60 32 100 34 116 108 49 62 9 97 105 97 99 114 99 116 32 97 115 104 100 32 68 99 110 69 104 114 101 32 104 101 100 112 114 65 100 105 111 10 47 62 60 98 100 62 60 104 109 62

mentre il codice del mio file (indice.htm) è corretto ovvero:

<html>
<head>
<style>
#stile1
{
	font-family:Comic sans MS;
	font-size:14px;
	color:blue;
}
</style>
<title>
Ethernet Shield e SD
</title>
</head>
<body>
	<center>
		<h2>
			Ethernet Shield
		</h2>
	</center>

<p id="stile1">
	Pagina caricata da scheda SD con Ethernet Shield per Arduino!
</p>
</body>
</html>

Dove sbaglio? Grazie.

io da quello che ho visto nei vari esempi in giro la parte di lettura e invio della pagina è fatta cosi

// send web page to client
if (webFile) {
        while(webFile.available()) {
               client.write(webFile.read());
        }
        webFile.close();
}

quindi credo che dovresti usare al posto di client.println(htmlFile.read()); la sintassi client.write(webFile.read());

Si infatti ho fatto questa sotituzione, proprio guardando al link che tu stesso mi hai postato (http://startingelectronics.com/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-web-server/) ma ora ottengo questo “codice”

#tl1{otfml:oi asM;otsz:4xclrbu; /tl>Ehre hedeS /il>< d"tl1>Pgn aiaad ceaS o tentSil e run!

EDIT:
Ho eliminato la riga che riguardava il Serial.println ed ora funziona. Qualche spiegazione?

htmlFile = SD.open("indice.htm");
          if (htmlFile) {
            while (htmlFile.available()) {
                client.write(htmlFile.read());
                //Serial.println(htmlFile.read());  <----- QUESTA
            }
            // close the file:
            htmlFile.close();

Non vorrei dire una fesseria. una cosa del genere capitò anche a me..... intanto io configura la seriale a 115200.

Dopo di che subito dopo l inizializzazione uso mettere un delay. Questo se non ricordo male e non mi confondo mi ha risolto il problema

Sto utilizzando questa soluzione per pagine multiple http://www.mauroalfieri.it/elettronica/tutorial-arduino-ethernet-e-pagine-multiple-su-sd-card.html e funziona . Il problema sorge quando devo accendere spegnere led nella varie pagine poichè riesco a gestire http://IP/?led1o ma non riesco a gestire http://IP/sala.htm/?led2o Il problema penso sia legato alla gestione dell url da parte del link che ho postato. Qualche suggerimento?

luigialab:
Si ho una UNO ma a breve prenderò una Mega compatibile.
Per testare la mia SD ho utilizzato questo codice :

#include <SPI.h>

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,254);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
File htmlFile;

void setup() {
// Open serial communications and wait for port to open:
  Serial.begin(9600);
  if (!SD.begin(4)) {
    Serial.println(“Card failed, or not present”);
    // don’t do anything more:
    return;
  }
  if (!SD.exists(“indice.htm”)) {
        Serial.println(“ERROR - Can’t find the .htm file!”);
        return;  // can’t find index file
    }
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // 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) {
          // send a standard http response header
          client.println(“HTTP/1.1 200 OK”);
          client.println(“Content-Type: text/html”);
          client.println(“Connection: close”);  // the connection will be closed after completion of the response
          client.println();
         
          htmlFile = SD.open(“indice.htm”);
          if (htmlFile) {
            while (htmlFile.available()) {
                client.println(htmlFile.read());
                Serial.println(htmlFile.read());
            }
            // close the file:
            htmlFile.close();
          }
          break;
        }
        if (c == ‘\n’) {
          // you’re starting a new line
          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);
    // close the connection:
    client.stop();
    Serial.println(“client disonnected”);
  }
}




Il problema è che accedendo all'indirizzo 192.168.0.254/ mi trovo davanti una pagina un bel pò strana :) ovvero:


60 116 108 10 104 97 62 60 116 108 62 35 116 108 49 123 9 111 116 102 109 108 58 111 105 32 97 115 77 59 9 111 116 115 122 58 52 120 10 99 108 114 98 117 59 125 60 115 121 101 10 116 116 101 10 116 101 110 116 83 105 108 32 32 68 60 116 116 101 10 47 101 100 10 98 100 62 9 99 110 101 62 9 60 50 10 9 69 104 114 101 32 104 101 100 9 60 104 62 9 47 101 116 114 10 60 32 100 34 116 108 49 62 9 97 105 97 99 114 99 116 32 97 115 104 100 32 68 99 110 69 104 114 101 32 104 101 100 112 114 65 100 105 111 10 47 62 60 98 100 62 60 104 109 62




mentre il codice del mio file (indice.htm) è corretto ovvero:


#stile1 { font-family:Comic sans MS; font-size:14px; color:blue; } Ethernet Shield e SD

Ethernet Shield

Pagina caricata da scheda SD con Ethernet Shield per Arduino!

> ``` > > > Dove sbaglio? Grazie.

Devi mettere un delay. Anche a me capitava e ho risolto così. Lo ho fatto un bel pò di tempo fa quindi non ricordo dove. Ci guardo e te lo dico!!!

Scusate ho un 'altra domanda ora io riesco a caricare più pagine ma sono “statiche” nel senso sono prese dalla SD e vengono caricate ma se io volessi caricare una pagina con un valore letto da un ingresso?
Nel senso come faccio a fare quello che prima facevo con:

client.println("<p>");
client.println(miaVariabile);
client.println("</p>");

adesso che invece uso un ciclo for per caricare la pagina? Grazie.

Il metodo c'è, ma come ti ho detto su una UNO perdi tempo e poi devi usare una libreria che fa tutto, usare ajax o json, script in js, farlo a mano diventi pazzo

prendi spunto da qui http://www.panu.it/wjsonduino/

ciao

Con una mega compatibile (che dovrei acquistare a breve)? Edit : scusa ma ti riferisci alla gestione dei comandi (? Ledon) oppure alla mia ultima domanda? Perché nel primo caso ho risolto

Mi riferivo a caricare più pagine da SD con la lettura dei dati, ma anche la trasmissione di comandi da client a server da diverse pagine, non vorrai usare il metodo GET ?data=nnn in eterno …

Perché ho strutturato il lavoro con get ecc. Quindi vorrei evitare di stravolgere tutto. Potrei ad esempio realizzare un controllo sulla riga del file html letta dall’sd e inserire in quella riga il dato?
Mi spiego meglio nel mio file html inserisco dei caratteri speciali , nel while del mio programma che mi va a leggere tutte le righe del file .htm faccio un controllo che se mi individua questo carattere speciale lo sostituisce con la variabile letta.

Qualcuno potrebbe aiutarmi con questa funzione? Giustamente con funziona perchè indexOf() e replace() lavorano su stringhe mentre read() della libreria SD resistuisce un intero. Come potrei fare? l'intero sarebbe il carattere ASCII o cosa? In tal caso posso lavorare su ASCII?

void read_file( char* page_html, EthernetClient client )
{
  htmlFile = SD.open( page_html );
  if (htmlFile) {
    while (htmlFile.available()) {
        if(htmlFile.read().indexOf("@TEMP"))
        htmlFile.replace("@TEMP",val);
        client.write(htmlFile.read());
        
    }
    // close the file:
    htmlFile.close();
  }
}

EDIT: Riflettendoci è meglio evitare questo: Ho deciso di utilizzare ajax ma ho un problema, stavo seguendo questa guida: www.hackshed.co.uk/lets-build-a-functional-arduino-webserver-sdcard-ethernet/

ma quando carico la pagina la funzione:

if (inString.indexOf("came.htm") >0){
               client.print(1234);
           }

Stampa "1234" tante volte, come posso risolvere? Grazie.

ciao, sempre nel link che ti ho linkato prima è riportato tutto da come leggere valori da pagine e a come inviare dati alle pagine sfruttando ajax.

scorri per bene quel tutorial :D