web server su SD card

Grazie

Si in effetti ciò che sto tentando di fare e caricare un SITo , pagine e collegamenti e quindi altre pagine

Utilizzare ARDUINO come se fosse uno spazio WEB al quale accedo da un IP dedicato ( con i limiti del HTML naturalmente )

per quanto riguarda il link

http://arduino.cc/forum/index.php/topic,101145.0.html

avevo già dato un occhiata ma a me le librerie TinyWebServer.h non vanno... Uso la rev 1.0 di ARDUINO

Schermata 04-2456032 alle 18.51.20.png

maxvetro:
Uso la rev 1.0 di ARDUINO

Io farei un approccio passo passo
Fai UNA paginetta WEB nello sketch e cerchi di visualizzare quella ; sfrutta gli esempi
Poi ti studi la lettura della SD ; anche qui ci sono gli esempi
Infine metti insieme e mandi una pagina complessa letta dalla SD
A quel punto sfruttando il Serial-Monitor cerchi di capire cosa arriva su arduino quando richiedi la pagina WEB
Capito cosa arriva cerchi di gestirlo per inviare pagine diverse
Devi dimenticare di fare tutto e subito

Assolutamente non voglio correre, vorrei imparare !

Ma forse sono partito male con lo spiegare ciò che devo fare :

Ho questo codice caricato su un ARDUINO UNO con ETHERNET SHIELD :

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

//Creao un array di byte per specificare il mac address
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//creo un array di byte per specificare l'indirizzo ip
byte ip[] = {192, 168, 1, 127};

char Data_RX;

//creao un oggetto server che rimane in ascolto sulla porta
//specificata
EthernetServer ArduinoServer(80);

void setup()
{
  //inizializza lo shield con il mac e l'ip  
  Ethernet.begin(mac, ip);
  //inizializza l'oggetto server
  ArduinoServer.begin();
  
  Serial.begin(9600);
}

void loop()
{

    EthernetClient pc_client = ArduinoServer.available();

    //controllo se pc_client è true
    if (pc_client != false)
    {
        //controllo continuamente che il client sia connesso
        while (pc_client.connected())
        {
            //Controllo se ci sono byte disponibili per la lettura
            if (pc_client.available())
            {
                //leggo i byte disponibili
                //provenienti dal client
                Data_RX = pc_client.read();

                //Attendo che tutti i byte siano letti
                //quando Data_RX contiene il carattere
                //di nuova line capisco tutti i byte sono
                //stati letti
                if (Data_RX == '\n')
                {
                    //Invio la risposta al client
                    //invio lo status code
                    pc_client.println("HTTP/1.1 200 OK");
                    //imposto il data type
                    pc_client.println("Content-Type: text/html");
                    pc_client.println();
                    //invio codice html
                    pc_client.print("<html><body><h1>Hello world Arduino Web Server</h1></body></html>");
                    //aspetto 1 ms affinche la risposta giunga al browser del client
                    delay(1);
                    //esco dal ciclo while una volta completato l'invio della risposta
                    break;
                }
            }
        }
        //chiudo la connessione
        pc_client.stop();
    }
}

Dal browser vado all'indirizzo 192.168.1.127 e vedo la scritta "HELLO WORLD ....."

Cio che vorrei , e sto trovando difficoltà , e di "passare" questa parte di codice

 //Invio la risposta al client
                    //invio lo status code
                    pc_client.println("HTTP/1.1 200 OK");
                    //imposto il data type
                    pc_client.println("Content-Type: text/html");
                    pc_client.println();
                    //invio codice html
                    pc_client.print("<html><body><h1>Hello world Arduino Web Server</h1></body></html>");
                    //aspetto 1 ms affinche la risposta giunga al browser del client
                    delay(1);
                    //esco dal ciclo while una volta completato l'invio della risposta
                    break;

dentro la SD card e leggerlo da li !

:slight_smile:

guarda qui http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1291319677/6
Purtroppo è su IDE 0022-23 devi cambiarlo (non è molto complicato), purtroppo ci vorrà ancora un po' prima di trovare molti esempi di ethernet completi sulla ide 1.0, però questo ti fa capire come impostare un load da sd

ciao

provo subito... grazie 1000

Grazie a tutti..

Posto la soluzione , dovesse servire ad altri

in pratica con il seguente codice , accedendo all'indirizzo 192.168.1.127 è possibile visualizzare la pagina INDEX.HTM presente sulla memoria SD card

Ho provato a creare con adobe dreamweaver un piccolo SITO con collegamenti ipertestuali ed altro , e funziona

Grazie ancora per la pazienza

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1, 127 };
File htmlFile;
EthernetServer server(80);



void setup () 
{
  
  Ethernet.begin(mac, ip);
  server.begin();
  if (!SD.begin(4)) { return; }
  
  Serial.begin(9600);
  
}



