Go Down

Topic: Aiuto arduino ethernet server da sd (Read 1 time) previous topic - next topic

Gamer3500

E' da qualche tempo che guardo sulla mia ethernet shield per giocarci un po'.
Ho cercato su internet ma non ho trovato niente.

Ho creato un server html con arduino, quando vado sull' indirizzio IP, arduino mi rimanda subito alla pagina home.htm, contenente nella root dell' SD e da quella pagina poi vado, con collegamenti ipertestuali o immagini(tradotte in Base64 e inserite nelle pagine htm), in altre pagine del mio piccolo web server.
Vorrei trovare il modo (grazie per esempio a dei pulsanti) di riportare un valore sullo sketch di arduino in modo da poter controllare per esempio un' uscita, o mandare via seriale un messaggio.

lo sketch che uso in questo momento è questo:

Quote

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
 
#define maxLength 25
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 177 };
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };
File htmlFile;
EthernetServer server(80);
 
void setup()
{
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  if (!SD.begin(4)) { return; }
}
 
void loop()
{
  char* file_to_load = "home.htm";
  String inString = String(maxLength);
 
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (inString.length() < maxLength) {
          inString += c;
        }
        if (c == '\n' && currentLineIsBlank) {
          if (inString.indexOf(".htm") > -1) {
            String new_file_load;
            int rootIndex = inString.indexOf("/");
            new_file_load = inString.substring((rootIndex+1), (rootIndex+13));
 
            int endIndex = new_file_load.indexOf(" ");
            if (endIndex > -1) {
              new_file_load = new_file_load.substring(0, endIndex);
            }
            if (new_file_load != "")  {
              new_file_load.toCharArray(file_to_load,12);
            }
          }
 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
 
 
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}
 
void read_file( char* page_html, EthernetClient client )
{
  htmlFile = SD.open( page_html );
  if (htmlFile) {
    while (htmlFile.available()) {
        client.write(htmlFile.read());
    }
 
    htmlFile.close();
  }
}



Grazie 1000 e scusatemi per la mia ignoranza
[font=castellar]Gamer3500[/font]

pablos

no comment

Gamer3500

Per le GET ringrazio pablos, ma non ho ancora capito come fare sulla pagina html.
Mettiamo il caso che io crei un pulsante, dove lo mando?
In poche parole: riesco a ricevere i dati, ma non riesco inviarli dalla pagina.




Gamer3500

(ho cambiato sketch) ho provato in questo modo ma non funge:

Quote

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

int led=13;
const int pagina = 0;

const int SD_CS = 4;
const int ETHER_CS = 10;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 177 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };
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);
      const char* filename = pagina;
      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, gateway, subnet);
  web.begin();
  Serial << F("Ready to accept HTTP requests.\n");
  
  pinMode(led, OUTPUT);
}

void loop()
{  
    web.process();
    
    if ( pagina == "ON.HTM" ){
      digitalWrite(led, HIGH);
    }
    else{
      digitalWrite(led, LOW);
    }
}



P.S= questo sketch è di pablos, lo ho trovato in un topic

non capisco cosa non va, forse nella const char* sotto il serial print che manda sulla seriale la pagina richiesta dal client.



ho allegato anche i file htm che uso( l' index è solo un redirect per andarte alla pagina off, ma invece che modificare lo sketch ho usato questa via)

pablos

Probabilmente quel link che hai trovato è del 2011 e avevo fatto delle prove con la 0022, dalla 1.0 in poi ci sono delle modifiche da fare, comunque di solito quando non allego file al post metto un link di riferimento per trovare la fonte.
Quei pulsantoni enormi non sono miei :)

Quote
non capisco cosa non va

Certo che non va manca tutta la parte javascript/json/ajax sulla pagina htm
Se sei alle prime armi hai scelto la cosa più complicata che potevi trovare.

Però se proprio vuoi sbatterti, da qualche parte dovrai incominciare, quindi quell'esempio che avevo fatto si basava su una parte prelevata da questo progetto, http://www.webweavertech.com/ovidiu/weblog/archives/000484.html ci sono 3-4  pagine, i download e spiegazioni varie. Da qualche parte mi pareva di aver visto gli aggiornamenti per la 1.0 in poi di quella libreria

ciao

no comment

Gamer3500

#5
Jan 11, 2013, 08:48 pm Last Edit: Jan 12, 2013, 10:55 am by Gamer3500 Reason: 1
i pulsantoni perchè erano la prima immagine che avevo a portata di mano.

mi pareva di aver letto da qualche parte che i javascript non funzionassero su arduino ethernet, evidentemente mi sbagliavo, stavo cercando una soluzione mentre ce l' avevo sotto al naso...

Go Up