Lezione 14: Come accendere una lampada da remoto con Arduino

Lezione 14: Come accendere una lampada da remoto con Arduino

In questo quattordicesimo capitolo, vedremo come utilizzare Arduino per accedere una lampada da remoto sfruttando un semplice relè.

Per completare l’introduzione alla scheda Ethernet ufficiale di Arduino, è molto utile introdurre il prossimo programma, che mostra come sia possibile accendere un LED da remoto, sfruttando una pagina WEB, che viene generata dallo stesso microcontrollore.

1° Programma: Come accendere da remoto un LED 

/**
Questo programma mostra come sia possibile inserire del codice HTML all'interno della
pagina web del webserver di Arduino*/

#include <SPI.h>
#include <Ethernet.h>

int pinLED = 9; // pin a cui è connesso il LED
boolean acceso = false; 
// Mac Address di Arduino
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

// Viene inizializzata la libreria Ethernet di Arduino e il webserver gira sulla porta 80
EthernetServer server(80);

void setup() {
  pinMode(pinLED,OUTPUT);
  digitalWrite(pinLED,LOW);
  Serial.begin(9600);
  // Viene inilizzato il webserver e la connessione di rete
  Ethernet.begin(mac);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // Vengono ascoltati nuovi client
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // Finisce una richiesta HTTP
    boolean currentLineIsBlank = true;
    String postText ="";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if(postText.length()<10){
          postText +=c;
        }
        // Se viene completato l'invio della richiesta HTTP, allora il server invia la risposta
        if (c == '\n' && currentLineIsBlank) {
          // Viene fatta una risposta HTTP, in pratica viene creata una pagina WEB in HTML
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // Dopo la risposta la connessione si interrompe
          client.println();
          client.println("<meta charset=UTF-8>"); // serve per inserire i caretteri speciali
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<head> <TITLE>Arduino</TITLE> </head>"); // Viene creato il Titolo
          client.println("<body> <h1> Benvenuto nel Webserver Arduino </h1>"); // Viene inserito del testo
          client.println("<h3> Attraverso questa pagina è possibile accendere e spegnere un LED </h3>");
          client.println("</body>");
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    // Se l'utente ha premuto l'icona per accendere il LED
    if(postText.indexOf("?on") >0){
          digitalWrite(pinLED,HIGH);
          Serial.println("Accendi LED");
          acceso = true;
        }
     // Se l'utente ha premuto l'icona per spegnere il LED
     if(postText.indexOf("?off") >0 ){
       digitalWrite(pinLED,LOW);
        Serial.println("Spegni LED");
        acceso = false;
       }
      // Viene cambiata la pagina WEB a seconda che il LED sia spento, oppure acceso
      if(acceso){
          client.println("<a href=\"./?off\"> <img src = \"http://ismanettoneblog.altervista.org/blog/wp-content/uploads/2014/03/led-red.png\"alt = \"Spegni\" ></a>");
          client.println("<h3> Il LED è accesa </h3>");
        }else{
          client.println("<a href=\"./?on\"> <img src = \"http://ismanettoneblog.altervista.org/blog/wp-content/uploads/2014/03/led-green.png\"alt = \"Accendi\" ></a>");
          client.println("<h3> Il LED è spento </h3>");
          }   
    delay(1);
    // Viene chiusta la connessione
    client.stop();
    Serial.println("client disconnected");
  }
}

Ed ecco l’output:

Benvenuto nel Webserver Arduino

Attraverso questa pagina è possibile accendere e spegnere un LED

Spegni

Il LED è accesa

Quanto è spento il LED, la pagina web si aggiorna e diventa:

Benvenuto nel Webserver Arduino

Attraverso questa pagina è possibile accendere e spegnere un LED

Accendi

Il LED è spento

 

Arduino non fa altro che creare una pagina web e rilevare che icona è stata premuta dall’utente. La richiesta che viene effettuata, viene relativa dal pacchetto che viene inviato dal Computer al microcontrollore.

Sebbene la scheda Ethernet ufficiale di Arduino sia davvero ben fatta, è possibile trovare sul mercato un dispositivo che svolge le stesse funzioni, ma che costa molto meno. Il suo nome è ENC28J60.

ENC28j60-Ethernet-Interface-Module1

 

Ecco il datasheet del dispositivo:

pdf

 

Per maggiori informazioni introduttive al ethernet controller ENC28J60, consiglio di dare un’occhiata agli ottimi tutorial di Luca Dentella, reperibili dal seguente link http://www.lucadentella.it/category/enc28j60-arduino/. Tuttavia, nel corso di questo capitolo e in quelli successivi, sarò possibile conoscere il dispositivo da più vicino. Ora che abbiamo introdotto tutti i componenti, possiamo passare al progetto di comandare da remoto una lampada.

Con Arduino è possibile fare davvero tanti progetti divertenti e utili, sopratutto per facilitare alcune operazioni in casa. Ora vedremo come utilizzarlo, per accendere una lampada da remoto, oppure qualsiasi dispositivo che è collegato alla presa elettrica di casa nostra.

Vediamo un po’ quali sono i dispositivi che occorrono per realizzare questo progetto:

Hardware

 

  • 1 x Arduino Uno Costo 12 Euro, acquistabile su Ebay d8023dded193db365b86e925197efd2e.image.240x240
  • 1 x Scheda Ethernet ENC28J60 Costo 5 Euro, acquistabile su Ebay oppure Ethernet Shield ENC28j60-Ethernet-Interface-Module1
  • 1 x Relè da 220 V 10 A Costo 3 Euro, acquistabile su Ebay 0-96d41f35-800
  • 1 x Cavo Ethernet da 1 metro Costo 2 Euro OLYMPUS DIGITAL CAMERA

Software

  • Arduino IDE
  • Libreria per ENC28J60
  • Sketch codice relay + Lampada + WebServer

Che cos’è un relay ?

grupporele
Un relay, dal punto di vista esterno è un semplice interruttore in grado di far passare corrente o no. Questo fenomeno avviene grazie un principio fisico, basato sull’accoppiamento magnetico che viene generato attraverso un passaggio una piccola corrente di eccitazione, che viene erogata dallo stesso Arduino. Ci sono due configurazioni per quanto riguarda il relay:

  1. NO (Normally open)
  2. NC (Normally closed)

Queste due configurazioni si differenziano soltanto per il codice che è necessario scrivere in Arduino. La prima configurazione, in caso di spegnimento del relay, non fa passare corrente (il circuito rimane aperto) e affinché la lampada venga accesa è necessario far uscire da Arduino un segnale “HIGH”. La configurazione NC è duale; in caso il relay non fosse alimentato, la corrente passa in questo dispositivo e affinché la lampada sia spenta, è necessario fare un uscire da Arduino un segnale “LOW”.

Ricapitolando dal punto di vista del codice:

Configurazione NO

digitalWrite(relay,LOW); // Luce spenta

delay(1000);

digitalWrite(relay, HIGH); // Luce accesa
Configurazione NC

digitalWrite(relay,LOW); // Luce accesa

delay(1000);

digitalWrite(relay, HIGH); // Luce spenta
Per chi volesse approfondire maggiormente per quanto riguardo questo elemento circuitale, puoi visitare la pagina web di Wikipedia, nella quale si parla delle varie tipologie di relè.

Come collegare i vari cavi tra i dispositivi

I collegamenti che devono essere fatti per far funzionare il progetto sono abbastanza semplici. Abbiamo due dispositivi da collegare ad Arduino: 1) il relè e 2) la scheda Ethernet.

Per quanto riguarda la prima, occorrerà alimentare il relè con 5 V, massa e il pin Out, va collegato al pin di Arduino impostato nel codice, che in questo caso è il 5.

BK_SRD

 

Ora vedremo due programmi per Arduino, uno che funziona per la Scheda Ufficiale Ethernet, mentre l’altro per l’ENC28J60

  • Ethernet Shield Ufficiale W5100 ArduinoEthernetShieldV3

Il codice per Arduino per il progetto è davvero molto simile a quello per l’accensione di un LED da remoto. Infatti il meccanismo di funzionamento di Relay, dal punto di vista per Arduino è identico a quello per un LED. L’unica variazione introdotta, riguarda il cambio dell’icona per l’accensione della lampada.

/**
Questo programma permette di accedere e spegnere una lampada da remoto
*/

#include <SPI.h>
#include <Ethernet.h>

int pinLED = 9; // pin a cui è connesso il LED
boolean acceso = false; 
// Mac Address di Arduino
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

// Viene inizializzata la libreria Ethernet di Arduino e il webserver gira sulla porta 80
EthernetServer server(80);

