Arduino + ENC28J60: Controllo luci da remoto

Ci sono vari modi di collegare Arduino ad Internet. È possibile utilizzare la scheda di rete “Originale”, basata sul chip W5100 (soluzione più costosa ma in alcuni casi obbligatoria), oppure usare un modulo non ufficiale, come l’ENC28J60.

W5100 o ENC28J60?

La principale differenza tra le due schede è che la prima implementa lo stack TCP/IP in maniera hardware (liberando risorse all’MCU e permettendo così la creazione di programmi più complessi), mentre nella seconda via software. Inoltre la W5100 possiede anche uno slot per schede micro-SD, in cui, ad esempio, possono essere salvate le pagine HTML di un webserver, utilizzando l’altro modulo ci saremmo dovuti accontentare dei 32kB di spazio riservato ai programmi nell’ATmega328P.

Un’altra differenza tra le due schede sta nella scrittura del programma. La sua stesura è un po’ più tortuosa con l’ENC28J60, mentre la libreria della shield ufficiale permette di programmarla in modo più semplice ed implementa molti esempi utili al suo studio.

Tempo fa comprai l’ENC28J60 per il suo basso prezzo (2€), che va più che bene per questo progetto. Tuttavia consiglio vivamente di pensare due volte a quale tipo di controller usare, valutando anche la complessità dei progetti che si desiderano creare e dei limiti dell’ENC28J60 descritti sopra.

Collegamenti

Per quanto riguarda il collegamento di questa scheda con Arduino, esso deve avvenire come segue:

  • PIN GND Arduino – PIN GND ENC28J60
  • PIN VCC Arduino – PIN VCC 3v3 ENC28J60
  • PIN 13 Arduino – PIN SCK ENC28J60
  • PIN 12 Arduino – PIN SO ENC28J60
  • PIN 11 Arduino – PIN SI ENC28J60
  • PIN 8 Arduino – PIN CS ENC28J60

Sketch

Si possono trovare molte librerie per l’ENC28J60. La più diffusa e che quindi ho deciso di utilizzare è la EtherCard.h. Download: clicca qui.

Questo è lo sketch commentato che ho scritto basandomi su alcuni esempi. L’indirizzo IP viene preso direttamente da Arduino, quindi occorre sceglierne uno non ancora occupato da un altro dispositivo. Anche l’indirizzo MAC deve essere univoco nella rete, ma in questo caso avete poche probabilità di utilizzarne uno di un altro dispositivo 🙂

/*
Controllo Luci 1.0

Sketch per il controllo remoto di una lampada da Arduino.

Pietro Lodi Rizzini
Dicembre 2015
*/
#include <EtherCard.h>

static byte mymac[] = {0xDA,0xDB,0xDC,0x01,0x02,0x03}; //definizione dei parametri base per la connessione alla rete
static byte myip[] = {192,168,1,200};
static byte gwip[] = {192,168,1,254};

byte Ethernet::buffer[700];

const int ledPin = 2;
boolean ledStatus;

char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;

void setup () {

Serial.begin(57600);
Serial.println("Controllo Luci");
if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
Serial.println( "Failed to access Ethernet controller"); //avviso via seriale di eventuali errori (solo per debug)
ether.staticSetup(myip, gwip); //configurazione IP statico (no DHCP) e IP del gateway
ether.hisport = 80; // porta default HTTP

Serial.println();

pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
ledStatus = false;
}

void loop() {

word len = ether.packetReceive();
word pos = ether.packetLoop(len);

if(pos) {

if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
Serial.println("Received ON command");
ledStatus = true;
}

if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
Serial.println("Received OFF command");
ledStatus = false;
}

if(ledStatus) {
digitalWrite(ledPin, HIGH);
statusLabel = on;
buttonLabel = off;
} else {
digitalWrite(ledPin, LOW);
statusLabel = off;
buttonLabel = on;
}

