problemi generali sito web con modulo ethernet

prima di tutto mi scuso per l’inconveniente del doppio post che ho fatto un mese fa, più o meno su questo argomento … ma oggi dopo numerosissime prove non sono riuscito a trovare una soluzione.

ho comprato il modulo ethernet per arduino enc28j60.
di librerie ne ho provate diciamo 3 in quest’ultimo mese e ogni sera provo a fare qualche esperimento ma sono sempre al punto di partenza e questo mi sta esaurendo … :sob:

ero partito con la libreria EtherCard…
questa libreria mi permetteva di fare il 90 % delle funzioni che mi servivano :
riuscivo a creare più pagine html con nomi diversi es.(arduino_ip/pagina1.html …)
inviare dei comandi tramite url es.(arduino_ip/spegni_led …)
ma non riuscivo a inserire variabili testuali nel codice html.

ho provato poi la libreria preinstallata che usa :
#include <SPI.h>
#include <Ethernet.h>
con questa riesco a creare un sito con variabili html
non riesco a ricevere pero indirizzi ip diversi da quella principale insomma crolla tutto se faccio arduino_ip/…
di conseguenza non riesco a creare più pagine e creare dei comandi passati da url
sopra tutto questa libreria riesco a usarla solo con la vecchia versione di arduino (0022 se non sparo cavolate) perché con quello più recente lo stesso codice non carica nulla sulla pagina.

l’ultime prove erano mirate ad webduino… :frowning:
a vista sembrava una buona libreria da come ne parlavano in internet ma compilando gli esempi mi da errori:

In file included from Web_HelloWorld.ino:5:
/Users/marco/Documents/Arduino/libraries/webduino/WebServer.h: In member function 'int WebServer::read()':
/Users/marco/Documents/Arduino/libraries/webduino/WebServer.h:647: error: ambiguous overload for 'operator==' in '((WebServer*)this)->WebServer::m_client == 0'
/Users/marco/Documents/Arduino/libraries/webduino/WebServer.h:647: note: candidates are: operator==(int, int) <built-in>
/Applications/Arduino new.app/Contents/Resources/Java/libraries/Ethernet/EthernetClient.h:27: note:                 virtual bool EthernetClient::operator==(const EthernetClient&)

ora vorrei chiedervi un disperato aiuto, che libreria mi consigliate di usare, e nel caso come posso risolvere i problemi ? potete darmi una mano se vi posto codice ? dico solo che la libreria strutturata meglio che ho trovato era quella di default in arduino poi mi affido a chi ne ha provate più di me . grazie e scusate

Io ti consiglio vivamente di abbandonare la ENC28J60 e prenderti la W5100 se non vuoi ulteriori grane.

Prima di tutto grazie ... Ho già proceduto a comprarne uno per prova cercherò di seguire il consiglio...

Volevo chiedere come mai pero avevo problemi sulla compilazione dell'esempio della libreria webduino dato che per compilarlo non e colpa del modulo se non co riesco ...

E poi al massimo vorrei gentilmente chiedervi un esempio che qualcuno ha provato e che funziona sicuramente al 100% per leggere le URL con la libreria ethernet tipo una cosa arduino-ip/pagina1?spegni.led2

Grazie

Se usi librerie vecchie poi su IDE vecchio, non credo risolverai molto. l'ENC è più recente (ma più scarso) del WIZ e quindi le prime librerie avevano problemi di gioventu.

Un tutorial su ENC in italiano: http://www.lucadentella.it/category/enc28j60-arduino/
Qui in inglese ma parla anche delle VARIE librerie per ENC:
http://www.tweaking4all.com/hardware/arduino/arduino-enc28j60-ethernet/

Volevo chiedere come mai pero avevo problemi sulla compilazione dell'esempio della libreria webduino dato che per compilarlo non e colpa del modulo se non co riesco ...

Perchè la webduino ha istruzioni destinate al wiznet, essendoci un altro chip al suo posto non c'è un dialogo corretto in più le librerie fanno a cazzotti.
ciao

pablos:
Perchè la webduino ha istruzioni destinati al wiznet, essendoci un altro chip al suo posto non c'è un dialogo corretto

grazie ma lo solo compilato (verificato) non ho programmato arduino

allora dopo altre numerose prove sono riuscito a far andare egregiamente bene la libreria UIPEthernet che era presente nel link di nid69ita grzie…

resta ancora qualche problema ma non so se riuscite ad aiutarmi a livello html …

del tipo ho creato un po di variabili quanti sono i codici html da inviare e una pagina index che richiama altre 3 sotto pagine con il metodo iframe, il problema e che una di queste ha una funzione post, che quando viene aggiornata e se presa singolarmente funziona altrimenti richiamata da index no…

MI SPIEGO “FORSE MEGLIO” → allora ho index che quando viene chiamata restituisco:

if(file == "index.html"){
              client.println("<iframe src=\"menu.html\" </iframe>");
  
              client.println("<iframe src=\"comando_tx.html\" </iframe>");
  
              client.println("<iframe src=\"comando_rx.html\" </iframe>");
  
          }