void loop ()
{
  
  EthernetClient client = server.available();

    if (client) {
      
      boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
 
          htmlFile = SD.open("index.htm");
          if (htmlFile) {
            while (htmlFile.available()) {
                client.write(htmlFile.read());
            }
            // close the file:
            htmlFile.close();
          }
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

scusate ancora...

il file INDEX.HTM che ho creato risiede nella SD ( in root ) ed anche una cartella "image" ( sempre in root ) dove all'interno c'è un immagine logo.jpg

<title>TITOLO</title>
</head>
<img src="image/logo.jpg" width="854" height="164" alt="" />
</html>

Richiamo l'indirizzo IP , si apre la pagina ma vedo l'immagine con il punto di domanda , credo che il percorso "image/logo.jpg" non sia corretto

Premetto che sul computer funziona ed il percorso è giusto

Consigli ???

Grazie

Hai provato senza cartella? metti il jpg in root

si ... ma nulla da fare

tasto destro sull'immagine che vedo nel BROWSER , apri link in un altra finestra e lui va a cercare :

http://192.168.1.127/image/logo.jpg

non credo che esista questo percorso !!

dovrei capire come è possibile avere accesso ad un file dentro la SD tramite BROWSER ( se possibile !! )

ho provato a far caricare l'immagine da un URL e funziona

grazie

io dentro al body ho messo questo

invia adesso ......... .........

ho un tasto con un jpg che si trova su sd e funziona

Ma che non va!

Questo è il mio file index.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Documento senza titolo</title>
</head>

<body>
<button name="vai" type="submit"><img src="logo.jpg" width="103" height="90" title="invia adesso" border="1" vspace="5" alt="invia adesso" align="middle"><b></b></button> 
</body>
</html>

L'immagine "logo.jpg" l'ho spostata nella root della SD

e questo e ciò che vedo :

ho aperto la porta 88 , se hai voglia è accessibile dal WEB , ecco l'indirizzo :

http://rubianahouse.homepc.it:88/

Grazie

ho provato, vedo solo un tasto con "invia adesso" ..... non so perchè non la carica, eppure dovrebbe.
Se non hai qualche prob col browser, se dici che cliccando sull'immagine da l'indirizzo di una cartella nonostante non esista sembrerebbe che un cokie se lo sia segnato bene, però posso dire anche una pu.....ta :slight_smile:

Nessun problema con il browser , anche xche se l'immagine la carico da un link esterno funziona

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Documento senza titolo</title>
</head>

<body>
<button name="vai1" type="submit"><img src="logo.jpg" width="103" height="90" title="invia adesso" border="1" vspace="5" alt="invia adesso" align="middle"><b></b></button> 
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src="http://cdn1.1stwebdesigner.com/wp-content/uploads/2010/08/Internet_Explorer_9.png" />

</body>
</html>

Se hai voglia ho aggiornato la SD ( rubianahouse.homepc.it:88 )

Solo un dubbio , scusa se te lo chiedo ma e per non creare casini :

Tu hai la SD nel modulo ETHERNET SHIELD e riesci a vedere l'icona logo.jpg con il codice html ?

<button name="vai1" type="submit"><img src="logo.jpg" width="103" height="90" title="invia adesso" border="1" vspace="5" alt="invia adesso" align="middle"><b></b></button>

maxvetro:
Nessun problema con il browser , anche xche se l'immagine la carico da un link esterno funziona adesso"

Ma da un link esterno la puoi mettere senza problemi senza pulsanti di caricamento
Questo ne e' un esempio http://ifv.lancerotto.it:82 vedi logo Arduino

Purtroppo il SEARCH di questo forum e' notoriamente penoso ma ti posso assicurare che l'argomento e' stato dibattuto e si parlava di immagine codificata in BASE64

Magari chi ha interagito con quel post si ricorda il nome e lo puo' linkare

Forse qui ... non ho letto tutti i messaggi ma sembra abbia una conclusione positiva
http://arduino.cc/forum/index.php/topic,56669.0.html

Ma non è che ci vuole tipo lo slash davanti?

<img src="\logo.jpg" width="103" height="90" title="invia adesso" border="1" vspace="5" alt="invia adesso" align="middle"><b></b></button>

Visto che siamo a provarle...

La domanda ora diventa un altra , non vorrei averVi portato fuori pista ...

D: E' possibile visualizzare tramite BROWSER un immagine salvata in SD inserita in un ETHERNET SHIELD ? Se si quale è il percorso ?

http://rubianahouse.homepc.it:88
Questo è l'indirizzo del mio Arduino ( lo lascio acceso per test )

Vedete come :

  1. la prima immagine ( che risiede sulla SD card ) non viene visualizzata : il suo percorso ( TASTO DESTRO DEL MOUSE - APRI IN UNA NUOVA FINESTRA) è http://rubianahouse.homepc.it:88/logo.jpg
  2. la seconda immagine ( che risiede su un sito WEB ) viene visualizzata : il suo percorso ( TASTO DESTRO DEL MOUSE - APRI IN UNA NUOVA FINESTRA) è http://cdn1.1stwebdesigner.com/wp-content/uploads/2010/08/Internet_Explorer_9.png

Grazie a tutti per la disponibilità

maxvetro:
La domanda ora diventa un altra , non vorrei averVi portato fuori pista ...
tutti per la disponibilità

Visto che la cosa mi interessa e stuzzica ho girovagato un po' ed ho trovato questa affermazione

Il sistema dei LED è abbastanza macchinoso.

In pratica, con una funzione particolare di una libreria, faccio il check di una uscita se è HIGH o LOW, e in base a questo faccio uno strcpy_s di un buffer, che contiene una Stringa infilata dentro il BaBBuino con PROGMEM.

In questa Stringa c'è l'immagine del LED in base64, quindi non c'è nessun file .bmp o .jpg esterno da recuperare, ma è costruito direttamente dentro la memoria del BaBBUino.
In realtà sono 2 stringhe con 2 versioni base64 del LED: quello Rosso, acceso, e quello Grigio, spento.

Purtroppo Babbuino sembra volatilizzato
Affidiamoci ai "Testoni" se possono interpretare e spiegare le affermazioni riportate

Provo a codificare una immagine come stringa e metterla in una pagina per vedere cosa succede