Go Down

Topic: Problema salvataggio log su sd e stampa su web (Read 4814 times) previous topic - next topic

francescoprisco

Apr 18, 2013, 07:44 am Last Edit: Apr 18, 2013, 07:52 am by leo72 Reason: 1
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:

Code: [Select]

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

gpb01

... 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
Search is Your friend ... or I am Your enemy !

pablos71

#2
Apr 18, 2013, 11:07 am Last Edit: Apr 18, 2013, 11:10 am by pablos Reason: 1
Quote
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

"HTM*text/html"
"TXT*text/plain"
"CSS*text/css"
"XML*text/xml"
"JS*text/javascript"
"GIF*image/gif|"
"JPG*image/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
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

nid69ita

#3
Apr 18, 2013, 11:32 am Last Edit: Apr 18, 2013, 11:35 am by nid69ita Reason: 1
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: <A HREF="file.txt">file.txt</A>

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

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

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.
my name is IGOR, not AIGOR

gpb01

#4
Apr 18, 2013, 11:59 am Last Edit: Apr 18, 2013, 02:25 pm by gpb01 Reason: 1
... 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) ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita

@prisco credo debba spedire piccoli file testo
my name is IGOR, not AIGOR

francescoprisco

#6
Apr 18, 2013, 07:16 pm Last Edit: Apr 18, 2013, 08:18 pm by francescoprisco Reason: 1
Mi servirebbe il download.Il nome del file con la data odierna non è importante.

ho trovato qualcosa del genere ma non funziona

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

francescoprisco


PaoloP

No, non mi sono ancora cimentato con le SD, WebServer e dintorni.  :smiley-sweat:

nid69ita

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
my name is IGOR, not AIGOR

pablos71

#10
Apr 19, 2013, 11:24 am Last Edit: Apr 19, 2013, 11:29 am by pablos Reason: 1
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
Code: [Select]
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

"HTM*text/html"
"TXT*text/plain"
"CSS*text/css"
"XML*text/xml"
"JS*text/javascript"
"GIF*image/gif|"
"JPG*image/jpeg"
"PNG*image/png"
ecc
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

francescoprisco

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

Code: [Select]
              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><br /></br><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>"));
}

pablos71

#12
Apr 20, 2013, 08:18 pm Last Edit: Apr 20, 2013, 08:24 pm by pablos Reason: 1
Io ti ho mostrato come prendere un file da sd e inviarlo al browser quando richiesto, pensavo che questo fosse uno spunto.

Code: [Select]
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


Code: [Select]
"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
Code: [Select]
if(readString.indexOf("?download") >0)
quel readstring da dove arriva, se non metti tutte le parti è difficile per tutti noi dare un aiuto

ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Go Up