Chiedo scusa per la presentazione, ero convintissimo di averlo fatto, al tempo, quando mi sono registrato al forum =)
Il modello di arduino in uso è arduino UNO (come da titolo).
Permettetemi di spiegare meglio cosa intendo fare (e vi chiedo comprensione perché ho sempre difficoltà a spiegare quello che intendo dire
):
Ho un webserver apache+PHP+mySQL su una macchina nella mia rete locale (intendo poi spostare il webserver su un raspberry PI).
Ho poi un arduino collegato alla rete tramite enc28j60 usando libreria etherCard (piccola precisazione: non ho trovato documentazione alcuna su questa libreria, se avete link a portata di mano che spiegano o almeno elencano i metodi invocabili sarebbe grandioso).
Quello che cerco di realizzare e che vorrei sapere se è possibile fare, prima di perdere tempo salute e lavoro, è:
E’ possibile usare uno o più arduino in rete da interrogare sia per input che per output dati e far processare questi dati al webserver?
vi posto un piccolo sketch poco ottimizzato e scritto male ma che diciamo “funziona”:
#include <EtherCard.h>
#define pinLed 9
#define STATIC 1
#if STATIC
// ethernet interface ip address
static byte myip[] = { 192,168,109,161 };
// gateway ip address
static byte gwip[] = { 192,168,109,254 };
#endif
// ethernet mac address - must be unique on your network
static byte mymac[] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};
byte Ethernet::buffer[500]; // tcp/ip send and receive buffer
void setup(){
Serial.begin(57600);
pinMode(pinLed,OUTPUT);
if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
Serial.println( "Failed to access Ethernet controller");
#if STATIC
ether.staticSetup(myip, gwip);
#else
if (!ether.dhcpSetup())
Serial.println("DHCP failed");
#endif
ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);
}
void loop(){
word len = ether.packetReceive();
word pos = ether.packetLoop(len);
if (pos)
{
char* request = (char *)Ethernet::buffer + pos;
// if the request is for the "default" page
if(strncmp("GET /?", request, 6) == 0) {
Serial.println("trovata stringa di GET");
String richiesta= (String)request;
int posizioneHTTP = richiesta.indexOf('HTTP');
Serial.println("Posizione HTTP nella stringa: " + posizioneHTTP);
String parametri = richiesta.substring(6,posizioneHTTP-4);
Serial.println(parametri);
}
if(strncmp("GET /?pippo=1", request, 13) == 0) {
Serial.println("status=1");
digitalWrite(9, HIGH);
}
if(strncmp("GET /?pippo=0", request, 13) == 0) {
Serial.println("status=0");
digitalWrite(9, LOW);
}
}
}
Dopo la fase di inizializzazione del controller ethernet ricerco “HTTP” per isolare la richiesta che passo col get dal webserver e poi l’if/else elabora la stringa settando HIGH/LOW sul pin 9 al quale ho collegato un led. Roba semplicissima insomma.
Lato server la paginetta basilare che ho scritto, con l’ausilio di jQueryMobile, è la seguente:
<!DOCTYPE html>
<html>
<head>
<title>Web Server Domotica</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
<link rel="stylesheet" href="resources/css/domotica_custom.min.css" />
</head>
<body>
<div data-role="page" data-theme="d" id="pagina1">
<div data-role="header" data-theme="d">
<h1>Domotica</h1>
</div><!-- /header -->
<div data-role="content" data-theme="d">
<label for="flip">Pin 9 di Arduino:</label>
<select name="flip" id="flip" data-role="slider">
<option value="off">O</option>
<option value="on">I</option>
</select>
</div><!-- /content -->
</div><!-- /page -->
</body>
</html>
<script>
var val;
$('#flip').on('slidestop', function() {
val=$('#flip').val();
console.log(val);
if(val=='off'){
$.ajax({
url: "http://192.168.109.161",
data: "pippo=0",
type: 'GET'
});
}
else{
$.ajax({
url: "http://192.168.109.161",
data: "pippo=1",
type: 'GET'
});
}
});
</script>
Il funzionamento di tutto l’apparato è altalenante. A volte va, a volte no. A volte si accodano una serie di get prima di essere processati, per poi apparire nella console 7/8 di fila (credo che sia una questione di buffer non ottimizzato o l’assenza di un’istruzione flush() che non so nemmeno se esista nella libreria ethercard).
Inutile dire che un funzionamento altalenante equivale ad un non funzionamento ergo spero che qualcuno più bravo e capace di me (e non ce ne vuole molto, sinceramente) mi dia una dritta o un’illuminazione su dove correggere eventuali errori o qualche tips per rendere più stabile il funzionamento.
Se fosse poco chiaro e confusionario, sarò ben lieto di tentare di spiegarmi ancora per quanto mi sia possibile 
Grazie in anticipo di cuore
Luca