se io entro nel sito comando_tx c’è solo un campo di testo e un bottone che quando viene premuto ricarica la pagina con la variabile del from nella url… (POST) é per questo che voglio usare iframe perché mi permette di avere le 3 pagine indipendenti quindi se una sola vuole ricaricarsi per inviare i nuovi comandi con il campo post e le altre devono rimanere ferme tipo una pagina eventuale dove si ricevono delle ipotetiche variabili, non si deve ricaricare l’intera url e i post verrano inviati alle singole pagine- questo sembrerebbe un buon metodo , c’è solo il problema che se il post è troppo lungo la pagina ricaricata del comando_tx diventa vuota …

} else if(file == "comando_tx.html"){
              Serial.print(mioPOST);

              client.print("<form>");
              client.print("  <input type=\"text\" comando=\"tx\"></input>");
              client.print("  <input type=\"submit\" value=\"invia\"></input>");
              client.print("</form>");
              
          }

insomma sto cercando il modo di avere in una pagina principale composta da piu form ma che presi singolarmente vene ricaricata la singola sezione e non l’intera pagina… scusate se la domando vi sembra complessa o inutile ma sto davvero lottando per portare a termine una mia idea che una volta realizzata postero anche qui sul forum per migliorare la vita a molti …

scusate se posto ancora ma nel fra tempo mi è apparso un dubbio..

dato che quando avviene una richiesta url ad arduino io a ogni ciclo while della richiesta sommo a una variabile url la lettera della connessione ... esempio :

String url
while (client.connected()) 
    {
      if (client.available()) {
          char c = client.read();
          url = url + c
....

ho scoperto che forse è la stessa variabile che se la richiesta è troppo lunga tipo http://iparduino/paginaindex?POST_molto_lungo, risulta vuota o non presente ... purtroppo questo accade già con una decina di caratteri sulla url.

nel mio programma poi divido la variabile url in FILE come riportato sopra e POST che sono le due variabili che mi dicono che file e stato chiesto e che comandi sono stati passati..

può essere che la variabile che ho creato String non può contenere più di tot informazioni ?

Ti consiglio di leggere le note dell'articolo che ho sviluppato con Luca: http://www.lucadentella.it/2014/10/18/enc28j60-e-arduino-19/

Verifica che il buffer di lettura di Arduino non sia limitato. Nell'esempio ho dovuto aumentarlo a 120. Non esagerare troppo altrimenti saturi la memoria RAM di Arduino che è modesta utilizzando la ENC.

Se usi la W5100 inoltre hai anche la scheda SD dove salvare le pagine internet. Un tutorial molto dettagliato lo trovi qui: http://startingelectronics.com/tutorials/arduino/ethernet-shield-web-server-tutorial/

Inoltre per i client.print usa la funzione F() se non hai valori variabili.

Mille grazie per le risposte ho trovato delle soluzioni alle mie esigenze gentilissimi .. L'unica cosa non sono riuscito a usare la finzione F ma per ora sono più che soddisfatto ..
Avevo un altra domanda del tipo io per dare la possibilita al client di mandare i comandi ad Arduino uso il metodo post come già detto, solo che adesso avevo la necessita di inviare da cliant a server un qualcosa di più di un comando quindi un testo un po più lungo con tutti i caratteri quasi come un (file) perche se io voglio inviare caratteri strani sul post non posso farlo, tipo lo spazio si trasforma in %2 se non ricordo male (e soprattutto ho un problema che con URL più lunghe di un 80 caratteri la richiesta si spezza in 2 ma per ora accantonò questo problema ) quindi mi interessava usare uno di quei metodi che si usa spesso sui siti come carica il tuo file oppure un grande campo di testo dove scrivere tutto il testo che serve e Arduino lo riceve uguale in ascii
Grazie mille ancora il mio progetto a già una prima versione con le funzioni più basilari ma appena ho qualcosa di stabile ve lo potero :smiley:

PS..
Pensavo di aprire un altro post che se mi lasciate l'opportunità lo faccio anche subito per fare qualche domanda per creare una seconda idea geniale che mi era arrivata giocando con il modulo ethernet ...
Sono radioamatore da poco e sto facendo un corso di telegrafia CW la mia genialata era di creare un pulsante di telegrafia in ethernet vi parlo con più calma se volete

Per aggiungere la funzione F:
Trova n(" sostituisci tutto con n(F("
Trova t(" sostituisci tutto con t(F("
Trova "); sostituisci tutto con "));

Potresti dove aggiustare qualche riga.
Salva lo sketch prima di eseguire le sostituzioni.

Ciao paolo perdonami ma sono duro di comprendonio purtroppo.... Non ho capito dove devo sostituire.

Poi ormai che ci sono volevo chiedere come ovviare al "problema" che per ogni codice HTML devo sostituire le virgolette con /"

In ultima se c'è qualcuno che sa dirmi quali metodi posso usare per inviare "file" da client a server in alternativa al post mi farebbe un grosso favore.

AUGURI DI BUON NATALE A TUTTI VOI E ALLE VOSTRE FAMIGLIE