Scheda relè remota con Arduino e Webduino

Come costruirsi una scheda relè e comandarla tramite Arduino ethernet e Webduino

Tra le applicazioni che trovo molto richieste è la scheda relè da gestire tramite smartphone. Utilizzando la libreria Webduino riusciamo a realizzare un dispositivo semplice e funzionale basato su pochi componenti quali Arduino Ethernet, dei classici relè, un router wifi (presente ormai nelle nostre abitazioni) e uno smartphone.

La figura seguente illustra il progetto di questo articolo:

Webduino ed Arduino Ethernet Gestione scheda rele

Arduino Ethernet è collegato tramite cavo lan al router e permette di gestire i relè collegati ai pin digitali tramite una applicazione web basata sulla libreria Webduino. Tramite lo smarthphone o un pc collegato alla rete locale possiamo gestire i relè semplicemente usando un browser web.

Per la parte software ho deciso di usare la libreria webduino perché fornisce tutto il necessario per la gestione delle richieste http.

Lo schema elettrico del prototipo che ho realizzato è il seguente:

Arduino ethernet scheda rele

Il codice caricato sul dispositivo è disponibile nel seguente listato:

[c]

#include <Ethernet.h>
#include <SPI.h>
#include <WebServer.h> //libreria webduino

//variabili statiche per il mac address e lìip address
static byte mac_Add[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//cambiare l’ip in funzione della propria rete
static byte ip_Add[] = {
192, 168, 0, 220 };
//creazione oggetto Webduino
WebServer webserver("", 80);

//Variabili booleane che memorizzano
//lo stato delle uscite collegate ai relè
boolean Rele1 = false;
boolean Rele2 = false;
boolean Rele3 = false;

//=============================================================================
//funzione pagina Start
void Start(WebServer &server, WebServer::ConnectionType type,
char *url_param, bool param_complete)
{
//restituisce al browser l’intestazione http 200 OK
server.httpSuccess();

//gestisco il tipo di richiesta HEAD
if (type != WebServer::HEAD)
{
String s = "";

if (param_complete == true)
{
s = url_param;

if ( s == "R1=ON")
{
Rele1 = true;
digitalWrite(2, HIGH);
}
else if ( s == "R1=OFF")
{
Rele1 = false;
digitalWrite(2, LOW);
}

if ( s == "R2=ON")
{
Rele2 = true;
digitalWrite(3, HIGH);
}
else if ( s == "R2=OFF")
{
Rele2 = false;
digitalWrite(3, LOW);
}

if ( s == "R3=ON")
{
Rele3 = true;
digitalWrite(4, HIGH);
}
else if ( s == "R3=OFF")
{
Rele3 = false;
digitalWrite(4, LOW);
}
}

//gestisco la pagina html in base allo stato delle uscite di Arduino
P(htmlHead) =
"<html>"
"<head>"
"<title>Arduino Scheda Rele</title>"
"</head>"
"<body>";

server.printP(htmlHead);

server.print("<table border=\"1\">");
server.print("<tr><td>Stato Rele</td><td>Comandi</td></tr>");

if(Rele1 == true)
server.print("<tr><td style=\"color: red;\">RELE 1 ON</td><td>");
else
server.print("<tr><td style=\"color: black;\">RELE 1 OFF</td><td>");

if(Rele1 == false)
server.print("<input type=\"button\" value=\"clicca qui\"
onclick=\"location.href=’index.htm?R1=ON’\">");
else
server.print("<input type=\"button\" value=\"clicca qui\"
onclick=\"location.href=’index.htm?R1=OFF’\">");

server.print("</td></tr>");

if(Rele2 == true)
server.print("<tr><td style=\"color: red;\">RELE 2 ON</td><td>");
else
server.print("<tr><td style=\"color: black;\">RELE 2 OFF</td><td>");

if(Rele2 == false)
server.print("<input type=\"button\" value=\"clicca qui\"
onclick=\"location.href=’index.htm?R2=ON’\">");
else
server.print("<input type=\"button\" value=\"clicca qui\"
onclick=\"location.href=’index.htm?R2=OFF’\">");

server.print("</td></tr>");

if(Rele3 == true)
server.print("<tr><td style=\"color: red;\">RELE 3 ON</td><td>");
else
server.print("<tr><td style=\"color: black;\">RELE 3 OFF</td><td>");

if(Rele3 == false)
server.print("<input type=\"button\" value=\"clicca qui\"
onclick=\"location.href=’index.htm?R3=ON’\">");
else
server.print("<input type=\"button\" value=\"clicca qui\"
onclick=\"location.href=’index.htm?R3=OFF’\">");

server.print("</td></tr>");

server.print("</table></body></html>");

}
}
//=============================================================================

void setup()
{
//inizializzo l’ethernet shield con il mac e il address
Ethernet.begin(mac_Add, ip_Add);

//definisci l’azione di default che verrà eseguita quando l’utente
//naviga nella root del sito
webserver.setDefaultCommand(&Start);
webserver.addCommand("index.htm", &Start);

//avvia il web server
webserver.begin();

delay(100);

//definisci i pin 2 3 4 in uscita
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);

//inizializza i le uscite
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);

}

