Pages: 1 [2]   Go Down
Author Topic: Problemi trasmissione Ethernet schield e web server  (Read 1928 times)
0 Members and 1 Guest are viewing this topic.
Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2747
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Certo che si può fare, con quella libreria che tra l'altro è stata corretta per la 1.0 puoi fare tutto quello che vuoi. Restano solo i limiti di velocità di arduino quindi non dargli files troppo pesanti da caricare. Se vuoi utilizzare altri browser devi usare nel js il json invece che ajax.
Quindi ti consiglio di far girare l'esempio originale e poi andare a modificarlo cercando di capire come funziona, tutto questo se hai un po' di esperienza js e html altrimenti ti butti in una cosa molto complicata.

ciao
« Last Edit: June 16, 2012, 06:35:29 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora, con  questo sketch
Code:
// -*- c++ -*-
//
// Copyright 2010 Ovidiu Predescu <ovidiu@gmail.com>
// Date: December 2010
//

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

// The LED attached in PIN 13 on an Arduino board.
const int ledPin = 7;

// The initial state of the LED
int ledState = LOW;

void setLedEnabled(boolean state) {
  ledState = state;
  digitalWrite(ledPin, ledState);
}

inline boolean getLedState() { return ledState; }

boolean file_handler(TinyWebServer& web_server);
boolean blink_led_handler(TinyWebServer& web_server);
boolean led_status_handler(TinyWebServer& web_server);
boolean index_handler(TinyWebServer& web_server);

