Pages: [1]   Go Down
Author Topic: Aiuto arduino ethernet server da sd  (Read 921 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ignoranzaGamer3500
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non hai cercato abbastanza, devi fare delle GET
http://arduino.cc/forum/index.php?topic=72204.0

ciao


Logged

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 22
View Profile
Get
 Bigger Bigger  Smaller Smaller  Reset Reset

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.



Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

* OFF.htm (190.52 KB - downloaded 27 times.)
* ON.htm (266.12 KB - downloaded 24 times.)
* index.htm (0.15 KB - downloaded 17 times.)
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

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

Logged

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
« Last Edit: January 12, 2013, 04:55:05 am by Gamer3500 » Logged

Pages: [1]   Go Up
Jump to: