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:


#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();
}

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.