TinyWebServer::PathHandler handlers[] = {
  // Work around Arduino's IDE preprocessor bug in handling /* inside
  // strings.
  //
  // `put_handler' is defined in TinyWebServer
  {"/", TinyWebServer::GET, &index_handler },
  {"/upload/" "*", TinyWebServer::PUT, &TinyWebPutHandler::put_handler },
  {"/blinkled", TinyWebServer::POST, &blink_led_handler },
  {"/ledstatus" "*", TinyWebServer::GET, &led_status_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;

static uint8_t mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x8B, 0xD2 };

// Don't forget to modify the IP to an available one on your home network
byte ip[]  = { 192,168,1,115 };                  // IP-Adresse

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 blink_led_handler(TinyWebServer& web_server) {
  web_server.send_error_code(200);
  web_server.send_content_type("text/plain");
  web_server.end_headers();
  // Reverse the state of the LED.
  setLedEnabled(!getLedState());
  Client& client = web_server.get_client();
  if (client.available()) {
    char ch = (char)client.read();
    if (ch == '0') {
      setLedEnabled(false);
    } else if (ch == '1') {
      setLedEnabled(true);
    }
  }
}

boolean led_status_handler(TinyWebServer& web_server) {
  web_server.send_error_code(200);
  web_server.send_content_type("text/plain");
  web_server.end_headers();
  Client& client = web_server.get_client();
  client.println(getLedState(), DEC);
}

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

void file_uploader_handler(TinyWebServer& web_server,
    TinyWebPutHandler::PutAction action,
    char* buffer, int size) {
  static uint32_t start_time;
  static uint32_t total_size;

  switch (action) {
  case TinyWebPutHandler::START:
    start_time = millis();
    total_size = 0;
    if (!file.isOpen()) {
      // File is not opened, create it. First obtain the desired name
      // from the request path.
      char* fname = web_server.get_file_from_path(web_server.get_path());
      if (fname) {
Serial << F("Creating ") << fname << "\n";
file.open(&root, fname, O_CREAT | O_WRITE | O_TRUNC);
free(fname);
      }
    }
    break;

  case TinyWebPutHandler::WRITE:
    if (file.isOpen()) {
      file.write(buffer, size);
      total_size += size;
    }
    break;

  case TinyWebPutHandler::END:
    file.sync();
    Serial << F("Wrote ") << file.fileSize() << F(" bytes in ")
    << millis() - start_time << F(" millis (received ")
           << total_size << F(" bytes)\n");
    file.close();
  }
}

void setup() {
  Serial.begin(115200);
  Serial << F("Free RAM: ") << FreeRam() << "\n";

  pinMode(ledPin, OUTPUT);
  setLedEnabled(false);

  // initialize the SD card
  Serial << F("Setting up SD card...\n");
  pinMode(10, OUTPUT); // set the SS pin as an output (necessary!)
  digitalWrite(10, HIGH); // but turn off the W5100 chip!
  if (!card.init(SPI_FULL_SPEED, 4)) {
    Serial << F("card failed\n");
    has_filesystem = false;
  }
  // initialize a FAT volume
  if (!volume.init(&card)) {
    Serial << F("vol.init failed!\n");
    has_filesystem = false;
  }
  if (!root.openRoot(&volume)) {
    Serial << F("openRoot failed");
    has_filesystem = false;
  }

  if (has_filesystem) {
    // Assign our function to `upload_handler_fn'.
    TinyWebPutHandler::put_handler_fn = file_uploader_handler;
  }

  Serial << F("Setting up the Ethernet card...\n");
  Ethernet.begin(mac, ip);

  // Start the web server.
  Serial << F("Web server starting...\n");
  web.begin();

  Serial << F("Ready to accept HTTP requests.\n");
}

void loop() {
  if (has_filesystem) {
    web.process();
  }
}
che ho trovato qui in un 3d sul forum, non riesco a compilarlo, mi dice che la libreria SDfat.h non è presente( no such file or directory) quando invece è presente nella cartella di librerie di arduino... come posso fare? devo per forza usare il tiny per fare quello che mi serve? perchè siccome devo finire il lavoro entro domani mattina preferirei utilizzare qualcosa di più semplice che so già
Grazie
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2747
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

infatti non si usa più quella lib per la SD quello sketch non è .ino
qui trovi i file per la 1.0 https://github.com/Hardcore-fs/TinyWebServer/zipball/master

impossibile finire per domani, non trovi pezzi già fatti con pulsanti come vuoi tu su questo tipo di lib, c'è pochissimo in giro proprio perchè ci vuole molto tempo per comprendere e modificarle
guarda anche questo treath però è sulla vecchia IDE
http://arduino.cc/forum/index.php/topic,63747.0.html
« Last Edit: June 16, 2012, 07:02:16 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho usato quella, ho fatto una prova con il file Blinked, però mi dice che non può trovare il file html quando clicco nel link... io ho messo una pagina html chiamata form.html nella SD e nel file index ho messo un link che dovrebbe aprirmi il form.html ( classico con href) ... devo metterlo in qualche luogo specifico?
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2747
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La SD va formattata in fat16, i file hanno estensioni a 3 lettere essendo in fat 16 .... quindi si deve chiamare xxxxxx.htm e i nomi dei file non devono superare gli 8 caratteri, non sei su win 7 smiley
« Last Edit: June 16, 2012, 07:07:29 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Capito, ora funziona smiley-grin
Siccome per gestire luci e sensori vari ho già uno sketch molto pesante, dello sketch blinked cosa posso prendere solo per permettere l'apertura dei file html ( perchè se unisco i due scketch non mi stanno sulla flash)?
ultima cosa, con il tiny per accendere le luci ( ovvero passare la variabile da 1 a 0 come posso fare, solo con il GET?
Grazie mille, se riesco a finire sta sera ti offro una cena! smiley
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2747
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il punto focale dove ti devi concetrare (parliamo della tinywebserver) sono in queste parti

TinyWebServer::PathHandler handlers[] = {
  {"/", TinyWebServer::GET, &index_handler },
  {"/blinkled", TinyWebServer::POST, &blink_led_handler },     //<<<<<<<<<<<<<<<<<<< questa
  {"/ledstatus" "*", TinyWebServer::GET, &led_status_handler }, //<<<<<<<<<<<<<<<<<<< questa
  {"/" "*", TinyWebServer::GET, &file_handler },
  {NULL},
};

avvengono solo 2 cose in questo sketch quando ha terminato di inviare i file richiesti:
-----------------------------------(1)-------------------------------------------------------------------
{"/ledstatus" "*", TinyWebServer::GET, &led_status_handler } che ti rimanda a questa funzione qui sotto
arduino invia tramite il path http://192.168.1.xxx/ledstatus?xxxx  client.println(getLedState(), DEC); gli invia il suo stato
la parte js che è sulla pagina provvede a leggere il messaggio ed eseguire sulla pag web quello che deve visualizzare

boolean led_status_handler(TinyWebServer& web_server) {
  web_server.send_error_code(200);
  web_server.send_content_type("text/plain");
  web_server.end_headers();
  Client& client = web_server.get_client();
  client.println(getLedState(), DEC);
}

-----------------------------------(2)-------------------------------------------------------------------
{"/blinkled", TinyWebServer::POST, &blink_led_handler },
Qui lo sketch legge tutto quello che il tuo browser gli manda usando un prefisso /blinkled ed esegue quello che vuoi, quindi è qui che devi agire per leggere i messaggi che mandi dal browser.

boolean blink_led_handler(TinyWebServer& web_server) {
  web_server.send_error_code(200);
  web_server.send_content_type("text/plain");
  web_server.end_headers();
  // Reverse the state of the LED.
  setLedEnabled(!getLedState());
  Client& client = web_server.get_client();
  if (client.available()) {
    char ch = (char)client.read(); //questo client.read è quello che alla fine trovi in tutti gli esempi ethernet
    if (ch == '0') {
      setLedEnabled(false);
    } else if (ch == '1') {
      setLedEnabled(true);
    }
  }
}
 
in definitiva:
1) quando vuoi che sia arduino a inviare qualcosa al browser devi usare boolean led_status_handler(TinyWebServer& web_server)
2) quando vuoi che sia arduino a ricevere qualcosa dal browser devi usare boolean blink_led_handler(TinyWebServer& web_server)
Chiaramente l'altra metà del lavoro lo devi fare dalla parte client
« Last Edit: June 16, 2012, 08:29:04 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, grazie mille, ultima cosa, per parte client intendi il sito in html?
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2747
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, grazie mille, ultima cosa, per parte client intendi il sito in html?
si
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok allora provo e ti dico smiley grazie mille ancora! smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, alla fine ho optato per una soluzione più semplice dato il tempo a disposizione ridotto...
in pratica faccio stampare tutto dall'arduino, senza usare la SD ( se non per salvare dei log delle temperature dei sensori).
Il problema mi rimane nell'accensione dei led. I led sono pilotati da un secondo arduino, che comunica con il primo in seriale, ed io vorrei accenderli premendo un link o un pulsante sul web ed ovviamente spegnerli.. per farlo devo cambiare la variabile da 0 a 1 e viceversa, ma come posso fare?
Con il seguente sketch ottengo un errore nel sito ( mi viene in loop) e quando premo accendi  mi interrompe completamente la trasmissione... mi chiedo perchè dato che lo sketch solo per accendere le luci mi funziona...
Grazie
Code:
#include <dht.h>
#include <SD.h>
#include <Ethernet.h>
#include <Server.h>
#include <Client.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x8B, 0xD2 };
byte ip[] = { 192,168,1,115 };
File htmlFile;
EthernetServer server(80);
String light;

