Controllare Arduino da remoto con modulo Enc28j60

Salve a tutti,

il seguente programmino mi permette di far accendere o spegnere un LED da una pagina html che genera direttamente lo sketch di arduino:

#include <EtherCard.h>

static byte mac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

static byte ip[] = { 192, 168, 1, 7 };

//La variabile seguente è il cosiddetto buffer tcp/ip e contiene la richiesta ricevuta dal browser
byte Ethernet::buffer[700];

#define ENC28J60_CS 10
#define LED 7

//La pagina html viene salvata nella memoria programma (PROGMEM) come un array di caratteri:
const char accendiLED[] PROGMEM =
 
"HTTP/1.0 200 OK\r\n"
 
"Content-Type: text/html\r\n"
 
"Pragma: no-cache\r\n\r\n"
 
"<html><head><title>ARDUINO - ENC28J60</title></head>"
 
"<body><center>"
 
"<h1> - Arduino in rete - </h1>"
 
"<h2> - Test led - </h2>"
 
"<a href='/on'><input type='button' value=' - ACCENDI LED - '/></a>"
 
"</body>"
 
"</center></html>";
 
 
 
const char spegniLED[] PROGMEM =
 
"HTTP/1.0 200 OK\r\n"
 
"Content-Type: text/html\r\n"
 
"Pragma: no-cache\r\n\r\n"
 
"<html><head><title>ARDUINO - ENC28J60</title></head>"
 
"<body><center>"
 
"<h1> - Arduino in rete - </h1>"
 
"<h2> - Test led - </h2>"
 
"<a href='/off'><input type='button' value=' - SPEGNI LED - '/></a>"
 
"</center></body>"
 
"</html>";
 
 
 
 
 
void setup () {
  pinMode(LED, OUTPUT);
  Serial.begin(115200);
  Serial.println("ARDUINO IN RETE");
  Serial.println(" - TEST LED - ");
  Serial.println(" ");
  
  if ( !ether.begin(sizeof Ethernet::buffer, mac, ENC28J60_CS) )
    Serial.println("ERROR: ether.begin!");
 
 
 
if ( !ether.dhcpSetup() )
 
if ( !ether.staticSetup(ip) )
 
Serial.println("ERROR: Set IP failed!");
 
 
 
ether.printIp("Ip locale: ", ether.myip);
 
ether.printIp("Netmask: ", ether.mymac);
 
ether.printIp("Gateway: ", ether.gwip);
 
ether.printIp("Dns: ", ether.dnsip);
 
 
 
}
 
 
 
void loop() {
 
 
//salviamo nella variabile pos il valore di ritorno del metodo packetLoop: questo valore indica la posizione, all'interno dei buffer di ricezione, in cui inizia la richesta del browser 
word pos = ether.packetLoop( ether.packetReceive() );

/*Memorizziamo la risposta da inviare al browser utilizzando l'oggetto BufferFiller. Questo oggetto deriva dalla classe Print e viene costrutito passando l'indirizzo tcp0ffset del buffer
ethernet da cui partire per memorizzare la risposta*/
BufferFiller bfill = ether.tcpOffset();
 

/*Se pos è maggiore di 0, significa che abbiamo ricevuto effettivamente una richiesta e possiamo stampare su seriale(buffer+pos indica proprio la posizione da cui partire ad estrarre
i dati dal buffer di ricezione*/ 
 
if (pos)
{
  Serial.println(" ");
Serial.println("<hr class=\"bbcode_rule\">");
Serial.println( (char *) Ethernet::buffer + pos );
 
Serial.println("<hr class=\"bbcode_rule\">");
 
Serial.println(" ");
 
Serial.println(" ");
 
 
/*la funzione strstr verifica se nella richiesta ricevuta è presente la sottostrina "GET /on"*/
if ( strstr( (char *) Ethernet::buffer + pos, "GET /on") )
 
{
 
 /*Accende il led*/
digitalWrite(LED, HIGH);
 
Serial.println("Led acceso!");
 
 
 /*Il metodo emit_p() ci consente di inserire dati nel buffer: in questo caso verrà visualizzara la pagina che è stata memorizzata nella memoria programma spegniLED. Utilizziamo 
 la macro PSTR() per risparmiare spazio in memoria RAM*/
bfill.emit_p(PSTR("$F"), spegniLED);

/*Inviamo la risposta al browser*/
ether.httpServerReply( bfill.position() );
 
}
 
else if ( strstr( (char *) Ethernet::buffer + pos, "GET /off") )
 
{
 
/*spengo il led*/
digitalWrite(LED, LOW);
 
Serial.println("Led spento!");
 
 
 
bfill.emit_p(PSTR("$F"), accendiLED);
 
ether.httpServerReply( bfill.position() );
 
}
 
else if ( strstr( (char *) Ethernet::buffer + pos, "GET /led") )
 
{
 
if ( (int) digitalRead(LED) )
 
{
 
bfill.emit_p(PSTR("$F"), spegniLED);
 
ether.httpServerReply( bfill.position() );
 
 
 
Serial.println("Spegni LED!");
 
}
 
else
 
{
 
bfill.emit_p(PSTR("$F"), accendiLED);
 
ether.httpServerReply( bfill.position() );
 
 
 
Serial.println("Accendi LED!");
 
}
 
}
 
}
 
 
 
}

Poichè tale programma occupa già il 65% della memoria RAM, vorrei sapere se è possibile ottenere lo stesso risultato senza dover scrivere l'html in questo sketch ma su una pagina web che risiede in un dominio.

Grazie.

vorrei sapere se è possibile ottenere lo stesso risultato senza dover scrivere l'html in questo sketch ma su una pagina web che risiede in un dominio.

si
http://www.lucadentella.it/2013/04/22/enc28j60-e-arduino-14/

Ps: rimuovi Controllare Arduino da remoto con modulo Enc28j60 - Software - Arduino Forum non è nel posto giusto ne nella lingua giusta

Mi sa tanto che l'occupazione di memoria non dipende dalla pagina web nel programma ma dall'include
EtherCard.h, penso che questa libreria non sarà proprio piccolina.
Comunque avevo letto da qualche parte che la libreria in questione funziona con la shield ethernet arduino che si basa su un altro cip. Io con la scheda enc28j60 sto utilizzando questa:
GitHub - ntruchsess/arduino_uip: UIPEthernet: A plugin-replacement of the stock Arduino Ethernet library for ENC28J60 shields and breakout boards. Full support for persistent (streaming) TCP-connections and UDP (Client and Server each), ARP, ICMP, DHCP and DNS. Build around Adam Dunkels uIP Stack. Further developed version can be found on https://github.com/UIPEthernet/UIPEthernet.
saluti

Facendo ricerche sono riuscito parzialmente a mettere su quello che volevo. Dico parzialmente perchè dalla mia pagina web posso far accedendere un led cliccando su un bottone e ricevere risposta da arduino. Il problema è che se riclicco sullo stesso bottone per far spegnere il led (una volta che è acceso), la richiesta non arriva all'arduino e non capisco da cosa possa dipendere.

qui lo sketch di arduino:

#include <SPI.h>
#include <UIPEthernet.h> 

byte mac[] = { 0x90, 0xa2, 0xda, 0x0d, 0x05, 0x18 };
IPAddress ip(192,168,1,7);

EthernetServer server(80);

void setup(){
 Serial.begin(9600);
 Ethernet.begin(mac, ip);
 server.begin();
 pinMode(7, OUTPUT);
 Serial.println("ready");
}

void loop(){
 EthernetClient client = server.available();
 if (client) {
 while (client.connected()) {
 if (client.available()) {
 
 if( client.find("pinD7") ) { // search for 'GET'
 
 Serial.print("Digital pin high ");
 digitalWrite(7, HIGH);
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("Access-Control-Allow-Origin: *");
 client.println("messaggio");
 client.println();
 }
 
  // give the web browser time to receive the data
 delay(1);

 
 if( client.find("pinL7") ) { // search for 'GET'
 
 Serial.print("Digital pin low ");
 digitalWrite(7, LOW);
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("Access-Control-Allow-Origin: *");
 client.println("messaggio");
 client.println();
 }
 
 // give the web browser time to receive the data
 delay(1);
 client.stop();
 }
 }
}}

qui la pagina html:

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
<script>
$(document).ready(function() {
	$("#button1").show();
	$("#button2").hide();
});
</script>

<script>
   function invia(msg) {
    jQuery.support.cors = true;
	if(msg == "accendi"){
    $.ajax({
      crossDomain: true,
      async : true,
      type: "GET",
      data: "pinD7",
      dataType: "text/html",
      cache: false,
      url: "http://ledon.dlinkddns.com",
      success: function( r ){
         $( "#result" ).html("led acceso");//html( r );
		 $("#event").attr("src","ledon.png");
		 $("#button1").hide();
		 $("#button2").show();
      },
      error: function(){$( "#result" ).html("impossibile accendere il led");}
     });
	}
	else{
	$.ajax({
      crossDomain: true,
      async : true,
      type: "GET",
      data: "pinL7",
      dataType: "text/html",
      cache: false,
      url: "http://ledon.dlinkddns.com",
      success: function( r ){
         $( "#result" ).html("led spento");//html( r );
		 $("#event").attr("src","ledoff.png");
		 $("#button1").show();
		 $("#button2").hide();
      },
      error: function(){$( "#result" ).html("impossibile spegnere il led");}
     });
	
	}
    
    };
   
</script>
</head>
<body>
<center>
<input id="button1" onclick="invia('accendi')" type="button" value="Accendi led"/>
<input id="button2" onclick="invia('spegni')" type="button" value="Spegni led"/>
<div id="result">  
</div>
<img id="event" src="ledoff.png" alt="Accendi" title="Accendi" width="25" height="25"/>
</center>
</body>
</html>