MobileRelays – enc28J60 e Arduino (21)

luca 12/05/2015 42

Il progetto di oggi, sempre basato sul modulo ethernet enc28j60, consente di attivare dei relays (o in generale i PIN digitali di Arduino) tramite una pagina web responsive, ovvero che si adatta a differenti dispositivi (es. degli smartphones).

Video presentazione

Questa volta ho registrato il video in inglese, sono comunque disponibili i sottotitoli in italiano…

Sito web

Il sito web, memorizzato su una scheda SD e pubblicato da Arduino (come già visto nell’esempio SDWebServer), è stato realizzato utilizzando le seguenti librerie:

ed è composto da una sola pagina, con due interruttori per attivare/disattivare altrettante uscite (in seguito vedremo come modificare il numero e i PIN utilizzati):

mobilerelays-1

Le pagine e le risorse esterne (javascript e CSS) che compongono il sito sono disponibili su Github e devono essere salvate nella root della scheda SD.

Sketch

Lo sketch è molto simile a quello del progetto SDWebServer ed è disponibile su Github.

All’interno del loop(), lo sketch riceve le richieste provenienti dal browser:

char* request = (char *)Ethernet::buffer + pos;

La richiesta può riguardare una risorsa statica (pagina HTML, javascript…): in questo caso lo sketch la cerca nella root della scheda SD e la restituisce al browser.

Se invece la richiesta è relativa alla pagina switch.ino, lo sketch interpreta i parametri di tale richiesta:

else if(strncmp("GET /switch.ino?", request, 16) == 0) {  
  int relayId = request[16] - '0';
  int relayStatus = request[18] - '0';

e cambia di conseguenza lo stato del PIN:

if(relayStatus == 0) digitalWrite(relayId, LOW);
else digitalWrite(relayId, HIGH);

La richiesta infatti ha la forma: switch.ino?relayId|relayStatusSe ad esempio voglio attivare il relay collegato al PIN 4, dovrò inviare ad Arduino switch.ino?4|1

Infine restituisce un messaggio di OK al browser:

BufferFiller bfill = ether.tcpOffset();
bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n
  Pragma: no-cache\r\n\r\n" "OK"));

AJAX

Le richieste di cambio stato dei relay vengono inviate ad Arduino dal browser tramite chiamate AJAX grazie alla libreria jQuery. Quando si preme un pulsante, viene scatenato un evento che formatta ed invia la richiesta:

mr-2

E’ il codice javascript inserito nella pagina HTML che cerca tutti i controlli di tipo select (i “pulsanti”) e configura tale event handler:

$(document).ready(function() {
 
  // search for all the select elements and associate the event handler
  $("select").each(function(index) {
    // event handler, call the page to change the relay status
    $(this).change(function() {
      var selectElement = $(this);
      var relayNumber = selectElement.attr("name");
      var relayStatus = selectElement.val();
      var parameters = relayNumber + "|" + relayStatus;
 
      $.get("switch.ino?" + parameters, function() { console.log("Call OK :)"); })
      .fail(function() console.log("Call KO :("); );
    });
  });
});

Hei, voglio gestire più relay!

Ho cercato di rendere quanto più facile possibile modificare il progetto per gestire un diverso numero di relay o cambiare i PIN a cui questi sono collegati…

All’interno della pagina HTML (index.htm), ogni pulsante ha questa porzione di codice:

<div class="ui-field-contain">
  <label for="2">Relay 1:</label>
  <select name="2" id="2" data-role="flipswitch">
     <option value="0">OFF</option>
     <option value="1">ON</option>
  </select>
</div>

Il valore 2, riportato sia nel tag label che in quello select, indica il PIN di Arduino controllato da quel pulsante, mentre il valore del tag label (nell’esempio Relay 1:) è semplicemente l’etichetta visualizzata accanto al pulsante stesso.

E’ quindi facile modificare i valori esistenti per cambiare il PIN controllato e/o aggiungere nuovi blocchi per aumentare il numero di pulsanti disponibili.

Nello sketch ricordatevi solo di cambiare di conseguenza la configurazione dei PIN all’interno del setup():

  // configure the relay PINs
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT)

42 Comments »

  1. jmv 14/05/2015 at 00:42 - Reply

    great project and tutorial luca.
    will be very useful !

  2. Nevio 08/06/2015 at 22:15 - Reply

    Grazie mille per i tuoi tutorial!
    Sarebbe possibile avere lo stesso risultato utilizzando la yun?
    grazie
    Nevio

    • luca 09/06/2015 at 07:39 - Reply

      Ciao! Sicuramente sì, anzi lo Yun consente molto di più… a breve un progetto che usa lo Yun per attivare dei relay… e molto altro ;)

      • Nevio 11/06/2015 at 22:22 - Reply

        Ottimo :)

        Stò cercando delle fonti per realizzare un controllo pan-tilt di una webcam ed il comando di un piccolo motore DC tramite una pagina web che risieda sulla yun.
        Quello che fatico a trovare riguarda la gestione di dati di dalla yun verso la pagina web,che siano gli stati degli ingressi oppure la lettura della corrente assorbita dal motore.

        Grazie mille per il tempo che dedichi ai tuoi tutorial

        Nevio

  3. Ferdinando 12/07/2015 at 08:18 - Reply

    Eccezionale…
    Luca, hai anche lo schema dei collegamenti ?

    Grazie e ancora complimenti

    • luca 15/07/2015 at 19:17 - Reply

      Ciao Ferdinando, i collegamenti dipendono dai moduli che hai, cmq si tratta di collegare il bus SPI ad Arduino con i due CS dei moduli verso due diversi pin di arduino. Forse si vede bene nel precedente articolo, dove ho usato il medesimo setup.

  4. Denis 01/08/2015 at 13:21 - Reply

    Ciao Luca, grazie per queste guide…
    Ho un problema a scaricare la libreria JQUERY, non la scarica compressa, se la comprimo non la accetta arduino, dove sbaglio? Invece la JQUERY MOBILE si scarica compressa e la carica normalmente arduino… Altra cosa, qualche esempio per vedere su una pagina web lo stato dei pin di arduino ed eventualmente una linea analogica? Volevo controllare un antifurto da remoto.
    Grazie ancora e complimenti

  5. Jose 26/08/2015 at 20:39 - Reply

    Hi, great project. I’ve try test with arduino nano and if I power up the sd module, don’t work, I can’t inizialize ethernet module (ENC28J60). I don’t know why don’t work. Could you tell me about.

    • luca 02/09/2015 at 22:12 - Reply

      Hi Jose, do the two modules work if you connect them one at a time?

  6. Enrico 10/09/2015 at 12:55 - Reply

    Ciao Luca, un GRANDISSIMO GRAZIE per i tuoi tutorial sul modulo enc28J60. Sto progettando una scheda per monitorare temperature ed azionare dei relè per aumentare la produzione dei miei prodotti a catalogo. Uso l’Atmega 1284P e quindi non ho nessun problema di memoria flash e ram. Vorrei conoscere meglio il modulo perché le schede saranno ovviamente in stand-alone e il modulo è disponibile anche in montaggio su foro. Il primo quesito riguarda la capacità massima del buffer e se ce la possibilità di aumentarla, magari agendo sulla libreria Ethercard… Grazie e ancora complimenti.

    • luca 12/09/2015 at 09:28 - Reply

      Ciao Enrico, la dimensione del buffer viene definita nello sketch (byte Ethernet::buffer[600];) quindi puoi modificarne le dimensioni. Il tuo chip ha 16k di RAM quindi puoi provare ad aumentarlo un po’

  7. Enrico 13/09/2015 at 08:03 - Reply

    Ancora GRAZIE per le tue risposte precise ed esaustive… Volevo capire qual’è il limite del buffer! È possibile portarlo a 8000/9000?

    • luca 13/09/2015 at 12:03 - Reply

      ciao, teoricamente non ci sono limiti ma non ho mai provato valori così grandi… non ti resta che provare ;)

  8. Enrico 15/09/2015 at 14:30 - Reply

    OK… Gentilissimo, farò sapere a tutti voi l’esito del mio progetto! Buona lavoro a Te e a chi ti segue!

  9. daniele 21/10/2015 at 09:38 - Reply

    ottimo progetto, ma se io uso l’ethernet shield funziona lo stesso?

    • luca 21/10/2015 at 10:59 - Reply

      Ciao Daniele; no, non funziona… questo sketch è pensato per utilizzare le librerie per enc28j60 e quindi va pesantemente modificato per l’ethernet shield ufficiale.

  10. T.Long 25/10/2015 at 15:11 - Reply

    Hi Luca. How to make a ping from arduino to router to check connection, i using ethercard library and ENC28J60

    • luca 03/11/2015 at 10:50 - Reply

      Hi, use the clientIcmpRequest method… I’m going to write a small tutorial about it.

  11. Antonio 13/11/2015 at 00:04 - Reply

    Ciao Luca, interessante questo tuo articolo.
    Volevo chiederti, l’utilizzo del sistema a mezzo smartphone, può essere fatto da qualsiasi luogo?

    • luca 13/11/2015 at 08:25 - Reply

      Ciao Antonio, assolutamente sì se Arduino è raggiungibile via Internet (ad esempio configurando il “NAT” sul router ADSL)

  12. Antonio 13/11/2015 at 15:52 - Reply

    Configurare il NAT? Cioé? Io mi sono sempre collegato via Wi-Fi non ho mai collegato il cavo moden-notebook …

    • luca 23/11/2015 at 10:17 - Reply

      ciao Antonio, devi fare una configurazione sul tuo router in modo che “giri” le connessioni in ingresso sulla porta 80 verso l’IP di Arduino…

  13. Gia 08/12/2015 at 23:21 - Reply

    Ciao Luca e grazie di aver condiviso il tuo sapere…Ho un problema con l’ultimo articolo. Provo ad inserire la porta di ascolto con:
    ether.hisport = 91;
    ovviamente nel setup ma, il risultato che ottengo una volta richiamata la pagina index è il listato dell’index :-(( ? Consigli ?

    • luca 10/12/2015 at 14:42 - Reply

      Ciao! Quindi il browser riceve la pagina ma non la “interpreta” come HTML?

  14. Alex 10/12/2015 at 14:35 - Reply

    E’ possibile avere demo per una chat (lato server – lato client)? dove il server possa inviare messaggi ai client ciclicamente? ho usato la libreria uipethernet, ma dopo qualche minuto si impalla e devo resettare!

    • luca 10/12/2015 at 14:44 - Reply

      Ciao Alex, normalmente il browser non può ricevere dati da un server senza che sia lui a stabilire la connessione, infatti tutti i siti Ajax funzionano in modo che ogni tot secondi sia il browser in background a fare delle chiamate al server…

  15. Alex 10/12/2015 at 14:58 - Reply

    Scusa, non intendevo http ma solo socket quindi tcp, nessun browser

  16. Stefano 28/01/2016 at 18:41 - Reply

    Ciao Luca, complimenti per questo tutorial, ti scrivo perchè nonostante abbia letto i vari post, ho capito come fare dei semplici ON OFF, da rete domestica ma non da remoto.
    Grazie

    • luca 29/01/2016 at 08:34 - Reply

      Ciao Stefano, devi fare in modo che il tuo router “giri” le connessioni provenienti da Internet verso Arduino… in gergo tecnico si chiama “NAT”, ogni modello di router ha la sua configurazione, prova a vedere se ci sono tutorial per il tuo.

  17. Stefano 29/01/2016 at 19:18 - Reply

    Grazie per la risposta, si scopre sempre qualcosa di nuovo, da discussioni nel forum di arduino ho letto che serve un server esterno

    • luca 30/01/2016 at 09:46 - Reply

      no, non è assolutamente necessario! basta configurare correttamente il router.

  18. Stefano 30/01/2016 at 12:51 - Reply

    ieri sera ho recuperato le info sul router ma sembra che usi un servizio esterno, devo studiarmi meglio la cosa, provo a contattare i produttori del router

  19. Piero 25/05/2016 at 22:11 - Reply

    Ciao Luca , si riesce a vedere lo stato dei relè in tempo reale ogni qualvolta ci si connette con più PC? attualmente lepagine si aprono sempre con lo stato OFF anche se lo stato è ON.. Grazie

  20. Michele 27/06/2016 at 16:00 - Reply

    Ciao Luca. Complimenti per gli esempi e la chiarezza d’esposizione. Ora volevo chiederti se questo esempio lo posso applicare al FISHINO UNO che ha integrato modulo SD e WiFi. Mi aiuteresti per cortesia?

    • luca 25/07/2016 at 09:49 - Reply

      ciao Michele, purtroppo no, Fishino usa un chip diverso

  21. Willy 27/07/2016 at 19:18 - Reply

    Scusa Luca vorrei usare quessto sketch con un arduino nano e il suo modulo enc28j60, purtroppo nel compilare mi da errori a tutto spiano !!! vorrei solo capire se non può funzionare, con il nano e il suo modulo ethernet…. garzie in anticipo saluti Willy

    • luca 02/08/2016 at 07:48 - Reply

      ciao! sì, funziona con il Nano, che errori ottieni in fase di compilazione?

      • Willy 05/09/2016 at 20:30 - Reply

        Ti ringrazio per quello che fai e pubblichi…. ero convinto di poter usare il progetto per comandare un paio di relè con un nano e la relativa scheda di rete enc28j60, purtroppo mi sono reso conto che bisogna utilizzare, un SD per pubblicare il sito WEB … e non credo di essere in grado di modificare il tutto per le mie esigenze !! ti sarei grato se potessi indicarmi se esiste o si puoò trovare una progetto come sopracitato anche con un seplice pulsante sul display … comunque complimenti e grazie pwe quello che fai Saluti Willy

  22. Emanuele 20/08/2016 at 17:19 - Reply

    Ciao Luca, è possibile adattarlo alla board fishino? Mi potresti aiutare?
    Grazie

    • luca 23/08/2016 at 13:14 - Reply

      Ciao Emanuele, purtroppo non facilmente e non ho alcuna scheda fishino su cui provare

      • Emanuele 24/08/2016 at 10:22 - Reply

        Al limite mi potresti dare qualche dritta su come fare?

  23. Felix Wong 16/05/2017 at 03:33 - Reply

    Hi Luke;
    its a very good project. You show us to add more relay(or pin). Can you show us to add pin 6, which is analog write pin with 50 % turn on?
    Thanks ahead

    Felix

Leave A Response »

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione 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