Problema salvataggio log su sd e stampa su web

Salve ragazzi,

Ho un problema nel momento in cui arduino deve creare il file su sd per il logging.Il file avra il nome composto dalla data del giorno.

Codice:

char filename[] = "0000-00-00.CSV";
...
getFileName();
...
]if (!SD.exists(filename)) {
 dataFile = SD.open(filename, FILE_WRITE);
}
...
void getFileName(){
giorno = rtc.getDay(), DEC;
 mese = rtc.getMonth(), DEC;
 anno = rtc.getYear(), DEC;
  filename[0] = (anno/1000)%10 + '0';
  filename[1] = (anno/100)%10 + '0';
  filename[2] = (anno/10)%10 + '0';
  filename[3] = anno%10 + '0';
  filename[5] = mese/10 + '0';
  filename[6] = mese%10 + '0';
  filename[8] = giorno/10 + '0';
  filename[9] = giorno%10 + '0';
}

Per la lista dei file da mostrare in web ho usato lo sketch in esempio modificato in modo che le serial.print diventino client.print.Arduino stampa perfettamente il nome del file in web però avrei bisogno che il file si possa cliccare e scaricare/visualizzare.Come faccio?

Grazie ragazzi

... magari questa discussione http://arduino.cc/forum/index.php/topic,93502.0.html ti può essere utile, vedo che anche loro avevano un problema simile (trasferire i dati che stavano su una SD).

Guglielmo

Per la lista dei file da mostrare in web ho usato lo sketch in esempio modificato in modo che le serial.print diventino client.print.Arduino stampa perfettamente il nome del file in web però avrei bisogno che il file si possa cliccare e scaricare/visualizzare.Come faccio?

Devi fare un webserver serio e una paginetta html seria, i nomi dei file devono diventare dei link cliccandoci sopra vengono inviati su richiesta GET o POST, lo sketch dovrebbe riconoscere il file e l'estensione per poi inviartelo in formato adeguato

"HTMtext/html"
"TXT
text/plain"
"CSStext/css"
"XML
text/xml"
"JStext/javascript"
"GIF
image/gif|"
"JPGimage/jpeg"
"PNG
image/png"
ecc

Qui non si tratta più di scrivere "se readstring == 'nomefile.csv' ..." i file ogni volta cambiano in base alla data, ti convine usare una libreria apposita webserver che fa caricamento file da SD

ciao

Penso, ma non ne sono sicuro, che quando usi la client.print non basta il nome del file.
Prima e dopo il nome del file ci deve essere un tag html che faccia diventare quel file un link
Qualcosa del tipo: file.txt

client.print("<A HREF="""); client.print(nomefile); client.print(""">"); client.print(nomefile); client.print("");

non sò se Arduino (linguaggio c) accetta questo "<A HREF=""" devi "stampare" nella stringa anche il carattere " (34)
altrimenti:
client.print(""); client.print(nomefile); client.print("");

NON provato e non sono sicuro, di html sò poco.

Tutto questo SOLO per avere i nomi dei file cliccabili, ma di sicuro devi aggiungere qualcosa per il discorso che faceva @pablos sul GET/POST
Poi il web server arduino deve capire quando viene richiesto il file, quale è il suo nome e spararlo indietro.

... ragazzi, non scherziamo, come dice esattamente pablos, per fare seriamente certe cose serve un VERO Web Server, in gradi di ricevere le richieste dai link HTML nel browser, elaborarle, creare i giusti pacchetti per l'invio del file, ecc. ecc.

Per questo gli suggerivo quel link dove, se ho letto bene, hanno messo in piedi una specie di piccolo FTP server proprio perché c'era la necessità di recuperare un file da SD ...

Se poi invece parliamo di un qualche cosa di piccolo (poche righe di testo) allora può andare anche bene una HTTP/GET a cui Arduino risponde ritornando indietro le poche righe (... sul forum ci sono infiniti esempi in tal senso) :wink:

Guglielmo

@prisco credo debba spedire piccoli file testo

Mi servirebbe il download.Il nome del file con la data odierna non è importante.

ho trovato qualcosa del genere ma non funziona

myFile = SD.open("ArduinoIO.zip");
            if (myFile)
            {
              while (myFile.available())
              {
                client.write(myFile.read());
              }
              myFile.close();
            }
            else
            {
              client.println("FILE NOT FIND");
            }

Nessuno sa come fare?

No, non mi sono ancora cimentato con le SD, WebServer e dintorni. :sweat_smile:

Sorry, stò iniziando adesso con Arduino e html. Ma ho una schedina ENC28J60, perciò uso altra libreria.

Io per imparare un pò di cose su html ho guardato qui:
http://www.lucadentella.it/2013/01/04/enc28j60-e-arduino-13/#comment-82758
E' però tutto relativo al ENC.
Magari puoi trovare su internet qualcosa come questo oppure affidati al link che ti ha consigliato @guglielmo

Se usi una SD in fat16 i nomi dei file non devono superare gli 8 caratteri e l'estensione 3 (abcdefgh.123)
SD.open("ArduinoIO.zip"); il tuo file è già di 9 char

Così funziona

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();
  }
}

