WebServer monitoraggio e visualizzazione file su sd card

Salve a tutti sono nuovo del forum e del mondo arduino, spero di non aver creato una discussione già presente nel forum, se l’ho fatto chiedo scusa anticipatamente e il link del topic esistente. Premettendo che ho molte lacune, vorrei creare un semplice web server che mi consenta di monitorare un sensore e di visualizzare dei file salvati sulla sd card. Ho scaricato, modificato e testato(con esito positivo) due skecth: uno per il monitoraggio l’altro per visualizzare i file presenti nella sd. Il problema nasce quando, a causa delle mie scarse conoscenze di programmazione, provo a tirar fuori un unico sketch che faccia entrambe le cose. Potete aiutarmi per favore?
Allego i due sketch.
Grazie per l’attenzione.

SDWebBrowse.ino (7.44 KB)

WebServer.ino (3.84 KB)

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Qui una serie di link utili, non inerenti al tuo problema:

Grazie mille per le dritte Patrick_M. Ho letto il regolamento, mi sono presentato nel thread ed ho iniziato a guardare un po’ di link che mi hai postato. Navigando un po’ sul web ho trovato una guida per creare un web server a pagine multiple, nelle quali poi potrei far caricare il monitoraggio da una parte e la visualizzazione dei file presenti sulla sd dall’altra. Il problema è che il programma della guida che posto qui sotto nasce per arduino ethernet e l’ethernet shield, mentre io ho l’ethernet shield 2 dunque se provo a caricare il programma con la libreria “ethernet” la compilazione va a buon fine ma non riesco neanche a “pingarlo” mentre se inserisco la libreria “ethernet2” il programma non viene compilato. Cosa posso fare?
Grazie per l’attenzione.

#include <Ethernet2.h>
#include <SPI.h>
#include <WebServer.h> 

//variabili statiche per il mac address e lìip address
static byte mac_Add[] = { 0x90, 0xA2, 0xDA, 0x11, 0x3D, 0xE3 };
//cambiare l’ip in funzione della propria rete
static byte ip_Add[] = { 192, 168, 0, 3 };
//creazione oggetto Webduino
WebServer webserver("", 80);

//=============================================================================
//funzione pagina Start
void Start(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
//restituisce al browser l’intestazione http 200 OK
server.httpSuccess();

//gestisco il tipo di richiesta HEAD
if (type != WebServer::HEAD)
{
//Memorizzo nella memoria programma la stringa html e gli assegno il nome strMsg
P(strMsg) = "<h1>Logicaprogrammabile</h1>";

//recupero dalla memoria programma la stringa contrassegnata con il nome strMsg
//e la invio come output al browser
server.printP(strMsg);
}
}
//=============================================================================
//funzione pagina Start
void CmdPage01(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
//restituisce al browser l’intestazione http 200 OK
server.httpSuccess();

//gestisco il tipo di richiesta HEAD
if (type != WebServer::HEAD)
{
//Memorizzo nella memoria programma la stringa html e gli assegno il nome strMsg
P(strMsg) = "<h1>Pagina 01</h1>"
"<a href=’\’>Home</a>";

//recupero dalla memoria programma la stringa contrassegnata con il nome strMsg
//e la invio come output al browser
server.printP(strMsg);
}
}
//=============================================================================
//funzione pagina Page02
void CmdPage02(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
//restituisce al browser l’intestazione http 200 OK
server.httpSuccess();

//gestisco il tipo di richiesta HEAD
if (type != WebServer::HEAD)
{
//Memorizzo nella memoria programma la stringa html e gli assegno il nome strMsg
P(strMsg) = "<h1>Pagina 02</h1>"
"<a href=’\’>Home</a>";

//recupero dalla memoria programma la stringa contrassegnata con il nome strMsg
//e la invio come output al browser
server.printP(strMsg);
}
}
//=============================================================================
void setup()
{
//inizializzo l’ethernet shield con il mac e il address
Ethernet.begin(mac_Add, ip_Add);

//definisci l’azione di default che verrà eseguita quando l’utente
//naviga nella root del sito
webserver.setDefaultCommand(&Start);

//aggiungi altri comandi/pagine
webserver.addCommand("Page01", &CmdPage02);
webserver.addCommand("Page02", &CmdPage01);

//avvia il web server
webserver.begin();
}

void loop()
{
//elabora costantemente tutte le richieste provenienti dal browser
webserver.processConnection();
}

hai un link alla scheda ethernet che hai tu?