void loop()
{
//elabora costantemente tutte le richieste provenienti dal browser
webserver.processConnection();
}

[/c]

Nonostante le numerose righe di codice potete capirne il funzionamento semplicemente leggendo i commenti che lo accompagnano.
L’interfaccia web per gestire i relè è la seguente:

Cliccando il bottone con la label “clicca qui” si ottiene una commutazione dello stato dei pin di uscita di Arduino e l’aggiornamento della label Stato Rele.

Interfaccia scheda rele web

Anche in questo caso con poco si ottengono dispositivi interessanti e utili.

41 risposte a Scheda relè remota con Arduino e Webduino

  • Ciao Marco!! Grandissimo!!! Lo proverò sicuramente!

  • Complimenti, Io sono alle prime armi ed il codice che hai scritto mi lascia senza fiato! Lo proverò senz’altro!

  • Ciao Marco!! ……intanto complimenti sia per tutte le guide che scrivi e i codici………..volevo porti una domanda:secondo lo schema da te disegnato il relè deve essere alimentato esternamente……..ma non posso usare i 5 v di Arduino? (La mia idea era proprio di riuscire a pilotare relè collegati ad arduino mega con sopra un ethernet shield dal pc o dal telefono tramite wifi )….

    Sperando di ricevere una risposta, ti ringrazio anticipatamente
    Federico

    • Ciao
      tutto dipende da quanta corrente assorbe il relè. Se usi un modello da 5v-40 mA, non hai nessun problema ad usare il pin 5V della scheda. Il regolatore di tensione posto sulla Mega può erogare tranquillamente anche 1A.

      a presto e grazie dei complimenti
      Marco

  • Ciao Marco,

    ho modificato il codice configurando altre uscite ma purtroppo più di 4 non si possono utilizzare (Se configuro la quinta il led in alto a destra della shield ethernet non si accende). Nella mia ignoranza penso che sia dovuto alla memoria limitata di arduino uno r3. Visto che la shield ethernet è fornita di uno slot SD, è possibile memorizzare la pagina web che gestisce il tutto all’interno della memoria esterna?

    Grazie

    • Ciao Mauro
      quando la memoria non è sufficiente, come nel tuo caso, devi usare per forza la memoria sd, prova a leggere questo articolo
      http://www.logicaprogrammabile.it/arduino-ethernet-memoria-scheda-micro-sd/

    • Buonasera a Tutti
      Sono 3 giorni che provo ad inserire altre uscite digitali nel programma di comando rele
      La cosa strana è che come inserisco nella linea di codice ” index.htm?R3=OFF” un valore diverso da R3 ma per esempio R4 oppure R5 oppure R7 ecc. il programma non gira, mentre se inserico valori di R1, R2 oppure R3 il programma gira senza bloccarsi
      Sapete darmi delle indicazioni
      Grazie 1000
      Fabio

    • Ciao
      Sto tribolando da tre giorni in quanto index.htm?R3=OFF se inserisco R4=OFF oppure R5=OFF , non funziona e il programma si blocca , mentre se inserisco un altro R3=OFF oppure R1=OFF non si blocca
      Cosa posso fare?

      • Ciao Fabio
        mandami il codice del tuo sketch via mail in modo da capire meglio quale sia il problema….
        a presto
        Marco

        • Ciao Marco
          Anzitutto grazie della disponibilità .
          Ti allego quanto richiesto , come vedi rispetto alla tua versione pubblicata ho inserito un altra uscita digitale e la visualizzazione degli ingressi analogici.
          Il problema è che quando scrivo nelle funzioni server.print “….index.htm?R4..”. anziché “….. index.htm?R3…..” non riesco a caricare più la pagina così come scriveva nella discussione sopra Mauro Galluccio .
          Il file occupa 19kb su 32 kb disponibili, quindi non penso sia un PB di menoria. Grazie 1000 iun anticipo !!!

  • Ciao Marco
    Ho visto dalla pubblicazione che non sono stati trasferiti codici HTML e sono stati sostituiti tutti da virgolette
    A quale e-mail posso mandarti lo sketch
    Grazie

  • Ciao Marco, per cominciare volevo farti i complimenti per gli articoli che scrivi perché mi hai chiarito molti dubbi! Io ho provato a eseguire lo sketch modificando alcuni parametri perché uso la Wifi shield però quando provo a compilare lo sketch arduino-1.0.2 mi da il seguente errore:“Errore durante la compilazione”. Questo è dovuto dal fatto che la libreria WebServer non è compatibile con la Wifi shield o sbaglio qualcosa?

  • Ciao Marco e Buon Anno

    Sto provando ad impratichirmi sulla scheda arduino ethernet ed ho caricato il programma per far funzionare i rele via http ma non riesco ad implementarne più di 4 al quinto mi da errore non mi trova la pagina del Brouser.
    Ho acquistato e montato la scheda relè di futura elettronica (Modulo I/O per arduino) cod. FT919K che funziona egregiamente ma purtroppo arrivo solo al quarto relè. Secondo il tuo parere potrebbe essere il brouser che non riesce a gestire il tutto ” io ho provato con firefox e google chrome” oppure è un problema di HTML.

    Grazie e a presto

    Daniele

    • Ciao Daniele
      è solo un problema di memoria ram, appena ho un momento ti mando il codice per usare 5 o più relè.
      Per risolvere il problema devi usare la funzione P per memorizzare le stringhe sulla eprom piuttosto che sulla ram.

      a presto
      Marco Lai

  • Ciao Marco

    Grazie mille per l’interessamento io intanto continuo a studiare sulla programmazione visto che sono alle prime armi con questi sistemi .
    Complimenti ancora per il forum.

    Ciao Daniele

  • Innanzi tutto un rigraziamento per quello che fate per noi poveri neofiti ancora “ignoranti” e assetati di conoscenza. Saluti cordiali a tutto il Forum.
    Ho provato a utilizzare il codice con copia e incolla ma ricevo un errore durante la compilazione del medesimo dove sbaglio.?
    Mi da errore su questa linea di comando …con qualsiasi versione di IDE .

    if(Rele1 == true)
    server.print(“RELE 1 ON”);

    Approfitto per chiedere se inserissi ulteriori linee di comando e aggiungo ulteriori relais esempio altri 5 per arrivare a 8 relais inserendo nei pin rispettivamente 5-6-7-8-9 le linee di comando.Può funzionare
    Ancora grazie per la risposta e saluti cordiali

    • Ciao Willy
      grazie per i complimenti, sempre graditi! Mi dici quale errore ti scrive l’ide?
      Puoi aggiungere altri relè ma devi stare attento a non sforare con la memoria di Arduino.

      a presto
      Marco

      • sketch_feb13a_rele_pde.cpp:3:43: error: WebServer.h: No such file or directory
        sketch_feb13a_rele_pde:89: error: missing terminating ” character
        sketch_feb13a_rele_pde:90: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:92: error: missing terminating ” character
        sketch_feb13a_rele_pde:93: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:103: error: missing terminating ” character
        sketch_feb13a_rele_pde:104: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:106: error: missing terminating ” character
        sketch_feb13a_rele_pde:107: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:117: error: missing terminating ” character
        sketch_feb13a_rele_pde:118: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:120: error: missing terminating ” character
        sketch_feb13a_rele_pde:121: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:11: error: ‘WebServer’ does not name a type
        sketch_feb13a_rele_pde:21: error: variable or field ‘Start’ declared void
        sketch_feb13a_rele_pde:21: error: ‘WebServer’ was not declared in this scope
        sketch_feb13a_rele_pde:21: error: ‘server’ was not declared in this scope
        sketch_feb13a_rele_pde:21: error: ‘WebServer’ has not been declared
        sketch_feb13a_rele_pde:22: error: expected primary-expression before ‘char’
        sketch_feb13a_rele_pde:22: error: expected primary-expression before ‘bool’

        questo è quanto scrive la IDE023

        sketch_feb13a_rele_pde:90: error: missing terminating ” character
        sketch_feb13a_rele_pde:91: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:93: error: missing terminating ” character
        sketch_feb13a_rele_pde:94: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:104: error: missing terminating ” character
        sketch_feb13a_rele_pde:105: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:107: error: missing terminating ” character
        sketch_feb13a_rele_pde:108: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:118: error: missing terminating ” character
        sketch_feb13a_rele_pde:119: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:121: error: missing terminating ” character
        sketch_feb13a_rele_pde:122: error: stray ‘\’ in program
        sketch_feb13a_rele_pde:12: error: ‘WebServer’ does not name a type
        sketch_feb13a_rele_pde:22: error: variable or field ‘Start’ declared void
        sketch_feb13a_rele_pde:22: error: ‘WebServer’ was not declared in this scope
        sketch_feb13a_rele_pde:22: error: ‘server’ was not declared in this scope
        sketch_feb13a_rele_pde:22: error: ‘WebServer’ has not been declared
        sketch_feb13a_rele_pde:23: error: expected primary-expression before ‘char’
        sketch_feb13a_rele_pde:23: error: expected primary-expression before ‘bool’

        questo è quanto scrive la IDE1.5.2

        Per il problema di memoria credo avendo un ARDUINO MEGA possa bastare !!? Purtroppo come dicevo non riesco a compilere lo sketch Ti rigrazio per la tua cortesia e una birra te l’ho offerta molto volentieri Saluti

        • Credo che tu non abbia installato la libreria, leggi l’articolo seguente per installare Webduino e per fare le prime prove
          http://www.logicaprogrammabile.it/utilizzare-la-libreria-webduino/

          a presto
          Marco

          • Ok grazie della dritta, ma copiando cut & paste non mi sono accorto che le righe 90/93 relais 1 e successive per gli altri relais, erano riportate a capo nella riga successiva !!!

            Ora compilando mi segnale ancora un errore !! il seguente

            avrdude: stk500_getsync(): not in sync: resp=0x00

            che propio non ho idea di come risolverlo !!!

            Grazie ancora per la tua disponibilità spero un giorno di poter ricambiare Saluti

  • Ciao
    anche io come moti ho incominciato da poco a interessarmi ad arduino e non essendo un programmatore ho difficoltà a programmarlo. Compilando alcuni sketch mi imbatto sempre nel solito errore: webserver webserver (“”, 80);
    Anche su molti esempi forniti dal programma ritorna il problema su questa stringa…..
    sapete aiutarmi?
    Grazie

    • Ciao
      hai installato correttamente la libreria Webduino? Segui questo link e verifica che la libreria funzioni.
      http://www.logicaprogrammabile.it/utilizzare-la-libreria-webduino/

      Il problema che mi descrivi è probabilmente generato dal fatto che la libreria non è installata.

      a presto
      Marco

      • a ok grazie mille era solo l’ errato posizionamento della cartella.. complimenti per il programma

        • scusa ancora ma data la mia inesperienza non capisco come fare ad accedere alla pagina dove ci sono gli stati dei relè e comandi…. puoi gentilmente spiegarmelo?
          grazie

          • Ciao Luca
            devi aprire il tuo browser e digitare l’indirizzo ip 192.168.0.220, vedi il codice variabile ip_Add

            • ci ho già provato ma mi dà “pagina inesistente” può essere legato al fatto che quando ha finito di caricare lo sketch mi appaiono diverse scritte “ardude: stk500v2_ReceivedMessage() : timeout”?

              • La compilazione non deve darti nessun warning e nessun tipo di errore. Evidentemente c’è ancora qualche problema. Mandami una mail (info [at] logicaprogrammabile.it) con tutto il codice per capire meglio.

                A presto

  • Ciao
    anche io come molti mi sono messo da poco a lavorare su un arduino mega con relativa ethernet shield e provando a caricare alcuni programmi gia fatti continua a darmi sempre un errore nel comando “server Web server(80)” oppure su quello “Webserver webserver (“”80)”
    Sapete aiutarmi?
    grazie

  • Ciao,
    ho bisogno di aiuto :)
    ho visto il tuo sketch del comando da remoto ed è ottimo.
    volevo fargli delle modifiche ma non ci riesco … sto impazzendo..
    magari puoi aiutarmi tu..
    ti spiego cosa vorrei fare..
    ….vorrei poter mettere una password per entrare da remoto..
    ….poi vorrei che i tre pulsanti azionassero per un secondo il led (funziona pulsante)
    ….ultima cosina… vorrei vedere da remoto lo stato dell’ ingresso 8.
    spero di essermi spiegato e ancor piu’ che tu possa aiutarmi…
    intanto grazie a presto ciao Enrico
    dimenticavo io utilizzo arduino ethernet
    ciao ciao

    • Ciao Enrico
      mandami via mail il codice che hai caricato sulla Arduino Ethernet all’indirizzo
      info @ logicaprogrammabile punto it

      Marco

  • ciao marco,
    come va?
    credi di riuscire ad aiutarmi?
    ciao graZie

  • Ottimo sito, veramente molto utile. Sono sotto esame e grazie a te stò riuscendo a preparare un ottima tesina. Però ho un problema, ho provato questo sketch, ma quando inserisco 4 o 5 comandi On Off, arduino cambia l’indirizzo della pagina ma non effettua cambi di stato. O addiurittura a volta invia un codice html distorto. E non riesco a trovare problemi nel codice… come posso fare?

    • Ciao Ciro,
      il problema nell’aggiungere relè, è che vai a tappare la poca ram di Arduino. Per ovviare devi memorizzare le stringhe sulla EEPROM, utilizzando l’istruzione P.
      ad esempio questa istruzione
      server.print(“

      RELE 2 ON“);
      puoi cambiarla così
      P(rele2on)=”

      RELE 2 ON“;
      server.print(rele2on);

      Se hai difficoltà mandami una mail col tuo sketch

      A presto
      Marco

  • quali modifiche dovrei portare se il mio indirizzo IP fosse dinamico DHCP?

  • Ho inserito questo codice nell’ide di arduino ma mi da diversi errori

    sketch_sep03a.cpp:91:7: error: missing terminating ” character
    sketch_sep03a.cpp:92:21: error: stray ‘\’ in program
    sketch_sep03a.cpp:94:7: error: missing terminating ” character
    sketch_sep03a.cpp:95:21: error: stray ‘\’ in program
    sketch_sep03a.cpp:105:7: error: missing terminating ” character
    sketch_sep03a.cpp:106:21: error: stray ‘\’ in program
    sketch_sep03a.cpp:108:7: error: missing terminating ” character
    sketch_sep03a.cpp:109:21: error: stray ‘\’ in program
    sketch_sep03a.cpp:119:7: error: missing terminating ” character
    sketch_sep03a.cpp:120:21: error: stray ‘\’ in program
    sketch_sep03a.cpp:122:7: error: missing terminating ” character
    sketch_sep03a.cpp:123:21: error: stray ‘\’ in program
    sketch_sep03a.cpp: In function ‘void Start(WebServer&, WebServer::ConnectionType, char*, bool)’:
    sketch_sep03a.cpp:92:21: error: ‘onclick’ was not declared in this scope
    sketch_sep03a.cpp:95:21: error: ‘onclick’ was not declared in this scope
    sketch_sep03a.cpp:106:21: error: ‘onclick’ was not declared in this scope
    sketch_sep03a.cpp:109:21: error: ‘onclick’ was not declared in this scope
    sketch_sep03a.cpp:120:21: error: ‘onclick’ was not declared in this scope
    sketch_sep03a.cpp:123:21: error: ‘onclick’ was not declared in this scope

    qualcuno mi può aiutare ?

  • Ciao,
    il progetto è grandioso mi sono appena avvicinato al mondo di arduino e sto leggendo i tuoi progetti, ottimo lavoro.
    Sono a porti una domanda da profano riesco a pilotare la scheda anche dalla mia casa in montagna?
    In più dovrei implementare la segnalazione di stato di 2 ingressi e la temperatura della casa, si puo fare?
    Il tutto mi servirebbe per controllare la caldaia che ho a casa, la valvola dell’acqua e sapere se il pressostato è scattato.
    Grazie in anticipo del tempo che mi dedichi..
    Ciao

Rimani aggiornato

La mia lista dei prodotti
Compra su Amazon Italia

Compra su Amazon Italia
Sondaggi

Arduino.cc vs Arduino.org

Visualizza risultati

Loading ... Loading ...
Seguimi su Twitter