BufferFiller bfill = ether.tcpOffset();
bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
"<html><head><title>Controllo Luci</title></head>"
"<body>Stato Luci: $S "
"<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
"</body></html>"
), statusLabel, buttonLabel, buttonLabel);
ether.httpServerReply(bfill.position());
}
}

Collegandosi all’indirizzo impostato nell’array myip, dal browser di un dispositivo connesso alla stessa rete a cui è connesso Arduino, il risultato è il seguente:

BrowserPage

Applicazione Android

Grazie ad un semplicissimo strumento, “MIT App Inventor“, ho avuto la possibilità di creare un’applicazione per smartphone Android che permette l’accensione e lo spegnimento delle luci in modo più semplice.

Puoi trovare il progetto pubblicato qui.

Dopo avere importato l’applicazione, dovrai cambiare due stringhe a seconda dell’indirizzo IP che hai impostato:

ParametriApp

Fatto ciò la puoi esportare generando un file APK da poi installare sul telefono (Build > Save .apk to my computer).

Il mio utilizzo di questo sistema

Ho utilizzato questo progetto per accendere e spegnere le lucine di Natale poste sul balcone. Ho riposto Arduino in una scatola di derivazione sopra alla quale ho fissato un centralino 4M con un magnetotermico di protezione, dato che le lucine sono all’aperto:

Centralino

7 Risposte a “Arduino + ENC28J60: Controllo luci da remoto”

  1. Complimenti x lo sketch era quello che cercavo .ho solo una domanda questo sketch funziona solo con la ENC28J60?io ho questa scheda W5100

  2. ciao volevo una info,complimenti per lo sketch è perfetto ,solo che ho un problema quando piggio on o off non si muove nessun relè…devo fare altre configurazioni??grazie

    1. Ciao,
      se dici che riesci a vedere la pagina web, probabilmente il problema sta nel collegamento del relè ad Arduino. Nell’articolo non è esplicitamente detto, ma devi collegare il relè al pin digitale numero 2 di Arduino, che puoi cambiare modificando il valore assegnato alla costante ledPin nell’istruzione “const int ledPin = 2; “. Esistono diversi tipi di relè. Quello più diffuso per Arduino è il modulo relè che fotoaccoppiato, grazie a dell’elettronica di contorno. Esso è molto sicuro ed impedisce un eventuale contatto diretto di Arduino con la rete a 230V. Per collegare tale tipo di relè ad Arduino, devi collegare il pin di massa della scheda relè ad una massa di Arduino e il pin del relè che vuoi comandare al pin digitale 2 di Arduino. Poi devi occuparti della parte a 230V: sostanzialmente per fare ciò che vedi nel video devi interrompere un polo (sarebbe meglio la fase) a 230V dell’utilizzatore da comandare, collegando la fase diretta nel morseotto “com” della scheda relè e il ritorno all’utilizzatore (il cavo in cui passa corrente quando premi ON sulla pagina web) nel morsetto “NA” (Normalmente Aperto) della scheda relè.
      Spero di averti chiarito le idee. Ti ricordo che la corrente di casa a 230V può essere fatale. Se hai altri dubbi puoi rispondere a questo commento.

  3. grazie ho risolto alla grande grazie a te…Ti chiedo un altro quesito,sto provando in ogni modo e maniera per aggiungere altri tasti al tuo Sketch ma senza riuscirci,non e che mi daresti una dritta sul come fare???grazie

    1. Ciao Peppe, Ciao Pietro
      potete darmi qualche indicazione su come aggiungere altri tasti ?
      Ciao e grazie

  4. Ciao, ho seguito le tue indicazioni , come scheda ho arduino uno e ENC28J60, ho scaricato la libreria e anche il codice, ma non mi si collega via browser, mi dice “la pagina ha impiegato troppo tempo a rispondere impossibile raggiungerla”. Grazie in anticipo, non so come farlo funzionare sto modulo…

I commenti sono chiusi.