Oggi ho scripto uno sketch per permettere ad Arduino di controllare via web un semplice LED. Questo esercizio apre le porte ai prossimi test per controllare da remoto alcune periferiche…una lampada, la caldaia, la lavatrice…
Per far girare lo sketch basta collegare un led in serie con la sua resistenza alla porta 9 di Arduino. Ricordarsi anche di cambiare l’IP in base alla rete a cui è collegato Arduino. Funziona anche dietro al router dall’esterno, basta fare NAT sulla porta 80 reindirizzando la comunicazione su Arduino. (se non si capisce chiedete…a qualcuno in grado di spiegarvelo meglio
)
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
/*
Simple Ethernet Test
Arduino server outputs simple text to browser
and controlling LED with simple checkbox
The circuit:
* Arduino Duemilanove
* Arduino Ethernet shield
* Basic FTDI breakout 5V
* LED connected to GND and digital pin 4 via resistor
*/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 5 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80); //server port
int ledPin = 9; // LED pin
char link[]="http://www.ioscripto.it"; //link data
String readString; //string
boolean LEDON = false; //LED status flag
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop(){
Client client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
readString.concat(c); //store characters to string
//if HTTP request has ended
if (c == '\n' && currentLineIsBlank) {
Serial.print(readString);
if(readString.indexOf("L=1") > 0) {//lets check if LED should be lighted
//led has to be turned ON
digitalWrite(ledPin, HIGH); // set the LED on
LEDON = true;
}else{
//led has to be turned OFF
digitalWrite(ledPin, LOW); // set the LED OFF
LEDON = false;
}
// now output HTML data starting with standart header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
// inizializzo pagina (da togliere se uso ajax)
client.print("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
//send first heading
client.println("<h1>LED CONTROL by internet connection by Viser</h1>");
client.println("<hr />");
client.println("<h1>LED control</h1>");
//address will look like http://192.168.1.110/?L=1 when submited
client.println("<form method=get name=LED><input type=checkbox name=L value=1>LED<br><input type=submit value=submit></form>");
client.println("<br />");
//printing LED status
client.print("<span>LED status: </span>");
if (LEDON) {
client.println("<span style='color:green'>ON</span>");
}
else
{
client.println("<span style='color:grey'>OFF</span>");
}
client.print("<h2><a href='/?L=1'>accendi!</a> | <a href='/?L=0'>spegni!</a></h2>");
//print link
client.println("<hr />");
client.print("<h2><a href='link'>Visita www.ioscripto.it!</a></h2>");
client.println("<hr />");
// chiudo pagina da togliere se uso ajax
client.println("</body></html>");
//clearing string for next read
readString="";
//stopping client
client.stop();
} //if c == /n .... devo capire che significa
} // if client available
} // while client connesso
} // if client
} //loop

Ciao sarei interessato ad applicare questa cosa a un progetto, solo che so poco o niente di arduino… Come fa l’Arduino a ricevere comandi dal web, cioè come è collegato a internet? So che esiste una cosa chiamata Ethernet shield…
Sì è proprio così, devi acquistare un modulo aggiuntivo che si chiama Ethernet Shield costa circa 30 euro. L’Ethernet Shield viene montato sopra Arduino (core) e tramite apposite librerie e appositi comandi caricati sul microcontrollore è possibile far funzionare arduino come un client e/o un server e/o un’altro dispositivo di rete.
Ciao ti faccio i complimenti è un ottimo progetto!
Non ho però capito una cosa. Il client web, esempio il telefono o un altro pc, a che sito web dovrebbe connettersi per controllarlo? E come andrebbe scritto sul programma di arduino?
Cioa,
il sito come dici te lo fa Arduino stesso, quindi per connetterti devi utilizzare l’indirizzo IP di arduino. Credo di averti risposto anche su http://www.giannifavilli.it
Ciao,
Gianni
Ciao, ho seguito il tuo esempio, quando clicco su accendi il led rimane accesso mentre carica, poi si spegne subito, come mai?
Ho fatto diverse prove, il problema dipende da google chrome, strano!
mi potresti spiegare per favore che modifiche dovrei fare all’inizio del codice (subnet e gateway) se l’arduino è collegato direttamente al router e perche usi un ip che inizia con 192.168 quando tutti router nelle loro reti locali hanno indirizzi che iniziano con questi numeri, non so se mi spiego, ma vorrei capire bene come e dove mettere un ip che sia unico per il mio arduino e che sia accessibile anche dall’esterno della rete locale