diciamo che il programma che hai messo qui sopra non ho capito cosa se ne faccia della ethernet…
infatti se commenti la prima riga

//#include <Ethernet2.h>

e la prima riga del setup

   //Ethernet.begin(mac_Add, ip_Add);

poi il tutto compila…

scarica questo pdf e segui l'esempio che ci trovi a pag. 12 :wink:

Grazie per la risposta tempestiva. Il programma che ho postato l'ho trovato su una guida e l'ho preso così com'era per provarlo. Ho provato a fare quello che mi hai detto, lo compila ma non funziona. Scusa l'ignoranza se non imposto l'indirizzo ip come faccio a pingarlo e/o a indirizzarmici dal browser?
Comunque ora ho provato uno degli esempi presenti nella libreria "webduino", ho modificato la libreria "webserver.h", che includeva la libreria "ethernet.h" e semplicemente l'ho sostituita con la libreria "ethernet2.h". Ora funziona. Più tardi o domani proverò a creare le due pagine web nelle quali caricare il monitoraggio sensore da una parte e la visualizzazione dei file della sd card dall'altra. Vi aggiornerò appena avrò fatto. Ancora grazie mille.

Buongiorno a tutti. Ho scartato l’utilizzo della libreria webduino visto che era vecchia ed ho usato la libreria ethernet2 prendendo spunto da questo programma http://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-web-server-links/ trovato proprio sul forum. l’ho modificato per quello che volevo fare io e tutto funziona. In questo momento visualizza pochi dati però ora che sono riuscito a testarlo potrò aggiungere ciò che mi serve Grazie ancora. Qui sotto il programma

#include <dht11.h>
#include <SPI.h>
#include <Ethernet2.h>
#include <SD.h>

// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   20
dht11 DHT;
#define DHT11_PIN 2

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 3);   // IP address, may need to change depending on network
EthernetServer server(80);       // create a server at port 80
File webFile;                    // handle to files on SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer
int chk;
void setup()
{
    // disable Ethernet chip
    pinMode(53, OUTPUT);
    digitalWrite(53, HIGH);
    
    Serial.begin(9600);       // for debugging
    
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for dati.htm file
    if (!SD.exists("dati.txt")) {
        Serial.println("ERROR - Can't find dati.txt file!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Found dati.txt file.");

    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // buffer first part of HTTP request in HTTP_req array (string)
                // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // save HTTP request character
                    req_index++;
                }
                Serial.print(c);    // print HTTP request character to serial monitor
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {                          
                    // open requested web page file
                    if (StrContains(HTTP_req, "GET / ")
                                 || StrContains(HTTP_req, "GET /home")) {
                        // send a standard http response header
                         client.println("HTTP/1.1 200 OK");
                         client.println("Content-Type: text/html");
                         client.println("Connnection: close");
                         client.println("Refresh: 5");  // refresh the page automatically every 5 sec
                         client.println();
                         client.println("<!DOCTYPE HTML>");
                         client.print("<h1>MONITOR</h1>");
                         client.println("
");
                         client.print("DHT11  \t");
                         chk = DHT.read(DHT11_PIN);    // READ DATA
                         switch (chk){
                           case DHTLIB_OK:  
                                       client.print("OK \t"); 
                                       break;
                           case DHTLIB_ERROR_CHECKSUM: 
                                       client.print("Checksum error \t"); 
                                       break;
                           case DHTLIB_ERROR_TIMEOUT: 
                                       client.print("Time out error \t"); 
                                       break;
                           default: 
                                       client.print("Unknown error \t"); 
                                       break;
  }
                         client.println("
");
                         client.print("Umidita'    ");
                         client.print(DHT.humidity);
                         client.print("    %");
                         client.println("
");
                         client.print("Temperatura              ");
                         client.print(DHT.temperature);
                         client.print("    C");
                         client.println("
");
                         client.print("<a href='/dati.txt'>dati</a>");
                         client.println("</html>");
                         
                      }
                    else if (StrContains(HTTP_req, "GET /dati.txt")) {
                        webFile = SD.open("dati.txt");        // open web page file
                        client.println("HTTP/1.1 200 OK");
                        client.println("Content-Type: text/html");
                        client.println("Connnection: close");
                        client.println();
                        client.print("<a href='/home'>home</a>");
                        client.println("
");
                        client.println("</html>");
                    }
                    // send web page to client
                    if (webFile) {
                        while(webFile.available()) {
                            client.write(webFile.read());
                        }
                        webFile.close();
                    }
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}