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:
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:
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.
Anche in questo caso con poco si ottengono dispositivi interessanti e utili.
Related posts
41 Comments
Lascia un commento Annulla risposta
Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test
Ciao Marco!! Grandissimo!!! Lo proverò sicuramente!
Ottimo!
fammi sapere …
a presto
Marco
Complimenti, Io sono alle prime armi ed il codice che hai scritto mi lascia senza fiato! Lo proverò senz’altro!
Grazie!
mi fa piacere esserti stato utile
a presto
Marco
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
https://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 Andrea
grazie dei complimenti e auguri per il nuovo anno
per usare il modulo wifi devi usare la libreria wifi al posto della ethernet
sul sito ufficiale trovi tutte le info
http://arduino.cc/en/Reference/WiFi
a presto
Marco
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
https://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
Mi rispondo da solo board sbagliata nella sezione tool ….. Grazie e scusate
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.
https://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(“
puoi cambiarla così
P(rele2on)=”
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 ?
scusate ho risolto
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