Arduino + Ethernet Shield

L'obbiettivo del progetto è quello di attivare 3 uscite di Arduino mediante l'Ethernet Shield con una pagina web visibile tramite qualsiasi browser da PC o smartphone sarà anche possibile verificarne lo stato di attivazione.


Il codice fa riferimento ad un webserver installato su di una rete interna, ma si può modificare il codice senza nessun problema instradando la connessione sul proprio router tramite un servizio di dynamic DNS come http://www.dyndns.com/ o uno di quelli qui elencati http://it.wikipedia.org/wiki/Dynamic_DNS.




[sourcecode language="cpp"]

/*
Controllo remoto
Ottobre 2012
*/
//Librerie necessarie

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

//Creao un array di byte per specificare il mac address
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//creo un array di byte per specificare l'indirizzo ip
byte ip[] = {192, 168, 2, 17}; //modificate questo valore in base alla vostra rete

char DatiRX;

String informazione = "";
// int presdati = 0;
byte out2 = 0;
byte out5 = 0;
byte out6 = 0;

//creato un server sulla porta specificata
EthernetServer ArduinoServer(80);

void setup()
{
// inizializza Serialeper monitor seriale
// Serial.begin(9600);
// inizializza lo shield Ethernet
Ethernet.begin(mac, ip);
// inizializza l'oggetto server
ArduinoServer.begin();

//definisco ipin2 ,pin5 e pin6 come uscite
pinMode(2, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
}
void loop()
{
//svuoto la variabile informazione
informazione = "";

EthernetClientpc_client = ArduinoServer.available();

//controllo sepc_client è true
if (pc_client != false)
{
//controllo continuamente che il client è connesso
while (pc_client.connected())
{
//Controllo se ci sono byte disponibiliper la lettura
if (pc_client.available())
{
//leggo i byte disponibili
//provenienti dal client
DatiRX = pc_client.read();
//ricostruisco la stringa ricevuta concatenando i singoli byte
informazione += DatiRX;

//Attendo che tutti i byte siano letti
//quando Data_RX contiene il carattere
//di nuova line capisco tutti i byte sono
//stati letti
if (DatiRX == 'n')
{
// cerco all'interno della stringa ilparametro che mi interessa
// cone la scrittapIN, sepresente il valore della variabile cmd
// sarà maggiore di 0
// presdati = informazione.indexOf("PIN");
// if (informazione > 0)
// {
// istruzioni da eseguire
// }
//Piloto l'uscita e invio lo stato al browser
if (informazione.indexOf("2ON") > 0)
{
digitalWrite(2, HIGH);
out2 = 1;
}
if (informazione.indexOf("2OFF") > 0)
{
digitalWrite(2, LOW);
out2 = 0;
}

if (informazione.indexOf("5ON") > 0)
{
digitalWrite(5, HIGH);
out5 = 1;
}
if (informazione.indexOf("5OFF") > 0)
{
digitalWrite(5, LOW);
out5 = 0;
}

if (informazione.indexOf("6ON") > 0)
{
digitalWrite(6, HIGH);
out6 = 1;
}
if (informazione.indexOf("6OFF") > 0)
{
digitalWrite(6, LOW);
out6 = 0;
}
//Invio la risposta al client
//invio lo status code
pc_client.println("HTTP/1.1 200 OK"); //imposto il data type
pc_client.println("Content-Type: text/html");
pc_client.println(); //invio codice html
pc_client.println("<html><body style="background-color: #008080" text="#FFFFFF">");
pc_client.println("<h1 class="auto-style1">Controllo remoto Arduino WebServer<hr/></h1>");
pc_client.println("<head>");
pc_client.println("<META HTTP-EQUIV='refresh' CONTENT='7; /'>"); // refresh automatico pagina html
pc_client.println("<title>DromegaHouse WebServer</title>");
pc_client.println("<style type="text/css">");
pc_client.println(".auto-style1 {text-align: center;}");
pc_client.println("</style>");
pc_client.println("</head>");
pc_client.println("<table style="width: 100%"><tr>");
pc_client.println("<td class="auto-style1">USCITA<hr/></td>");
pc_client.println("<td class="auto-style1" colspan="2">PILOTAGGIO<hr/></td>");
pc_client.println("<td class="auto-style1">STATO<hr/></td></tr>");
pc_client.println("<tr><td class="auto-style1">OUT 2</td>");
pc_client.println("<td class="auto-style1"><a href="http://192.168.2.17/2ON">ON</a></td>");
pc_client.println("<td class="auto-style1"><a href="http://192.168.2.17/2OFF">OFF</a></td>");
pc_client.println("<td class="auto-style1">");
if (out2 == 0)
{  pc_client.println("Spento"); }
else { pc_client.println("Acceso"); }
pc_client.println("</td></tr>");
pc_client.println("<tr><td class="auto-style1">OUT 5</td>");
pc_client.println("<td class="auto-style1"><a href="http://192.168.2.17/5ON">ON</a></td>");
pc_client.println("<td class="auto-style1"><a href="http://192.168.2.17/5OFF">OFF</a></td>");
pc_client.println("<td class="auto-style1">");
if (out5 == 0)
{  pc_client.println("Spento"); }
else { pc_client.println("Acceso"); }
pc_client.println("</td></tr>");
pc_client.println("<tr><td class="auto-style1">OUT 6</td>");
pc_client.println("<td class="auto-style1"><a href="http://192.168.2.17/6ON">ON</a></td>");
pc_client.println("<td class="auto-style1"><a href="http://192.168.2.17/6OFF">OFF</a></td>");
pc_client.println("<td class="auto-style1">");
if (out6 == 0)
{  pc_client.println("Spento"); }
else { pc_client.println("Acceso"); }
pc_client.println("</td></tr>");
pc_client.println("</table>");
pc_client.println("</body></html>");

//aspetto 1 ms affinche la risposta giunga al browser del client
delay(1);
//uscita dal ciclo while dopo la risposta while (pc_client.connected())
break;
}
}
}
//chiudo la connessione
pc_client.stop();
}
}

[/sourcecode]

Per info contattatemi.
Nel prossimo articolo pubblicherò di come usare lo shield ethernet per la lettura di segnali e trasferirli in modo continuo in un file sui server Google.

Commenti

  1. Complimenti per l'ottima realizzazione, è possibile, e come, modificarla per una risoluzione 480 x 800 ( polsanti più grandi e ravvicinati per smartphone ), e soprattutto avendo un ip statico come modificare il programma per farlo funzionare dall'esterno. Ho provato a modificare la porta server ho visto che non rispondeva allora, leggendo attentamente il listato, ho scoperto che ci sono gli indirizzi per le rispettive uscite, correggendoli e aggiungendo i due punti seguiti dalla porta tutto a ricominciato a funzionare nella rete interna. Invece entrando nella rete dall'esterno sulla porta corretta arrivo a vedere l'interfaccia ma a ogni interrogazione risponde sull'indirizzo della rete interna. Dove sto sbagliando?
    Ancora complimenti.
    Stafano

    RispondiElimina
  2. Per quanto riguarda la risoluzione (480x800) va modificato il codice HTML in modo da adattare la tabella. Questo lo puoi fare alla riga 123 sostituendo i parametri per la dimensione della tabella con questi:

    width: 480px

    da cosi:
    table style="width: 100%"
    a cosi :
    table style="width: 480px"

    Per avere delle scritte più grandi puoi inserire il seguente codice dopo la riga 120:
    pc_client.println(".auto-style2 {text-align: center;font-size: xx-large;}");

    e poi modificare a piacimento tra la 124 e 146 lo auto-style1 in auto-style2

    Se queste modifiche andranno a buon fine ci sentiamo per l'indirizzamento esterno

    RispondiElimina

Posta un commento