dht DHT;

#define DHT22_PIN 2
const int chipSelect = 4;
int room1=1;
int room2=1;
int room3=1;
int room4=1;
int room5=1;
int room6=1;
int room7=1;
int room8=1;
int room9=1;
int t=2;
int i=0;
int lm1;
int lm2;
int v_sharp;
int distanza;
int step_misura;
int misura1;
int misura2;
int misura3;
int totale;
int tx;
double acqisiz_t_pt;
double acqisiz_t_p1;
double temp_pt;
double temp_p1;
double HUM;
double TEMP;
double ext;
void setup (){

  //Avvio la connessione al server
  Ethernet.begin(mac, ip);
  server.begin();
 
  light = String("");

  pinMode (A0,INPUT);
  pinMode (A1,INPUT);
  pinMode (A2,INPUT);
  pinMode(10, OUTPUT);
  Serial.begin (115200);
  step_misura = 1;
 
   if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
 
}

void dht22()
{
  int chk = DHT.read22(DHT22_PIN);
  HUM = DHT.humidity;
  TEMP= DHT.temperature;
}
 
void sharp(){
  v_sharp = analogRead (A2);
  distanza= 2076/(v_sharp-11);
}

void visualizz(){
  Serial.print (temp_pt);
  Serial.print ("  ");
  Serial.print (temp_p1);
  Serial.print ("  ");
  Serial.println (totale);
  Serial.print("H ");
  Serial.print(HUM);
  Serial.print("  T ");
  Serial.println(TEMP);
}