void setup() {
  pinMode(pinLED,OUTPUT);
  digitalWrite(pinLED,LOW);
  Serial.begin(9600);
  // Viene inilizzato il webserver e la connessione di rete
  Ethernet.begin(mac);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // Vengono ascoltati nuovi client
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // Finisce una richiesta HTTP
    boolean currentLineIsBlank = true;
    String postText ="";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if(postText.length()<10){
          postText +=c;
        }
        // Se viene completato l'invio della richiesta HTTP, allora il server invia la risposta
        if (c == '\n' && currentLineIsBlank) {
          // Viene fatta una risposta HTTP, in pratica viene creata una pagina WEB in HTML
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // Dopo la risposta la connessione si interrompe
          client.println();
          client.println("<meta charset=UTF-8>"); // serve per inserire i caretteri speciali
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<head> <TITLE>Arduino</TITLE> </head>"); // Viene creato il Titolo
          client.println("<body> <h1> Benvenuto nel Webserver Arduino </h1>"); // Viene inserito del testo
          client.println("<h3> Attraverso questa pagina è possibile accendere e spegnere lampada, connessa ad un relè </h3>");
          client.println("</body>");
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    // Se l'utente ha premuto l'icona per accendere il LED
    if(postText.indexOf("?on") >0){
          digitalWrite(pinLED,HIGH);
          Serial.println("Accendi LED");
          acceso = true;
        }
     // Se l'utente ha premuto l'icona per spegnere il LED
     if(postText.indexOf("?off") >0 ){
       digitalWrite(pinLED,LOW);
        Serial.println("Spegni LED");
        acceso = false;
       }
      // Viene cambiata la pagina WEB a seconda che il LED sia spento, oppure acceso
      if(acceso){
          client.println("<a href=\"./?off\"> <img src = \"http://ismanettoneblog.altervista.org/blog/wp-content/uploads/2014/02/bt_OFF.png\"alt = \"Spegni\" ></a>");
          client.println("<h3> La lampada è accesa </h3>");
        }else{
          client.println("<a href=\"./?on\"> <img src = \"http://ismanettoneblog.altervista.org/blog/wp-content/uploads/2014/02/bt_ON.png\"alt = \"Accendi\" ></a>");
          client.println("<h3> La lampada è spenta </h3>");
          }   
    delay(1);
    // Viene chiusta la connessione
    client.stop();
    Serial.println("client disconnected");
  }
}
  • Scheda Ethernet ENC28J60 ENC28j60-Ethernet-Interface-Module1

Mentre l’Ethernet Shield è semplice da collegare ad Arduino, il microcontrollore ENC28J60 è leggermente un po’ più complicato; infatti sono da collegare ben 6 cavi flessibili. Ci sono i due soliti cavi di alimentazione, VCC(3.3 V, però !) e GND e 4 che servono per ricevere ed inviare i dati su Internet. Ecco una tabella che riassume i collegamenti:

ENCPATAArduino
VCCwire 23.3v
GNDwire 1GND
SCKwire 5Pin 13
SOwire 7Pin 12
SIwire 6Pin 11
CSwire 4Pin 8

Foto 06-02-14 21 16 18

Installazione software dei vari componenti
Le funzioni che permettono di far funzionare la scheda ethernet, non sono presenti in Arduino IDE. Per questo motivo è necessario installare questa libreria, all’interno della cartella “libreries” di Arduino. Per farlo basta scaricare il file in formato .zip, scompattarlo e spostarlo nella cartella di Arduino, senza aprire il programma. In alternativa, è possibile fare questa procedura direttamente dal software IDE.

Ora che la libreria è presente, possiamo procedere al caricamento del file sul nostro Arduino Uno.

/**
Questo codice permette di accendere una lampada connessa al relè da remoto, sfruttando
la scheda di rete ENC28J60
SCK -> 13
SO -> 12
SI -> 11
CS -> 8
Vcc -> 3.3 V
GND -> GND
*/

#include <EtherCard.h>
#define RELAY_PIN	5
#define REQUEST_RATE 5000

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
char* on  = "ON";
char* off = "OFF";
boolean relayStatus;
char* relayLabel;
char* linkLabel;

byte Ethernet::buffer[700];

void setup () {
  Serial.begin(9600);
  Serial.println("Getting IP via DHCP");

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller");

  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");

  ether.printIp("My IP: ", ether.myip);
  // ether.printIp("Netmask: ", ether.mymask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);

  Serial.println();

  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);  
  relayStatus = false;
  relayLabel = off;
  linkLabel = on;
}

void loop () {

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

  if(pos) {

    if(strstr((char *)Ethernet::buffer + pos, "GET /?ON") != 0) {
      relayStatus = true;
      relayLabel = on;
      linkLabel = off;
    } else if(strstr((char *)Ethernet::buffer + pos, "GET /?OFF") != 0) {
      relayStatus = false;
      relayLabel = off;
      linkLabel = on;
    }
    digitalWrite(RELAY_PIN, relayStatus); 

    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><meta name='viewport' content='width=200px'/></head><body>"
      "<div style='position:absolute;width:200px;height:200px;top:50%;left:50%;margin:-100px 0 0 -100px'>"
      "<div style='font:bold 14px verdana;text-align:center'>Relay is $S</div>"
      "<br><div style='text-align:center'>"
      "<a href='/?$S'><img src='https://ismanettoneblog.altervista.org/blog/wp-content/uploads/2014/02/bt_$S.png'></a>"
      "<div>Controlla la lampada<div>"
      "</div></div></body></html>"
      ), relayLabel, linkLabel, linkLabel);

      ether.httpServerReply(bfill.position());
    }
  }

Ora per poter testare entrambi i programmi, le operazioni da fare sono uguali.

Il primo passo è quello di ottenere l’indirizzo ip locale, di Arduino. Per farlo ci sono varie possibilità; la prima è quella di aprire il seriale, oppure l’altra possibilità è quello di scaricarsi un programma per effettuare scansioni degli host, presenti nella propria rete locale.

Seriale
Ora che abbiamo l’indirizzo IP, apriamo il browser presente nel nostro telefonino e digitiamo il relativo indirizzo. Comparirà una pagina web simile a questa:

Foto 06-02-14 21 26 31

Una volta premuto il bottone verde, comparirà una nuova pagina, con la quale sarà possibile spegnere la luce.

Per poter accendere anche da remoto la lampada, occorre aprire la porta 80, dalla pagina di controllo del nostro Router, scegliendo l’IP corrispettivo.

Foto 06-02-14 21 26 26

ismanettoneblog

70 pensieri su “Lezione 14: Come accendere una lampada da remoto con Arduino

  1. Buongiorno, io dovrei portare un progetto di casa domotica agli esami di maturità, mi piacerebbe utilizzare il controllo da remote per l’accensione della luce e di qualche altro output. Non è che potrebbe contattarmi per qualche altro chiarimento sul codice?

  2. Buongiorno,
    mi è tornato molto utile il codice per la scheda di rete ENC28J60, mi potresi dare una mano sul codice per far si che al click il rele chiuda il circuito per 2 sec e poi lo riapra in automatico?
    grazie in anticipo se vorrai darmi una mano.
    Save

    1. Se ho capito bene, tu vuoi premere un pulsante presente nella pagina web di Arduino, far condurre un relè per due secondi e poi aprire il circuito, giusto ? Per far ciò puoi utilizzare il metodo delay(2000); che mette in pausa il processo per due secondi. Quindi il codice diventa:

      digitalWrite(RELAY_PIN, relayStatus);
      delay(2000);
      relayStatus = false;
      relayLabel = off;
      linkLabel = on;

      Sappi che però in quei due secondi, non puoi comunicare con il server, in quanto Arduino è bloccato. Se ti può essere utile, ora è disponibile una libreria che permette di utilizzare la scheda ENC28J60, come se fosse la Shield Ethernet Ufficiale. Sperando di esserti stato utile, rimango a disposizione per altri dubbi.

      1. Innanzitutto grazie per la risposta, ma riesco a comunicare la chiusura del circuito e poi tutto in tilt anche il browser. Per riaprire mi tocca inserire OFF nella barra indirizzi manualmente. Sembra che il ciclo If else non venga più eseguito.
        Grazie

      2. Ciao io sto cercando di aggiungere più utilizzi,6 relè per l’esattezza,di cui 3 dovrei comandare con l’impulso di un paio di secondi,mi puoi dare u a dritta di come aggiungere nella parte webserver e sketch a questo punto altri utilizzi?
        Grazie 1000 e scusa del disturbo.

  3. Ciao volevo sapere come hai fatto a creare la pagina web per far accendere e spegnere un led via http e come hai fatto per configurare entrambi? Grazie mille per la guida e per un eventuale risposta

    1. Per creare una pagina WEB in Arduino, è necessario utilizzare i metodi client.print o server.print, nei quali è possibile inserire il codice HTML per creare una pagina WEB. È tuttavia possibile caricare su una pagina micro-SD l’intero codice. Ad ogni modo, è il browser ad interpretare la pagina WEB che è stata creata. L’Arduino è in grado di ricevere i comandi, sfruttando il protocollo HTTP; attraverso il browser viene inviato un parametro ?on oppure ?off che il microcontrollore è in grado di interpretare, Quando riceve uno dei due comandi, viene acceso il LED e la pagina WEB cambia, grazie alla variabile booleana acceso.

        1. Salve,
          il concetto chiave è quello di utilizzare 8 variabili, per tenere traccia dello stato dei pulsanti e verificare che il comando ricevuto sia ?off1, per indicare di spegnere il primo dispositivo.

  4. RISOLTO CON QUESTA PARTE DI CODICE

    static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
    static byte myip[] = { 192,168,0,150 };
    static byte mygt[] = { 192,168,0,1 };
    static byte mydns[] = { 192,168,0,1 };
    char* on = “ON”;
    char* off = “OFF”;
    boolean relayStatus;
    char* relayLabel;
    char* linkLabel;

    byte Ethernet::buffer[700];
    static uint32_t timer;
    char buf[20];

    void setup () {
    Serial.begin(9600);
    Serial.println(“go.”);
    if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println( “Failed to access Ethernet controller”);
    else
    Serial.println( “Ok, access Ethernet controller”);
    ether.staticSetup(myip,mygt,mydns);
    ether.printIp(“IP Address:\t”, ether.myip);
    // ether.printIp(“Netmask:\t”, ether.mymask);
    ether.printIp(“Gateway:\t”, ether.gwip);
    Serial.println(“end setup!”);

  5. Ciao,
    vorrei capire come comandare con Arduino 4 Relay (FIN27018230) connessi ognuno a 2 pulsanti, per poter pilotare le luci di casa sia tramite i pulsanti che tramite Arduino. Se ho ben capito mi servirà un modulo 4 relay, ma non mi è chiaro come collegare il tutto al mio impianto di casa.
    Grazie Simone

  6. Ciao, prima d tutto grazie.
    ho due domande. Posso connettere al posto del led un filo connesso ad un relè??
    Devo metter su un controllo per uno scaldabagno. Seconda domanda: come faccio a comandare il tutto quando nn sono a casa? MI basta l’IP della rete?

    Grazie

    1. Si è possibile sostituire il tutto con un relè, prestando le dovute accortezze ed è possibile accedervi da remoto.

  7. Buonasera,ho seguito con molto interesse questo articolo,poichè sono riuscito a fare una pagina web,con diversi pulsanti,che attivano o disattivano diverse uscite,ma non sono riuscito ad aggiungere nessun’altro pulsante.. ho provato ad usare delle immagini come quelle nell’esempio,ma diverse,per poter gestire il cambio di entrambe le immagini del pulsante verde o rosso.. ma cliccando su uno o sull’altro,cambiano entrambi colore e non capisco come risolvere. Chiedo se possibile aiuto o consigli sul come aggiungere pulsanti come da esempio. Grazie in anticipo!

    1. Salve,
      grazie per l’interessamento. L’integrazione è davvero semplice; sostanzialmente c’è da capire il funzionamento della libreria WiFi.h (inserire il nome della rete, password). Trovi tutta la documentazione a questo indirizzo. Qualora avessi dei dubbi, non esitare a contattarmi !

  8. Salve volevo dei chiarimenti su cosa collegare al relè perché non mi è molto chiaro..al relè collego che fili?

    1. Il relè è una sorta di interruttore, in grado di far passare corrente qualora venga eccitato da una tensione. Dal momento che il relè è composto da transistor, è necessario che sia alimentato. Per tanto è necessario collegare 3 fili al relè: 1 VCC (5 V), 1 GND e un cavo di eccitazione per il relè. In aggiunta è necessario collegare il carico, che può essere una lampada, oppure un altro dispositivo che lavora a 220 V. Qui trovi un esempio di come collegare il carico

  9. Ciao..! Innanzitutto grazie mille per queste lezioni! Sono davvero esaustive e di facile comprendonio anche per i meno pratici del settore..! In secondo luogo vorrei chiederti una considerazione: il principio qui utilizzato, posso applicarlo anche per controllare con una scheda Udoo (wifi integrata) l’accensione da remoto di una lavatrice? In particolar modo, dove dovrei prestare attenzione nel modificare il codice sorgente? Grazie mille..!

    1. Grazie per i complimenti. Il codice presente nell’articolo permette di comandare dispositivi elettrici on/off, attraverso il semplice passaggio/non passaggio di corrente. Per quanto riguarda la lavatrice, tipicamente anche se vengono alimentate, è necessario premere un pulsante oppure girare una manovella. In questo caso potresti sempre sfruttare il meccanismo per poter comunicare con Arduino, ma modificare le funzioni on e off, mettendo, ad esempio, un piccolo motorino passo-passo per poter simulare la pressione del pulsante di avvio della lavatrice.

  10. ciao, amo programmare e progettare app android. in questo periodo mi sto avvicinando alla domotica e stavo pensando di acquistare arduino. quello che pensavo di fare è di realizzare un’applicazione android che attraverso un server da me creato, mi permetta di accendere e spegnere una lampadina. ma come faccio a collegare arduino con il mio server invece di usare la pagina web? inoltre, è possibile accendere una lampadina o posso accendere solo un led? ti ringrazio

    1. Salve,
      è possibile far comunicare direttamente Arduino con Android, oppure Android->WebServer->Arduino. Nel primo caso si usa una semplice richieste HTTP, nel secondo caso si può usare il protocollo Websocket. È possibile tranquillamente accendere e spegnere una lampadina, purché sia collegata ad un relè.

  11. Salve chiedevo si può avere il codice per far funzionare 2 relè con due pulsanti come questo progetto ?
    invece di uno con due
    grazie

    1. Salve,
      si è possibile. Basta aggiungere un’altra variabile, che salva lo stato del secondo relè.

  12. Ciao, ho testato il tuo codice con arduino uno e la Scheda Ethernet ENC28J60, tutto ok funziona.. mi chiedevo se c’è la possibilità di implementare nel codice un comando che accenda o spenga il relay in maniera temporizzata dopo ogni pressione del tasto ON/OFF. Esempio: quando si pigia su ON il relay si attiva accendendosi e rimaanendo acceso per 5 secondi per poi spegnersi.. Grazie.

    1. Si è possibile farlo:

      digitalWrite(LED, HIGH);
      delay(5000);
      digitalWrite(LED, LOW);

      In questo caso la pagina web avrà soltanto un button.

  13. Salve, come server mi da 0.0.0.0 , ho Arduino UNO con la relativa shield originale.

    server is at 0.0.0.0

    P.S.: complimenti per gli articoli su Arduino! 😉

  14. ciao, articoli interessanti, vorrei realizzare un telecontrollo di alcune utenze, am per il momento mi dedico a capire come fare il programma. La domanda è se hai esempi di codice per avere più pulsanti? uso arduino con la scheda W5500.
    Grazie

    1. Ciao,
      esempi pronti non ce ne sono, ma la logica da utilizzare è abbastanza semplice, in quanto al posto di inviare on e off, invii on1 e off1 per il primo dispositivo, on2 e off2 per il secondo e così via. Il codice va modificato nelle parti che verifica il comando inviato. Se hai bisogno di un codice completo, cercherò di fare un esempio completo.

  15. Ciao, ho seguito passo passo i tuoi consigli, collegamenti e codice per il modulo ENC28J60, e sto riscontrando un problema: appena avvio il codice e apro la comunicazione seriale, mi stampa: getting ip via DHCP e poi non mi stampa nulla, la cosa strana che mi ha colpito è che se il cavo o lo collego o non lo collego non stampa niente lo stesso.. Il cavo è funzionate al 100% perché l’ho connesso al pc e mi funziona.. Non sto trovando il problema, grazie in anticipo dell’aiuto, aspetto una tua risposta per poter usare finalmente questo modulo e divertirmi un pò.

    1. Ciao,
      il tuo router ha abilitato il protocollo DHCP? Nello sketch l’Arduino è impostato a ricevere i parametri dal router. Verifica che i collegamenti tra l’ENC28J60 e l’Arduino siano corretti.

      1. Grazie per la risposta, ho controllato il protocollo DHCP ed è attivo, per quanto riguarda i collegamenti ho seguito lo schema che è riportato sopra, l’unica anomalia l’ho riscontrata nel “piedino” SI che nella mia scheda è ST (almeno penso, può essere un problema di stampa), un altro problema simile riguarda il GND, nell’ethernet shield che ho io ne ho due, uno accanto al positivo(3,3V) l’altro dalla parte opposta, ma non penso questo possa influire nell’esecuzione del programma.

        1. Per GND nessun problema, per il resto ti consiglio di seguire i collegamenti con le medesime posizioni come nell’articolo.

  16. Salve,
    volevo sapere se è possibile inserire un’immagine dal proprio pc che venga fuori nella pagina di controllo. Ho visto che la riga di codice se non sbaglio è questa:
    client.println(“ “);
    Grazie per l’attenzione.

    1. Salve,
      non è esattamente quella la riga del codice, in quanto quella è legata alla comunicazione del comando. Per rispondere alla tua richiesta, ci sono due alternative. La prima è quella di caricare in qualche webserver remoto l’immagine ed inserire il collegamento all’interno del codice. La seconda opzione è quella di utilizzare una scheda micro-SD da collegare ad Arduino e caricarci l’immagine, che verrà caricata dal micro. La prima strategia è sicuramente quella più semplice ed è quella che ho usato io.

  17. Magnifico tutorial, sto imparando moltissimo da te!
    Io volevo fare qualcosa di simile col relè ma invece di usare ethernet avevo bisogno di sparare una stringa via SERIALE RS232.
    Anche se non mi scrivi il come per esteso…potresti indirizzarmi per capire come cominciare almeno?

    Grazie!

  18. MITICO!!!
    Con la tua spiegazione (beccata al primo link della ricerca “attivare rele con arduino”) mi hai risparmiato almeno una nottata di ricerche e sbattimento per capire come funzionava l’ethernet shield ed il relè (bingo 2 al prezzo di uno).

    Grazie mille davvero.
    Il mio preparatore di cocktail mi attende e presto sarà realtà

    Saluti
    Giordy

    grazie ancora

    1. All’interno di uno sketch Arduino è possibile caricare una pagina HTML, CSS e JS, che verrà caricata dal browser del dispositivo che accederà al micro.
      La memoria di Arduino è limitata, quindi conviene inserire tale pagina all’interno di una scheda micro-SD. Tuttavia, in caso di progetti/prodotti complessi, conviene isolare le due parti attraverso l’utilizzo di un web server esterno. Ad esempio se devo accendere una lampada, invio ad un server Apache la richiesta (attraverso magari un meccanismo di login) e quest’ultima invierà il comando ad Arduino, via USB, bluetooth oppure attraverso la rete.

    2. Utilizza Arduino YUN
      costa qualcosina di più, ma hai già integrato sulla scheda Arduino:
      – ethernet
      – wifi
      – Linino
      – ecc….

      1. Sicuramente è un ottimo prodotto, ma troppo costoso. Conviene utilizzare un Raspberry PI Zero oppure Photon by Particle

    1. È possibile collegarsi da remoto alla lampada, aprendo la porta 80 del proprio router. In questo modo, sfruttando l’IP pubblico della connessione ADSL di casa, è possibile accedere alla pagina di controllo di Arduino.

        1. Non proprio. L’indirizzo che inizia con 192 è quello privato, cioè di Arduino all’interno della tua rete locale. L’altro indirizzo, molto probabilmente, è il tuo pubblico. Per poter accedere da remoto, basta che digiti il tuo indirizzo IP pubblico, a patto di aver aperto la porta 80 del router.

  19. Buomgiorno. E’ possibile creare un pagina di login sul web server della schield? In modo da poter accedere da fuori casa in sicurezza?
    Saluti

    1. Si arduino permette di caricare una pagina web html, come indicato nell’articolo. Purtroppo, a causa della piccola potenza di calcolo, non è possibile utilizzare il protocollo HTTPS e pertanto tutto il traffico inviato e ricevuto risulta essere in chiaro. È possibile utilizzare altri protocolli simmetrici, che in qualche modo aumentano il livello di sicurezza.

  20. Ciao, ho acquistato i componenti per realizzare il tuo progetto ( ENC28J60 module (http://tinyurl.com/zp6tm8r) un arduino board (http://tinyurl.com/j55dajw).
    Ho fatto i collegamenti come da questa figura: http://tinyurl.com/z6xhwge.
    Il relays lo avevo già acquistato precedentemente ma non arrivo fin li, non riesco a far funzionare la scheda di rete, ho controllato i collegamenti più volte e a me sembrano corretti, ho scaricato la libreria, la scheda, da quanto riportato dove l’ho acquistata, deve essere alimentata a 3,3 V, ma nulla sia con dhcp abilitato che con ip fisso la scheda non funziona. Potresti darmi una mano con qualche indicazione? Grazie.

    1. I problemi principali sono i collegamenti non corretti. Se il firmware è stato correttamente caricato, dovrebbe comparire qualche cosa dal seriale.

      1. Intanto grazie per la risposta, è la prima volta che mi cimento con Arduino per cui è probabile che io tralasci qualcosa. Non ho caricato il firmware ma solo lo sketch, i collegamenti sono descritti nell’immagine, ti chiederei gentilmente se puoi verificare se il collegamento è corretto.
        La scheda Arduino è l’ultima versione, la 3.

          1. Sono riuscito a capire dove era il problema. Nella riga di comando per l’inizializzazione della scheda ethernet mancava il parametro che indicava il pin di collegamento ChipSelect, che nel mio caso è l’8.
            Per cui ho corretto la riga dello sketch da cosi:
            if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
            a così:
            if (ether.begin(sizeof Ethernet::buffer, mymac, 8) == 0)
            Grazie.
            Maurizio

  21. Ciao, ho provato il circuito e funziona solo se è collegato il connettore USB di arduino.
    Una volta caricato il codice se stacco il cavo USB di arduino e lo alimento con un alimentatore, il circuito smette di funzionare.
    Per farlo funzionare è necessario eliminare tutte le righe di codice che riguardano la seriale, queste:

    ether.printIp(“My IP: “, ether.myip);
    //ether.printIp(“Netmask: “, ether.mymask);
    ether.printIp(“GW IP: “, ether.gwip);
    ether.printIp(“DNS IP: “, ether.dnsip);

    //Serial.println();

    Sai dirmi perchè?

    Inoltre puoi suggerirmi il codice che permette di caricare le due figure dei pulsanti on e off dalla cartella home del mio pC con linux, invece che dal tuo sito web?
    Questo perchè se il pc non è connesso a internet il sistema non carica il disegno dei pulsanti e non funziona.
    Ho provato e riprovato ma non riesco a ricavare il codice giusto.
    Penso che sia da modificare questa parte di codice.

    Un grazie mille per aver condiviso il tuo progetto.
    E un grazie se vorrari darmi un aiuto.
    Felice.

    1. Salve,
      per quanto riguarda il discorso alimentazione, penso sia un problema del circuito esterno contenente la batteria, in quanto nel codice non c’è alcuna funziona bloccante. Per quanto riguarda il discorso immagini, dal momento che la memoria di Arduino è limitata, conviene caricare su qualche spazio FTP/web le due immagini presenti sul PC Linux. In alternativa, è possibile fare un meccanismo locale, dove il server Linux funziona da web server e nel codice di Arduino, viene inserito il percorso dell’immagine relativamente al server locale.

  22. Il mio intento è ricevere un Din Don in casa quando apro la porta garage. faccio presente che utilizzo esclusivamente i power line come collegamento remoto.
    Quale interfaccia utilizzare per ottenere ciò e come?
    Grazie per eventuali info.

    1. Salve,
      ci sono diverse soluzioni. Il passaggio più critico complicato e la rilevazione dell’apertura del garage, che può avvenire con un magnete, oppure con un sensore di corrente. A questo sensore, è possibile collegare un micro, come Photon, Arduino, oppure Raspberry PI, che invia un pacchetto di rete ad un dispositivo in casa. È possibile anche ricevere una notifica sullo smartphone

      1. Grazie per aver considerato il mio post, era mia intenzione collegare un magnete filare collegandolo ad una interfaccia la quale inviasse via powerline un codice simulando l’apertura della porta.
        In casa una interfaccia anchessa collegata al powerline interpretando il codice fa suonare il campanello.
        Purtroppo le mie cognizioni in materia “arduino” sono ancora da scoprire e avvicinatomi ritengo molto dinamiche in molti settori. Posseggo un raspberry2 che uso come boxtv.
        Ho cercato sul web possibili informazioni
        di una simile necessità ma sembra che la mia sia qualcosa di singolare.
        Se posso avere ulteriori indicazioni su una possibile realizzazione ne sarei grato.
        Colgo l’occasione per gli auguri alle prossime festività.

        1. Si è possibile utilizzare anche le powerline, con due Arduino/micro che fanno da invio e ricezione del segnale di apertura. Se già dispone di un magnete, siamo a cavallo per la realizzazione.

          1. Avendo gia il magnete credo che se puoi illustrare i dettagli hardware e software passerei all’acquisto del nesessario e realizzazione finale.
            Nuovamente grazie.

          2. Salve,
            l’idea è quella di inviare un pacchetto TCP ad un Raspberry PI/Arduino, il quale emetterà un bip con un buzzer. Se è interessato al progetto, posso fare un piccolo articolo.

  23. Sono in attesa dell’articolo riguardo al progetto da me citato al fine di passare alla realizzazione certo che anche ad altri sarà sicuramente utile.

  24. Ciao, partendo da questa lezione vorrei accendere la lampadina da remoto, ma avere la possibilità di accenderla anche da un pulsante a muro, e magari da remoto conoscere il suo stato. E’ più un problema hardware che software. Mi spiego meglio.

    Ammettiamo di accendere una lampadina (carico) con un PULSANTE da muro collegato ad un relè classico Finder (credo passo-passo); questo circuito banale è con 220V/16A: spingo (non tengo premuto) il pulsante e la lampadina si accende, rispingo e si spegne.
    Vorrei con Arduino controllare in parallelo la lampadina (accenderla e spegnerla) e conoscere anche il suo stato (se arriva o meno tensione al carico, non corrente: non se la lampadina è fulminata o meno per intenderci, ma se “alimentata”).

    Quindi ad esempio qualcuno accende la lampadina dal pulsante a muro. Io con arduino interrogo (da remoto o visualizzo su un display) lo stato della lampadina, quindi so che è accesa e magari posso decidere di spegnerla (ad esempio con il button dalla pagina web o con un pulsante collegato ad arduino, in bassa tensione intendo).
    Posso sostituire il relè Finder, ma che siano controllabili sia in alta tensione (dal pulsante a muro,220V/16A) che in bassa (da arduino, 5V) e soprattutto mi restituiscano lo stato del carico (in bassa tensione per arduino) non ne ho trovati; non so se esitono.

    Che relè mi consigli di utilizzare (magari un link per l’acquisto) e come collegarlo alla lampadina e ad arduino?
    Forse la soluzione è usarne due di relè? Quali e come fare i collegamenti?

    Grazie,
    Tommaso

    1. Salve, non dovrebbero servire due relè.
      Analizzando il sistema dall’esterno, ci sono due input ed un’unica uscita. I due input sono il comando inviato via TCP/IP e l’altro il pulsante. L’uscita è accendere la lampadina/carico. Il carico viene alimentato direttamente dal 220V delle rete, attraverso un relè, che fa passare corrente se eccitato da una tensione/corrente, che avviene da uno dei due input. Il pulsante a muro, consiglierei di alimentarlo da Arduino con 5 Volt, in modo da eccitare il relè. Se il comando viene inviato dal TCP/IP, viene usato un PIN d’uscita digitale, che eccita la bobina del relè. Per stabilire lo stato del sistema, si può usare una variabile booleana, oppure intera, che viene modificata se si riceve un comando da TCP/IP, oppure se la tensione appena prima della bobina, è ALTA.
      Spero di essere stato chiaro. Qualora avesse ulteriori dubbi, rimango a sua disposizione.

I commenti sono chiusi.