("Content-Type: text/html"); qui devi specificare il tipo di file che stai mandando un file ZIP non è html

"HTMtext/html"
"TXT
text/plain"
"CSStext/css"
"XML
text/xml"
"JStext/javascript"
"GIF
image/gif|"
"JPGimage/jpeg"
"PNG
image/png"
ecc

Pablos ho cercato di fare come hai detto tu ma non funziona.Ho realizzato questo pezzo di codice

              client.println(F("HTTP/1.1 200 OK"));      
 if(readString.indexOf("?download") >0)
              {
              client.println(F("Content-Type: text/csv"));
              client.println();
          Download = SD.open("LOG.csv");
          if (Download) {
            while (Download.available()) {
                client.write(Download.read());
            }
            // close the file:
            Download.close();
          }
              }else{             
              client.println(F("Content-Type: text/html"));
              client.println();
              
 client.println(F("<html><head><meta name='apple-mobile-web-app-capable' content='yes' /><meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' /><meta http-equiv='refresh' content='10; URL=http://192.168.1.5' /><link rel='stylesheet' type='text/css' href='http://homeautocss.net84.net/a.css' /><link href='http://fonts.googleapis.com/css?family=Ubuntu:700italic' rel='stylesheet' type='text/css'><link rel='stylesheet' type='text/css' href='http://biserhosting.com/arduino/style.css' /><title>Controllo Manovia</title></head><body><h1>Controllo manovia</h1><a href=\"/?aumenta\">Aumenta Velocita'</a><a href=\"/?diminuisci\">Diminuisci velocita'</a><a href=\"?download\">Download LOGS</a>

<form name=\"input\" action=\"\" method=\"get\"><h2>Quanti paia ci sono oggi sul ogni carrello? <input type=\"text\" name=\"paia\"><input type=\"submit\" value=\"Invia\"></form></h2><h1>Dati Micro</h1><div class=\"container\"><div class=\"firstzone\"><span>"));
 client.println(contprima);
 client.println(F("</span></div><div class=\"secondzone\"><span>"));
 client.println(contseconda);
 client.println(F("</span></div><div class=\"thirdzone\"><span>"));
 client.println(contterza);
 client.println(F("</span></div><div class=\"speed\"><span>"));
 client.println(ms);
  client.println(F("</span></div>"));
    client.println(F("</span></div>"));
      client.println(F("<h1>Oggi su ogni carrello ci sono "));
            client.println(produzione);
      client.println(F("paia."));
  getFileName(dataFile,client);
printTime(client,dataFile);

 client.println(F("</div></body></html>"));
 }

Io ti ho mostrato come prendere un file da sd e inviarlo al browser quando richiesto, pensavo che questo fosse uno spunto.

client.println(F("HTTP/1.1 200 OK"));      
client.println(F("Content-Type: text/html"));
client.println();

queste 3 linee devono rimanere così senza nulla in mezzo, è la negoziazione col client, dice al browser il tipo di connessione, il tipo di dati e infine ci vuole un 'a capo' ... println() o uno /n

"Content-Type: text/csv")

è un formato non riconosciuto al massimo un csv per visualizzarlo puoi trattarlo come testo ... immagino siano tanti numeri separati da virgole
"Content-Type: text/plain"

Secondo me drovesti farti qualche prova con una paginetta ben funzionante, te la studi e cerchi di capirne il funzionamento, poi vai a modificarla fino ad ottenere quello che vuoi, una riga alla volta e se c'è un errore torni indietro.

poi quando posti le cose che non funzionano dovresti essere più completo
ad esempio qui if(readString.indexOf("?download") >0)
quel readstring da dove arriva, se non metti tutte le parti è difficile per tutti noi dare un aiuto

ciao