void loop (){
   tx = ((1 * 10) + room1);
  Serial.write (tx);
  delay (t);
  tx = ((2 * 10) + room2);
  Serial.write (tx);
  delay (t);
  tx = ((3 * 10) + room3);
  Serial.write (tx);
  delay (t);
  tx = ((4 * 10) + room4);
  Serial.write (tx);
  delay (t);
  tx = ((5 * 10) + room5);
  Serial.write (tx);
  delay (t);
  tx = ((6 * 10) + room6);
  Serial.write (tx);
  delay (t);
  tx = ((7 * 10) + room7);
  Serial.write (tx);
  delay (t);
  tx = ((20 * 10) + room8);
  Serial.write (tx);
  delay (t);
  tx = ((17 * 10) + room9);
  Serial.write (tx);
  delay (t);
 
  boolean currentLineIsBlank = true;
  acqisiz_t_pt = analogRead (A0);
  acqisiz_t_p1 = analogRead (A1);
  temp_pt = (acqisiz_t_pt /17.05);
  temp_p1 = (acqisiz_t_p1 /17.05);
  TEMP = ext;
 
  if (step_misura == 3) {
    sharp();
    misura3 = v_sharp;
    step_misura = 1;
    totale = misura1 + misura2 + misura3;
      if (totale > 800) {
      digitalWrite (13,1);
    }
  }
  if (step_misura == 2) {
    sharp();
    misura2 = v_sharp;
    step_misura = 3;
  }
  if (step_misura == 1) {
    sharp();
    misura1 = v_sharp;
    step_misura = 2;
  }

if (i==50){
  dht22();
  visualizz();
  i=0;
}
i++;
// Prendo le temperature del primo sensore e le salvo in un LOG nella SD
 File a = SD.open("Temp1.txt", FILE_WRITE);
  if (a) {
    a.println(temp_pt);
    a.close();
  } 
  else {
    Serial.println("error opening Temp1.");
  }
//FILEb 
  File b = SD.open("Temp2.txt", FILE_WRITE);
   if (b) {
    b.println( temp_p1);
    b.close();
  } 
  else {
    Serial.println("error opening Temp2.htm");
  }
//FILE c
  File c = SD.open("HUM.txt", FILE_WRITE);
  if (c) {
    c.println(HUM);
    c.close();
  } 
  else {
    Serial.println("error opening HUM.htm");
  }
//FILE d 
  File d = SD.open("TempEXT.htm", FILE_WRITE);
  if (d) {
    d.println(ext);
    d.close();
  } 
  else {
    Serial.println("error opening TempEXT.htm");
  }
//Gestisco il sito HTML che il Client andrà a costruire

EthernetClient client= server.available(); //metto in ascolto per client che si vogliono connettere
  //controllo se ci sono client che intendono connettersi
  if(client){
    while(client.connected()){
      //controllo che il client sia disponibile
      while(client.available()){
        char c = client.read(); //leggo cio' che mi arriva al client
 light.concat(c);       
    if (c == '\n') {   
 
//Definisco la costruzione HTML

     client.println("HTTP/1.1 200 OK"); //standard html
        client.println("Content-Type: text/html");
        client.println();
        client.print("Sensore Temperatura piano terra:");   
        client.print(temp_pt);
        client.print("Sensore Temperatura primo piano:");   
        client.print(temp_p1);
        client.print("Sensore Temperatura Umidità esterna:");   
        client.print(HUM);
        client.print("Sensore Temperatura esterna:");   
        client.print(TEMP);
       
 if (light.indexOf("accendi") > 0) {
room1=1;
client.print("Accendo<br/>");
    }
    if (light.indexOf("spegni") > 0) {
room1=0;
client.print("Spengo<br/>");
    }
   client.print("<a href='/accendi'>Accendi LED</a><br/><a href='/spegni'>Spegni LED</a><br/>");
   client.print("<pre>");//DEBUG
    client.print(light);// DEBUG
    client.print("</pre>");//DEBUG
    break;
   

   
    }
      }
    }
     
        delay(1);
        client.stop();
        light = String("");


delay(5);
  }
}   
Logged

Pages: 1 [2]   Go Up
Jump to: