enc28J60 and Arduino (9)

luca 10/11/2012 69

After having published my previous tutorial, some users wrote me asking a way to send bigger images using Arduino and the ethernet shield.

The guys who develop EtherCard library are rewriting the way it handles TCP packets, in the meantime you can get around this problem including in your HTML page references to images hosted by other websites:

I wrote the following example for a user who asked a way to control a relay via Internet with a GUI optimized for smartphones.

Logical view

The example uses 3 elements: Arduino, Ethernet Shield and a relay module from eBay, connected to a PIN of Arduino:

The Ethernet Shield is connected to my home ADSL router, configured to NAT incoming connections to TCP port 80 to the IP address assigned to Arduino:

I can reach Arduino from Internet knowing the public IP my ISP gave to my connection or, better, using a dynamic DNS service (maybe keeping it updated using Arduino, as I explained here).

Web interface

The interface was kept intentionally simple: a label with the actual state and a button to switch relay on/off:

Tip for webmasters: with the following META tag you can adapt your webpage to the smartphone‘s display:

The icons I used come from Soft Scraps icon set by Jojo Mendoza, thanks for having released them free for non commercial use!

You can download two static example pages from Github.

Sketch

The sketch for Arduino draws on my previous examples; I changed the lines that prepare and send the HTML page:

The source code is as usual available on Github.

Demo

69 Comments »

  1. Daj 21/11/2012 at 16:23 - Reply

    hello,luca great tutorial. do you have tutorial on how to send data to visual basic using enc28j60? im planning to use tcp to send a string to visual basic via winsock but i dont have any reference in arduino code in sending data via tcp. .do you have tutorial for that? or do you have sample code for that. .thank you for your kind consideration Sir Luca.

    • luca 21/11/2012 at 18:01 - Reply

      Hello Daj,

      it’s a good idea… I’m going to write a tutorial about it: I think it will be in C# (as I know this better than VB) but you should be able to adapt it with few work!

  2. Daj 22/11/2012 at 01:25 - Reply

    Hello Luca,
    im so excited when will you post your next tutorial.Thanks a lot Luca. but im not good in c# so that i choose visual basic 6.0 . Luca,do you have sample codes on sending string data to visual basic via winsock. I used Enc28j60 and ethercard library but i dont know what are the function i will write. Thanks for the Help!! :)

  3. Antonio 04/12/2012 at 22:09 - Reply

    Ciao Luca sto cercando di configurare il NAT della porta 80 sul mio router della linkem HES-319M, ma ogni volta che provo ad entrare, mi risponde il router che è in ascolto su quella porta. Quello che volevo chiederti è se c’è un modo per cambiare la porta nello sketch (che per default è la 80, giusto????)
    Ciao e complimenti per tutto il lavoro, Antonio.

    • luca 05/12/2012 at 11:00 - Reply

      Ciao Antonio,

      lo sketch in realtà ascolta su qualsiasi porta… quindi prova tranquillamente a nattare un’altra porta e dovresti raggiungerlo!
      fammi sapere

  4. Antonio 06/12/2012 at 22:16 - Reply

    Ciao Luca :)
    Forse non mi sono spiegato molto bene…..
    La mia necessità è di fare in modo che Arduino si metta in ascolto su una porta diversa dalla 80 in quanto il mio router Linkem, ha la gestione remota impostata di default e non modificabile attiva e impostata sulla porta 80. Quindi quando provo ad accedere dall’esterno, devo necessariamente specificare una porta diversa dalla 80.
    Ho cercato molto in rete, ma senza risultato. Ho visto alcuni esempi di sketch in cui era specificato che il server http restasse in ascolto sulla porta 80, quindi deduco che si possa comunque cambiare.
    Sapresti indicarmi il o i comandi giusti?
    Grazie.

    • luca 07/12/2012 at 16:44 - Reply

      Ciao Antonio,

      ora ho capito ;) basta che nel tuo setup() metti qualcosa tipo:
      ether.hisport = 90;

      per mettere Arduino in ascolto sulla porta 90… fammi sapere se ti funziona!

  5. Antonio 10/12/2012 at 21:58 - Reply

    Ciao Luca, ho provato ad inserire la riga ether.hisport = 90; nel tuo sketch ma durante la compilazione mi dà errore.
    In realtà ho provato anche altri comandi come
    Server(port);
    EthernetServer(port); ma senza risolvere.

    L’unico sketch (trovato su internet), che mi permette di cambiare le porte, usa questo comando e queste librerie:

    static uint16_t port = 80;
    #include “etherShield.h”
    #include “ETHER_28J60.h”

    Io volevo usare il tuo sketch perchè si può personalizzare molto meglio cambiando l’immagine .png

    Ciao Antonio.

    • luca 11/12/2012 at 13:46 - Reply

      Ciao Antonio,

      strano, che errore ti da la chiamata ether.hisport? A me funziona correttamente (vedi articolo)

  6. Antonio 11/12/2012 at 19:25 - Reply

    Ciao Luca, questa è la risposta della compilazione:
    _9_WebRelay:7: error: expected constructor, destructor, or type conversion before ‘.’ token

    La riga ether.hisport = 31; la scrivo subito dopo
    static byte myip[] = {192,168,1,15};

    • luca 11/12/2012 at 20:10 - Reply

      ciao

      prova a metterla all’interno del setup()

  7. luigi 03/01/2013 at 22:36 - Reply

    Ciao Luca e complimenti per l’articolo ed il sito. Ho realizzato una presa comandata via web come nel tuo articolo con il relè, il problema e che vorrei inserire un bottone per accenderla fisicamente se non voglio usare il web. E’ fattibile?

    Grazie

    • luca 04/01/2013 at 10:48 - Reply

      Ciao Luigi,

      assolutamente sì, è molto semplice: all’interno del loop() controlli lo stato di un pulsante connesso ad Arduino (http://arduino.cc/en/tutorial/button) e se il pulsante è premuto, cambi lo stato del relè nello stesso modo in cui lo cambi quando ricevi via internet il comando.

  8. antonio 16/01/2013 at 22:09 - Reply

    Ciao Luca,
    ho letto con molto interesse i tuoi articoli,e mi interessa sapere il tuo parere sulla possibilita’ di tenere le immagini su una sdcard per poi richiamarle quando servono usando un apposito shield. Il mio dubbio e’ su come richiamarle con i comandi html.

    • luca 16/01/2013 at 22:16 - Reply

      Ciao Antonio,

      facendo così ricadi nel problema del buffer limitato in trasmissione… tu dovresti leggere con arduino i bytes dell’immagine dalla SD e poi inviarli al browser; se però l’immagine supera la dimensione del buffer (700 bytes circa) non puoi inviarla in un solo pacchetto e – al momento – la libreria Ethercard non supporta l’invio in più “frammenti”.

  9. antonio 18/01/2013 at 19:42 - Reply

    Grazie per la pronta risposta, continuerò le mie ricerche. Ciao

  10. Fabio Pulzi 06/04/2013 at 02:23 - Reply

    Hello Luca, great tutorial that you have here, for sure the best that I found on the web related with enc28j60.

    Now I have a question, Do you know if it`s possible to get a variable sent to arduino via GET ?, like you did with leds, but there you had just compared if it was on or off, I would like to really get the parameter value, maybe an integer

    Thanks in advance,
    Fabio

    • luca 08/04/2013 at 20:05 - Reply

      Hi Fabio!

      Of course you can: extract the “part” of the response that represents your value and convert it to integer value using atoi().

  11. Marco mussi 11/04/2013 at 09:43 - Reply

    Ciao , sto cercando di realizzare tramite arduino l’accendino e di una presa in remoto tramite wifi po’ potresti consigliare su come fare ?
    Grazie
    Marco mussi

    • luca 12/04/2013 at 21:26 - Reply

      Ciao Marco,

      puoi sfruttare uno shield wifi, oppure se vuoi “riciclare” il mio codice e utilizzare uno shield ethernet, puoi associarvi un router wifi in modalità client come spiegato qui.

  12. Lorenzo 21/07/2013 at 23:36 - Reply

    Ciao Luca,
    vorrei applicare questo codice per aprire una porta con una elettroserratura. Tutto funziona correttamente devo però interrompere manualmente l’impulso che apre la porta.
    Come posso trasformare la funzione on in un impulso di 1 secondo?
    Grazie mille pel l’entusiasmo con cui condividi la tua conoscenza

    • luca 14/08/2013 at 14:03 - Reply

      Ciao Lorenzo

      la cosa più semplice è modificare lo sketch così:

      if(strstr((char *)Ethernet::buffer + pos, "GET /?ON") != 0) {
      relayStatus = true;
      delay(1000);
      relayStatus = false;
      }

  13. Aakerberg 01/08/2013 at 12:54 - Reply

    Hi Luca, thanks for the great tutorials. Do you know why this webrelay code doesn’t work in the Iphone safari browser.?

    • luca 14/08/2013 at 14:00 - Reply

      Hi Aakerberg,

      unfortunately I don’t own an iPhone to test… which is the behaviour? Safari doesn’t display the webpage or – if you click – it does nothing?

  14. Marcelo 19/11/2013 at 20:02 - Reply

    How to use this example with a W5100 ethernet shield??

    byte Ethernet::buffer[700];
    Ethenet has not been declared

    • luca 19/11/2013 at 20:16 - Reply

      Sorry Marcelo but my examples do not work with W5100 shields… you need to check the official Arduino documentation for those.
      bye

  15. Lanfranco Schillaci 08/04/2014 at 11:50 - Reply

    Ciao vorrei collegare 1 relè alla ethernet shield mi puoi aiutare con uno schema?

    • luca 13/04/2014 at 19:37 - Reply

      Ciao Lanfranco! In questo articolo sto utilizzando una relay board già pronta ma collegare un relay a 5V ad Arduino è veramente semplice, ecco ad esempio un documento preso da Playground.

  16. Pierpaolo 02/05/2014 at 16:33 - Reply

    Ciao Luca, volendo gestire 4 relè con questo sitema utilizzando la stessaimmagine una sotto l’altra, è possibile?

    Grazie

    • luca 16/06/2014 at 08:25 - Reply

      Ciao! è possibile, guarda gli altri miei tutorial su come gestire più outputs.

  17. Zaharia 14/06/2014 at 09:28 - Reply

    Hy there, can you tell me please, how can i use this for more outputs ? I dont have module relay. I want to use digitaloutputs. Thank you!

  18. gennaro 14/08/2014 at 12:51 - Reply

    ciao luca ti posso chiedere un aiuto per il mio progetto

    • luca 15/08/2014 at 14:01 - Reply

      ciao gennaro, scrivimi pure anche in privato

  19. Fabio 23/08/2014 at 10:22 - Reply

    Ciao Luca,complimenti per il sito.
    Ho provato a smanettare con lo sketch di questo tutorial,ma quando a connettermi da smartphone (android e ios) ottengo la risposta pagina non disponibile,da pc invece funziona correttamente quindi la configurazionedel router è da escludere che non sia corretta.
    mi sapresti dare una dritta?
    Per curiosità ho provato a caricare lo sketch dei due led e quello funziona correttamente.
    Grazie per la tua attenzione.

    • luca 25/08/2014 at 07:57 - Reply

      Ciao Fabio, davvero strano: l’unica differenza è che questo sketch usa immagini su internet invece che “embedded”. Se nel browser dello smartphone inserisci direttamente l’url dell’immagine (es. http://www.lucadentella.it/files/bt_ON.png) le vedi?

  20. Danilo 25/08/2014 at 20:37 - Reply

    Ciao luca ho lo stesso problema di fabio come posso fare??
    grazie

    • luca 26/08/2014 at 07:34 - Reply

      ciao Danilo, domanda stupida: il cellulare è collegato alla rete wifi giusto?

  21. Danilo 27/08/2014 at 13:22 - Reply

    Ciao luca ho provato con un modem diverso e funziona il problema e del router tp link TL-WR841N

  22. Andrea 07/11/2014 at 19:29 - Reply

    Ciao Luca, una domanda.
    Tramite il pc, collegato tramite cavo ethernet alla rete, riesco a visualizzare la pagina web per accendere e spegnere la lampada. Ma se mi connetto non con il cavo ma con il wi fi alla stessa rete la pagina non si apre. Come mai? Cosa manca?
    Grazie e arrivederci.

    • luca 07/11/2014 at 20:01 - Reply

      ciao Andrea, davvero strano: quando sei in wifi il PING verso l’IP di Arduino ti funziona? Potrebbe essere attiva qualche configurazione particolare del tuo router/access point che blocca le comunicazioni tra rete cablata e rete wifi

  23. Andrea 09/11/2014 at 14:01 - Reply

    grazie per la risposta; purtroppo neanche il ping funziona e non ho particolari blocchi sul router per quanto riguarda le connessioni wi fi. Vedo però che controllando gli accessi dei dispositivi collegati con ethernet. manca l’ip del dispositivo. Per tua conoscenza il mio router è un netgear wndr4500, grazie.

  24. Roy 24/12/2014 at 03:51 - Reply

    Hello Luca,
    Thanks for your great tutorial.There is a question,as the hardware (that’s ENC28J60) continue to sent request to the web ,the light will be controlled as soon as the web reply.But now,is there a possibility that you can control the light directly in the way sending data/request to the hardware?I will appreciate your reply.Thank you!

    • luca 29/12/2014 at 10:51 - Reply

      Hi Roy! In this example Arduino publishes the webpage, it is NOT polling any website so as soon as you click on the image your browser sends a request to the hardware and it (the sketch running on it) reacts turning the light on/off.

  25. silvano 27/02/2015 at 12:48 - Reply

    ciao luca, complimenti per le spiegazioni.
    Il mio router Netgear DG834DG non riconosce indirizzi MAC strani, mettendone uno piu’ credibile tutto ok e ora funziona anche il DHCP.
    Si può cambiare il nome della periferica? Ora l’ ENC28J60 viene riconosciuto nella lista periferiche come UNKNOWN.
    Non riuscivo a cambiare porta di ingresso ad esempio 2222 ma funzionava solo su 80. Ora ho capito che bisogna mettere arduino in ascolto con: ether.hisport = 2222;
    ciao, grazie!

    • luca 27/02/2015 at 20:35 - Reply

      Ciao Silvano! purtroppo non si può cambiare il nome (che viene passato durante la richiesta DHCP) a meno di mettere mano direttamente alla libreria e riscrivere questa funzione.

  26. niq_ro 17/03/2015 at 07:18 - Reply

    Hi Luca,
    Your tutorials are very good.
    I try this sketch but I have a little problem: after few hours ENJ28J60 sleeps… I tried to use the RESET function and disconnect and reconnect the power of ENJ28J60, but does not work.. must use push RESET button from Arduino board..
    you have any idea how to fix it?

  27. niq_ro 18/03/2015 at 14:11 - Reply

    I found a (posibble) solution, using the watchdog like at https://hackaday.io/project/3731-open-z3zzvw3/log/12362-the-brain-of-the-thingy

  28. Gianni 07/09/2015 at 07:43 - Reply

    Salve Luca,
    complimenti per il tuo lavoro che metti a disposizione.
    Mi aiuteresti a capire cosa significa: a href=”/?$S”
    Ti ringrazio molto

    • luca 07/09/2015 at 07:57 - Reply

      Ciao Gianni, il $S viene sostituito dal valore della variabile linkLabel, quindi il link diventa /?ON o /?OFF a seconda del valore attuale del relay. Se vedi qualche riga sopra, tale link viene interpretato dallo sketch: if(strstr((char *)Ethernet::buffer + pos, "GET /?ON") != 0)

  29. Gianni 07/09/2015 at 16:20 - Reply

    Grazie sei chiaro! Quello che non riesco a capire dove è stato dichiarato la variabile $S? Se io avessi voluto chiamarla $pippo?
    Forse mi perdo in un bicchiere d’acqua…ma volevo capire.
    Ti ringrazio

  30. adeeb 18/10/2015 at 10:08 - Reply

    Hello.
    Thank you very much for your interesting tutorials for Enc28j60 ethernet module.
    Following this tutorial, I got stuck at the NAT part. Every time I enter my public IP address I get the login page of my orange livebox. Can you help me out please.
    Thanks.

    • luca 18/10/2015 at 12:30 - Reply

      Hi! Probably you must use a different port: port 80 could be “reserved” to the orange livebox webconsole and you cannot “NAT” it to an internal device.

      • adeeb 19/10/2015 at 15:38 - Reply

        Ok I read the next tutorial “enc28J60 and Arduino (10)” and changed the port from 80 to 90 and other numbers also. But everytime I am getting the login page of the livebox.
        I also tried on another modem, Orange ZTE, where I setup port forwarding. Still got the login page.
        Maybe I am doing something wrong when configuring. Can you send me your email address so that I can send you screenshots please.
        Thanks.

  31. adeeb 22/10/2015 at 15:07 - Reply

    Ok I read the next tutorial “enc28J60 and Arduino (10)” and changed the port from 80 to 90 and other numbers also. But everytime I am getting the login page of the livebox.
    I also tried on another modem, Orange ZTE, where I setup port forwarding. Still got the login page.
    Maybe I am doing something wrong when configuring. Can you send me your email address so that I can send you screenshots please.
    Thanks.

    • luca 24/10/2015 at 13:49 - Reply

      hi, I sent you and email…

      • adeeb 25/10/2015 at 11:12 - Reply

        Thanks a lot.
        Your assistance has been very helpful.

  32. mucis 28/12/2015 at 13:19 - Reply

    Mr.Luca, if you have a 4 channel relay sketch

  33. Alberto 03/03/2016 at 15:32 - Reply

    Ciao Luca e complimenti per il tuo ottimo lavoro.
    Sono abbastanza alle prime armi con la libreria ENC28J60 e ho grosse difficoltà a capire il metodo generale di utilizzo e il significato di alcuni comandi, non so se esiste una documentazione che spieghi esattamente la sintassi.
    Ad esempio non mi sono chiari:
    1) byte Ethernet::buffer[500];
    (non so nemmeno i due punti che significato hanno.. :-(
    2) bfill che nasce come bfill = ether.tcpOffset() … che cosa significa e come è che poi si utilizza nella forma bfill.qualcosa …

    Scusa magari sono cose troppo banali ma faccio fatica a ricondurle alle normali tecniche di programmazione su Arduino imparate fino ad ora…

    • luca 05/03/2016 at 14:17 - Reply

      Ciao Alberto! byte Ethernet::buffer[500]; crea una variabile (array) di 500 bytes mentre bfill è un “oggetto” di tipo BufferFiller… entrambi sono leggermente più complessi della programmazione classica su Arduino perché prevedono conoscenze di programmazione ad oggetti (C++).

  34. Nenad 11/04/2016 at 19:52 - Reply

    Ciao Luca,

    per caso Antonio ha risolto il problema con port=80?

    error: invalid conversion from ‘uint16_t {aka unsigned int}’ to ‘const uint8_t* {aka const unsigned char*}’ [-fpermissive]

    Grazie .

  35. Nenad 11/04/2016 at 20:19 - Reply

    Ciao Luca,

    ho risolto tutto, scusa e grazie 1000.

  36. Giuseppe 15/05/2016 at 09:49 - Reply

    Grandi Silvano e Luca , ho risolto … arduino non si collegava con un access point tplink via cavo … ed era l’indirizzo di mac che andava cambiato.

Leave A Response »

This website uses cookies to ensure you get the best experience on our website maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi