web server su SD card

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

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

Codificare una immagine non credo ci voglia molto
Mi invio un messaggio in HTML con allegata l'immagine
Una volta arrivato apro le proprieta' del messaggio e vado a vederlo in originale
In coda mi trovo un codice dichiarato in base64

Chiaramente copiare ed incollare e' semplice
Ci vuole un WebMaster che spieghi come visulizzare in posizione opportuna quel codice

Vediamo se c'e' un lettore pratico di queste cose che ce lo spiega
Ovviamente un grazie anticipato

brunol949:
Vediamo se c'e' un lettore pratico di queste cose che ce lo spiega

Non so se si e' capito ma sono peggio di un "cane rabbioso" :grin: quando attacco i denti non mollo

La soluzione e' tutta qui
http://blogs.ugidotnet.org/Nick60/archive/2010/06/20/incorporare-una-immagine-in-un-tag-html.aspx

Oltre al sistema suggerito si puo' usare questo ; che ho usato io
Il sistema della mail non funziona :drooling_face:
http://www.motobit.com/util/base64-decoder-encoder.asp

Spero possa tornare utile

Assolutamente impeccabile !
Grazie Bruno !!

Non sono un espertone , non conoscevo neanche la codifica in Base64 ma i link sono chiarissimi.
In serata ( ora devo purtroppo uscire ) farò delle prove....

Solo una domandina ( non riesco ad attendere fino a questa sera ) : posso convertire qualunque immagine in Base64 ? o ci sono limiti di grandezza e formato ?

Grazie ancora ciao

babbuino, e anche qualcun altro, hanno messo delle piccole gif nel codice (a memoria)..

prog_char string_8[] PROGMEM = "<img src='data:image/gif;base64,R0lGODlhEAAQALMAABgDBKyqrHV2dZUCBOnf3X8CBPsCBCIhIvwWFPz9/L27vfbu7BUSE/kSFPwgILS1tCH5BAAAAAAALAAAAAAQABAAAwR5MEnJqp04sSO6eM/BZFwHnECgKMfEmEAjG6c6JhxgOEtCNAYaS2Pi+YDB1KMiiPUIjmCwAFAwY76odEAliJoNAkIa5AK8jIAOuTUvRA812TAwE944ha5cL1DxGgpqAH5+JwQaEwcrgwAMdzgZGysElW83GRobB5wZEQA7'/>";
prog_char string_9[] PROGMEM = "<img src=data:image/gif;base64,R0lGODlhEAAQAKIAAP////f398DAwICAgAAAAAAAAAAAAAAAACwAAAAAEAAQAAADTRiq1L4wtEGHEC2S6sjFyzY0H+aB0ngB7OcRqcoC5Tl5cymot9CWFAKgR9MFhy/dhYO8nD7MoQQDrYykU5O1wYIxXI6ZN3SaISPkTiQBADs= alt=Spento ></td><td>";

potete provarlo in una semplice pagina html

Qui trovate tutto il treadh, il codice l'ho copiato dal reply 11
http://arduino.cc/forum/index.php/topic,85172.0.html

Sempre dallo stesso treadh scrivono che per caricare un'immagine da sd si fa così:

client.println("<IMG>\"pippo.jpg\"</IMG>);

ora non ho arduini sottomano da provare...

Ma perchè convertire in base64 l'immagine ?? ci carico anche i messaggi vocali mp3 da SD dovrei codificare anche quelli allora.
La codifica succhia comunque un botto di memoria secondo me è un ripiego per farlo funzionare lo stesso

ciao

maxvetro:
Solo una domandina ( non riesco ad attendere fino a questa sera ) : posso convertire qualunque immagine in Base64 ? o ci sono limiti di grandezza e formato ?

Puoi solo convertire piccolissime gif, queste vengono caricare in memoria e gli arduini di certo non ne abbondano

http://www.arduino.cc/playground/Learning/Memory qui un po' di info

Da SD invece hai meno limiti, uso delle immagini da 30/40Kb senza problemi (sto usando la libreria webserverSD)

Ho modificato il prog origininale del tinyweb questo ti permette di caricare su browser qualsiasi file e qualsiasi dimensione
presente su sd, sul serial monitor vedi i file che la pag htm sta caricando

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

const int SD_CS = 4;
const int ETHER_CS = 10;
byte ip[] = { 192, 168, 2, 177 };
static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
boolean file_handler(TinyWebServer& web_server);
boolean index_handler(TinyWebServer& web_server);

TinyWebServer::PathHandler handlers[] = {
  {"/", TinyWebServer::GET, &index_handler },
  {"/" "*", TinyWebServer::GET, &file_handler },
  {NULL},
};

const char* headers[] = {"Content-Length",NULL};
TinyWebServer web = TinyWebServer(handlers, headers);

boolean has_filesystem = true;
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

void send_file_name(TinyWebServer& web_server, const char* filename) {
  if (!filename) {
    web_server.send_error_code(404);
    web_server << F("Could not parse URL");
  } else {
    TinyWebServer::MimeType mime_type = TinyWebServer::get_mime_type_from_filename(filename);
    web_server.send_error_code(200);
    web_server.send_content_type(mime_type);
    web_server.end_headers();
    if (file.open(&root, filename, O_READ)) 
    {
      Serial << F("Read file "); Serial.println(filename);
      web_server.send_file(file);
      file.close();
    } else {
      web_server << F("Could not find file: ") << filename << "\n";
    }
  }
}

boolean file_handler(TinyWebServer& web_server) {
  char* filename = TinyWebServer::get_file_from_path(web_server.get_path());
  send_file_name(web_server, filename);
  free(filename);
  return true;
}

boolean index_handler(TinyWebServer& web_server) {
  send_file_name(web_server, "INDEX.HTM");
  return true;
}

void setup() {
  Serial.begin(9600);
  pinMode(SS_PIN, OUTPUT);	// set the SS pin as an output                                
  digitalWrite(SS_PIN, HIGH);	// and ensure SS is high
  pinMode(ETHER_CS, OUTPUT); 	// Set the CS pin as an output
  digitalWrite(ETHER_CS, HIGH); // Turn off the W5100 chip! (wait for                              
  pinMode(SD_CS, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(SD_CS, HIGH); 	// Turn off the SD card! (wait for
                               
  card.init(SPI_FULL_SPEED, SD_CS); 
  volume.init(&card);  
  root.openRoot(&volume); 
  Ethernet.begin(mac, ip);
  web.begin();
  Serial << F("Ready to accept HTTP requests.\n");
}

void loop() 
{  
    web.process();
}

maxvetro:
Solo una domandina ( non riesco ad attendere fino a questa sera ) : posso convertire qualunque immagine in Base64 ? o ci sono limiti di grandezza e formato ?

Per la conversione non credo
Tieni presente che poi l'immagine sara' parte integrante del file html

pablos:
Ho modificato il prog origininale del tinyweb

#include <Flash.h>

Ma la libreria flash a cosa serve ?
Ovviamente se l'intenzione e' quella di mettere tutto su SD

Grazie

Ma la libreria flash a cosa serve ?
Ovviamente se l'intenzione e' quella di mettere tutto su SD

Grazie

la flash.h gestisce le stringhe caricandole su flash e non su Sram che poi è diventata funzione F()

char c = (this);*

  • if (!c) break;*
  • stream.print(c); // print in char form*

pablos:
la flash.h gestisce le stringhe e gli operatori

char c = (this);*

  • if (!c) break;*
  • stream.print(c); // print in char form*
    [/quote]
    Ma un uso intensivo non portera' alla distruzione della flash ??
    Sempreche' serva a scrivere in flash e non sia un nome di comodo

Scusate ma ho avuto un impiccio con l'ivi o delle risposte..

PABLOS sto testando il tinyweb da te modificato

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

const int SD_CS = 4;
const int ETHER_CS = 10;
byte ip[] = { 192, 168, 2, 177 };
static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
boolean file_handler(TinyWebServer& web_server);
boolean index_handler(TinyWebServer& web_server);

TinyWebServer::PathHandler handlers[] = {
  {"/", TinyWebServer::GET, &index_handler },
  {"/" "*", TinyWebServer::GET, &file_handler },
  {NULL},
};

const char* headers[] = {"Content-Length",NULL};
TinyWebServer web = TinyWebServer(handlers, headers);

boolean has_filesystem = true;
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

void send_file_name(TinyWebServer& web_server, const char* filename) {
  if (!filename) {
    web_server.send_error_code(404);
    web_server << F("Could not parse URL");
  } else {
    TinyWebServer::MimeType mime_type = TinyWebServer::get_mime_type_from_filename(filename);
    web_server.send_error_code(200);
    web_server.send_content_type(mime_type);
    web_server.end_headers();
    if (file.open(&root, filename, O_READ)) 
    {
      Serial << F("Read file "); Serial.println(filename);
      web_server.send_file(file);
      file.close();
    } else {
      web_server << F("Could not find file: ") << filename << "\n";
    }
  }
}

boolean file_handler(TinyWebServer& web_server) {
  char* filename = TinyWebServer::get_file_from_path(web_server.get_path());
  send_file_name(web_server, filename);
  free(filename);
  return true;
}

boolean index_handler(TinyWebServer& web_server) {
  send_file_name(web_server, "INDEX.HTM");
  return true;
}

void setup() {
  Serial.begin(9600);
  pinMode(SS_PIN, OUTPUT);	// set the SS pin as an output                                
  digitalWrite(SS_PIN, HIGH);	// and ensure SS is high
  pinMode(ETHER_CS, OUTPUT); 	// Set the CS pin as an output
  digitalWrite(ETHER_CS, HIGH); // Turn off the W5100 chip! (wait for                              
  pinMode(SD_CS, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(SD_CS, HIGH); 	// Turn off the SD card! (wait for
                               
  card.init(SPI_FULL_SPEED, SD_CS); 
  volume.init(&card);  
  root.openRoot(&volume); 
  Ethernet.begin(mac, ip);
  web.begin();
  Serial << F("Ready to accept HTTP requests.\n");
}

void loop() 
{  
    web.process();
}

e sembra essere tutto funzionante , ora continuo a giocare ...

grazie