[Help] Domotica con WebServer Arduino

Questo è il codice.

Spero di aver scritto correttamente il path (ora mi viene il dubbio sullo slash). Cmq il Jquery-1.7.1.jr è nella stessa cartella del file prova_1.html.

<!DOCTYPE html>
<html>
	<head>
  		<script type="text/javascript" src="/jquery-1.7.1.js"></script>
	</head>
	<body>
		<script type="text/javascript">
			var babbuini = [ "192.168.0.3", "192.168.0.4", "192.168.0.5", "192.168.0.6"];
			$("document").ready(function(){
				$("#cmd01").click(	
					function() {
						$.each(babbuini, function() {
							$.ajax({
								type: "GET",
								// url chiamata: http://192.168.0.X/baBBuino?params
								url: "http://" + this, data:  "b1"
	   					});
					});
				});
			});
		</script>
		<input type="button" id="cmd01" value="Invia baBBuino" />

	</body>
</html>

Amico pitusso... sono un baBBeo, anzi no, un BaBBuino!

Ho levato lo slash dal pat e, appena clikkato il pulsante, è partito un albero di nmatale in Console di funzioni GET, che ha ripetuto 2 volte prima di arrestarsi.

Però, pur avendo aperta di fianco la pagina del BaBBuino 192.168.1.5 (uno di quelli dentro la lista), non è successo un tubo. Ho provato più volte ma nulla, la pagina di Firefox rimane piantata con il numero IP senza che compaia la stringa "b1" quella che mi fa accendere la 1a luce.

Ora provo ad aprire la console sul BabbUino per vedere se capta le chiamate GET.

Allora...

adesso il pulsante pare funzionare (avevo sbagliato anche gli IP, mettendo 192.168.0 invece che 192.168.1...). Però mi da quell'errore 200OK con i millisec della trasmissione.

L'IP target è il 192.168.1.5. Gli altri IP danno errore perchè ora sono scollegati dallo Switch, quindi non fateci caso.

Ciao
200 Ok è la risposta in codice che ti da la Get dicendo che la richietsa ha avuto successo...

E come mai c'è la X rossa?

Cmq io mi aspetto che:

  • Finestra aperta del pulsante che invia i GET
  • di fianco Finestra aperta del WebServer dentro il BaBBuino
  • quando clikko il pulsante della finestra 1 devo vedere qualcosa nella finesra 2, chessò, un aggiornarsi della pagina, un comparire il dato inviato sulla barra degli indirizzo, un mostro alieno che mi sukkia il cervello, insomma, qualcosa.

Invece tutto statico e non succede nulla alla pagina del BaBBuino

Ascolta...
Parti dalla base....
Fai una cosa del genere

Prima dichiari tanti boolean quanti sono gli stati che devi controllare su ogni arduino...
Cosi:

boolean flag1 = false; //Inizializzo lo stato  su spento
boolean flag2 = false; //Inizializzo lo stato  su spento

Poi metti questo nel loop

void loop(){
Client client = server.available();
if (client) {
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
        readString.concat(c);
      if (c == '\n' && currentLineIsBlank) {
         Serial.print(readString);
         client.println("HTTP/1.1 200 OK");
         client.println("Content-Type: text/html");
         client.println();
         if(readString.indexOf("tuocomando=1") > 0) {
          digitalWrite(3, HIGH);
          flag1 = true;
}
          if(readString.indexOf("tuocomando=0") > 0) {
          digitalWrite(3, LOW); 
          flag1 = false;
}
          if(readString.indexOf("tuocomando1=1") > 0) {
          digitalWrite(4, HIGH);
          flag2 = true;
}
          if(readString.indexOf("tuocomando1=0") > 0) {
          digitalWrite(4, LOW); 
          flag2 = false;
}
           if (flag1) {
              client.print("ON");
              client.print(",");
            }
            else
            {
              client.print("OFF");
              client.print(",");
          }
          if (flag2) {
              client.print("ON");
            }
            else
            {
              client.print("OFF");
          }
        //Resetto "String" per la prossima lettura
        readString="";
        //Fermo il client
        client.stop();

Ecco questo è un esempio semplicissimo, stampo in una pagina html lo stato separato da una virgola, (quindi in formato csv)
Io uso questo csv in un applicazione android che legge ogni valore separato dalla virgola e lo interpetra.. ON o OFF e cambia stato a seconda di quello che legge..

Se vuoi fare lo stesso su un browser lo puoi fare, ma credo che se vuoi che lo stato ti cambi devi anche autoaggiornare la pagina.. altrimenti con il cavolo che vedi qualcosa...

Altrimenti mi ricordo che c'era a suo tempo usai una libreria che sfruttava dei token per salvare lo stato..
Era ottima.. e usava la microsd...

Mi sembra che fosse WebduinoSD realizzata da Gianni C

Buon divertimento

Ma i miei Arduino funzionano perfettamente. Ho solo bisogno di una pagina che mi controlla qualche funzione contemporaneamente.

Tipo un pulsante che mi spegne tutte le luci in una botta sola, senza dover premere uno per uno tutti i pulsanti di tutte le singole finestre degli arduino.

Il tuo codice dovrebbe fare quello che già ho...

BaBBuino:
Ma i miei Arduino funzionano perfettamente. Ho solo bisogno di una pagina che mi controlla qualche funzione contemporaneamente.

Tipo un pulsante che mi spegne tutte le luci in una botta sola, senza dover premere uno per uno tutti i pulsanti di tutte le singole finestre degli arduino.

Il tuo codice dovrebbe fare quello che già ho...

un ciclo che ti richiama i vari client(babbuini :slight_smile: ) non andrebbe bene ?

I BaBBuini sono configurati come WebServer. Cosa intendi?

Clicchi su un comando OFF generale (è un esempio)
con un ciclo cambi l'IP dell arduino che consideri e con un altro comando li spegni uno ad uno...

Però ora che ci penso non saprei nemmeno da dove iniziare.. :blush:

Si, ho capito ora.

Il problema è il comando!

Che comando uso? Quale funzione mi può spedire una stringa alla pagina del BaBBuino?

Ho usato il sistema di pitusso, sembra che qualcosa spedisca, ma la pagina del BaBBuino non si muove, non riceve nulla.

Per aprire un BaBBuinmo digito nel Browser semplicemente il suo IP, Es: 192.161.1.5

Quando clikko su un pulsante di una luce, il Babbuino si auto-spedisce una stringa che poi intercetta e fa accendere la luce. Appena schiaccio il pulsante, la pagina si aggiorna e nella barra dell'indirizzo compare l'IP, seguito dalla stringa che si è auto-spedito: 192.168.1.5/L1_On.

Quella L1_On viene verificata da un ciclo e mi fa accendere la luce.

Posso anche scriverlo direttamente a mano nella barra dell'indirizzo: http:\192.168.1.5/L1_On

In questo modo mi si apre la pagina del BaBBUino con la luce già direttamente accesa.

Ora ci vorrebbe un programma che mi spedisce la stringa L1_OFF a tutti gli arduino contemporaneamente.

Adesso per spegnere tutte le luci, devo passarmi a mano il pulsante L1 di tutti gli arduini (uno per stanza della casa).

Anche le tapparelle motorizzate: sarebbe una figata se quando vado a dormire (o esco di casa) con un solo pulsante le tiro giù tutte in una volta.

Tu lo vuoi da lato client?

quindi una funzione javascript che sepdisca tutti i valori a off

ma forse non ho capito la domanda

Luca

Si, lato client.

Il Client non sarebbe altro che un PC Touch screen appeso alla parete del salotto.

Mi costruisco una pagina HTML che risiede dentro quel PC e che quando la clikko mi spedisce il comando a tutti i BaBBuini che ho per la casa.

Questa pagina poi la uso come Index.html per entrare da fuori con vari iPhone, iPad, Android, etceram.

Ora mi faccio una pagina finta (senza comandi che ovviamente non so) per far capire meglio.

Una pagina del genere che non è dentro nessun arduino ma dentro il Client e che invia i comandi agli arduino tramite indirizzo IP:

qui [Help] Domotica con WebServer Arduino - #13 by BaBBuino - Generale - Arduino Forum ti è stata data la soluzione, tutti i client e server lavorano con i get e post e relative risposte 200 ... 404 ecc

nel tuo caso devi usare jquery
esempi
http://api.jquery.com/jQuery.get/
http://api.jquery.com/jQuery.post/

a quanto pare o non leggi o non apprendi, o forse vuoi un prog gia fatto....anche se 2 esempi già fatti ti sono stati presentati e più di una volta .

saluti

Abbi pazienza ma sono un Elettronico prestato alla programmazione, quindi con tutti i limiti del caso.

Se tu mi scrivi un esempio così, dando per scontato che capisco tutto, allora manca un pò di capacità di insegnamento.

$(document).ready(
function() {
var lightBulb = new Button($("#lightbulb"));
ledStatus(lightBulb, "/ledstatus");
});

Sicuramente sei bravo, ma ho difficoltà a capire cosa mi hai scritto, e il link non è risolutivo. Non nel senso che mi devo studiare il JQuery per una cosa che magari non userò mai più in vita mia.

Se qualcuno mi chiede un circuito elettronico per far lampeggiare un LED, non gli faccio uno schema di principio e gli metto il link del datasheet, invitandolo a studiarsi le giunzioni dei semiconduttori all'Arseniurio di Gallio, ma cerco di dare descrizione di ciò che ho disegnato, cercando di essere più esaustivo possibile, adeguando il linguaggio alla capacità di comprensione del mio interlocutore.

Questo, almeno secondo la mia modestissima opinione, dovrebbe essere e servire un Forum.

ok. allora quello che chiedi comporta molta pazienza e prove, non è proprio semplice semplice. Non ti parlerò in termini scientifici.

  1. la tua pagina sul computer con monitor appeso al muro arriva dal pc, fin quì è chiaro, che piattaforma ha il programma di gestione? php? vb? o cosa? come ti collegi ai 6 arduini digitando semplicemente l'ip sulla barra?
  2. bisogna sapere, quando entri negli arduini e richiami l'IP cosa viene caricato? un index da sd o una pag web proveniente dallo sketch?
  3. per implementare le chiamate bisogna avere uno sketch pde almeno nelle parti riassuntive dove apri il client if (client.available()) ecc ecc altrimenti resta difficile dirti dove inserire i pezzi.
    4)bisogna creare un file di gestione delle chiamate js che viene caricato dallo index in questo formato nella parte head sempre che gli arduini abbiano una sd (sarebbe + semplice)
..................... ......................

Questo detto qui sopra ti permetterebbe di avere un sistema complesso e autonomo con uno scambio discreto di dati con ciascun arduino usando Api jquery autoaggiornamento upload, download di file, gestione remota dei log, logiche degli sketch modificabili da remoto, ecc (che attualmente faccio con SD)

Un altro sistema senza troppi dialoghi ma scarso di informazioni è:
il tuo bottone generale "spegni le luci di tutti gli arduini" deve lanciare una serie di comandi
http://192.168.1.100?L="spegnitutto"
http://192.168.1.101?L="spegnitutto"
http://192.168.1.102?L="spegnitutto"
http://192.168.1.103?L="spegnitutto"
http://192.168.1.104?L="spegnitutto"
http://192.168.1.105?L="spegnitutto"

la stringa "spegnitutto" dovrà essere intercettata e correttamente interpretata dallo sketch di ciascun arduino....... ma il punto qual'è ??? Mettere Gli Arduino in ascolto

Detto questo seguendo il secondo caso più semplice ancora, non hai più bisogno di avere delle righe html dentro gli sketch, che ti interessa avere delle pagine su ciascuno, ma creare un unica pagina dentro al pc client con sei pagine o una unica come ti pare, che non fa altro che inviare nell'indirizzo ip anche l'istruzione da eseguire una volta premuto il tasto.
Intanto che invii l'istruzione dici allo sketch di risponderti e in allegato al dato di risposta ti fai mandare tutti i dati degli stati che poi visualizzi a schermo. A ogni domanda c'e' sempre una risposta positiva o negativa, se manca una di queste si ottiene un Timeout (il server non risponde!!) Ovviamente come dicevo prima lo scketch di ogni arduino deve restare in ascolto

L'argomento webserver qui è ancora poco trattato, forse di poco interesse, difficile avere valanghe di opzioni.

dai queste info e vediamo cosa si puo' fare, non solo io perchè non sono un genio in prog, ma mi sbatto anche mesi finchè non ottengo quello che voglio :slight_smile: e picchiandomi ho imparato diverse cose.

ciao

Lo schetch è un collage modificato e riarrangiato all'uso, dopo innumerevoli tentativi e, alla fine, ho raggiunto una certa stabilità di funzionamento. Quindi dietro il copia/incolla, si nasconde molto lavoro di adattamento, quale mi ha permesso di comprendere i meccanismi di funzionamento, cioè, ora so come funziona!

La pagina HTML è mezza caricata con la direttiva PROGMEM e mezza printata con il solito:

client.println() "";
client.println() "";
client.println()"";
ecc.
ecc.

Il PC Touch è un Windows XP, e la pagina è una bovina HTML, con qualche richiamo di JavaScritp. Nulla di che. Niente php, Ajax o altri linguaggi esoterici. Non ne sono capace, a meno che di non trovare qualcosa di già fatto e di fare il "reverse engeneering" con un bel copia/incolla.

L'Arduino ha la Ethernet con SD, ma questa non è usata, e tutto rimane dentro lo sketch.

Il Client.available() e tutta la manfrinma per mettere in ascolto il WEbServer c'è, e la Pagina HTML parte proprio dopo che il client è disponibile. Di default in ascolto sulla 80, ma adesso ho provato ad usare porte diverse per poter diversificare le pagine quando arrivo da "fuori", attraverso il Router, ma questo problema l'ho risolto.

//--------------------------Start Client
Client client = server.available();

int led=0;
if (client) {

// an http request ends with a blank line
boolean current_line_is_blank = true;
while (client.connected()) {

if (client.available()) {

char c = client.read();
// if we've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so we can send a reply
if (inString.length() < 50){
inString.concat(c);

}
if (c == '\n' && current_line_is_blank) {
  
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

//client.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"><html lang=\"it\">");
//client.println();
          //Scrivo l'intestazione
          client.println("<html>");
      //   client.println("<META http-equiv=REFRESH content=3; url=/ >");
      //  client.println("<meta http-equiv=\"Refresh\" content=\"2; URL=192.168.1.4>");

          client.println("<style> a:link{font:8pt/11pt arial; color:red} a:visited {font:8pt/11pt verdana; color:blue} body {font:8pt/11pt verdana; color:black; background-color:lightgray} </style>");
          client.println("<div style='width:360px; height:640px;'>"); //risoluzione per nokia 5800 640x360
          client.println("<title>Salotto</title>");
      //    client.println("<meta http-equiv=\"Refresh\" content=\"5; URL=192.168.1.4>");
          client.println("</head>");
          client.println("<body>");
                   
          client.println("<h2>Controllo Luci Salotto</h2>");
          client.println("<font size= 4><form method=GET>");         
          client.println("<table width=200>");
          
          
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[0]))); // Necessary casts and dereferencing, just copy.
client.println( buffer );
for (int i = 1; i < 5; i++)
{
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy.
client.println( buffer );
switch(i){
          client.println("B");
case 1: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st1]))); client.println( buffer ); break;
case 2: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st2]))); client.println( buffer ); break;
case 3: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st3]))); client.println( buffer ); break;
case 4: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st4]))); client.println( buffer ); break;
//case 5: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st5]))); client.println( buffer ); break;
//case 6: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st6]))); client.println( buffer ); break;
//case 7: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st6]))); client.println( buffer ); break;
}

delay(30);
 
}
client.println("</table>");
client.println("<hr />");
//----------------------Scenari
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[12]))); client.println( buffer );
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[13]))); client.println( buffer );
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[14]))); client.println( buffer );
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[15]))); client.println( buffer );
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[16]))); client.println( buffer );
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[17]))); client.println( buffer );
//--------------------------------------------
client.println("<h2>Controllo Tapparelle</h2>");
client.println("<font size= 4><form method=GET>");  
client.println("<table width=200>");
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[5]))); client.println( buffer );
//client.println("B");
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st5]))); client.println( buffer ); 
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[6]))); client.println( buffer );
//client.println("B");
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st6]))); client.println( buffer );
client.println("</table>");

//----------------------------------------            
 client.println("");
 client.println("<hr /><h2>STATUS SENSORI</h2>");
 // client.println("<SCRIPT language=JavaScript>document.write('<form><input type=button value=\"Refresh\" onClick=\"document.location.reload()\"></form>')</SCRIPT>");
 client.println("Sensore Finestra");
 
  if(valFin == HIGH){
 //  digitalWrite(outPin, HIGH);
 //  client.print();
     strcpy_P(buffer, (char*)pgm_read_word(&(string_table[8]))); client.println( buffer ); //break;
   }
   else {
   //  digitalWrite(outPin, LOW);
     strcpy_P(buffer, (char*)pgm_read_word(&(string_table[9]))); client.println( buffer );// break;
     }
 

        //Scrive sul browser il valore del termistore
        client.println("

<p>Temperatura = <strong>");
        temp = ((5 * analogRead(tempPin) * 100.0 ) / 1024); // Codice ottimizzato
        client.println(temp);
        client.print(" &deg;C </strong></p>");
      if (temp < tempreg) {
        
        client.println("<strong>FREDDO</strong>
");
        }
      else {
       
        client.println("<strong>CALDO</strong>
");
         } 
 

 // client.print();
        //Scrive sul browser il valore della fotoresistenza
            client.println("
<p>Lux = <strong>");
            light = analogRead(photoresistor); 
            client.println(light);
            client.println("</strong></p>");
//----------------------------------------
            
      if (/*light > 100 &&*/ light < 100) {
          // scrive sul web luce se il valore della fotoresistenza è alto
          client.print("<p><strong>BUIO</strong></p>");
        }
      else if (light > 100 && light < 200 )  {
          // scrive sul web buio se il valore della fotoresistenza è basso
          client.print(" <p><strong>OMBRA</strong></p>");
        }
         else if (light > 200 && light < 500)  {
          // scrive sul web buio se il valore della fotoresistenza è basso
          client.print(" <p><strong>LUCE </strong></p>");
        }
         else if (light > 500)  {
          // scrive sul web buio se il valore della fotoresistenza è basso
          client.print(" <p><strong>LUMINOSO</strong></p>");
        }
         else  {
          // scrive sul web buio se il valore della fotoresistenza è basso
          client.print(" <p><strong>MOLTO LUMINOSO</strong></p>");
        }
        // link per aggiornare pagina e valori
   //     client.print("<h3>AGGIORNA SENSORI: <a href=''>CHECK</a></h3><hr />");
    
 //   client.print("
<h3>Aggiorna Sensori: <a href=/>CHECK</a></h3><hr />");
    client.println("
<h3>Aggiorna Sensori&nbsp;<INPUT TYPE=\"button\" VALUE=\"Aggiorna\" onClick=\"history.go(0)\"></h3><hr />");
 
        client.print("<h6>Powered By<h5>Guido</h5></h6>");

//------------------------------------------------

        //  client.println("<meta http-equiv=\"refresh\" content=\"2;url=\"/>");

          client.println("</div>");
          client.println("</body>");
          client.println("</html>");         
          
          
break;
}
if (c == '\n') {
// we're starting a new line
current_line_is_blank = true;
} else if (c != '\r') {
// we've gotten a character on the current line
current_line_is_blank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
inString = "";
readString="";
client.stop();
 }
}

C'è la gestione delle luci e degli scenari (ma ho dovuto cancellare parecchie cose per via dei 9500 caratteri massimi della risposta), dopodichè inizia la parte Webserver.

E' un pò paciugata per via delle millemila prove che ho fatto. Se hai problemi di comprensione, chiedi pure lumi.

ok .... dunque mettere le mani nel tuo prog è un po' complicato, bisognerebbe averlo completo e fare prove in loco ma da come è strutturato direi che è in ascolto e potresti anche non toccarlo

io ti scrivo qui un esempio di web server controllato anche da una pagina html da mettere sul tuo desktop per provare e vedi

questo è lo sketch di esempio che possiede una paginetta web dentro con un off e on che non userai

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 192, 168, 2, 177 }; // ip in lan
//byte gateway[] = { 192, 168, 2, 1 }; // internet accesso via router
//byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80); //server porta

String readString;

void setup()
{

  pinMode(40, OUTPUT);
  Ethernet.begin(mac, ip);
  server.begin();

  
  Serial.begin(9600);
  Serial.println("servertest1"); 
}

void loop()
{
  Client client = server.available();
  if (client) 
  {
    while (client.connected()) 
    {
      if (client.available()) 
      {
        char c = client.read();

        
        if (readString.length() < 100) 
        {
        readString += c;
         
        }
      
        if (c == '\n') 
        {
    
          Serial.println(readString); //debug

             if(readString.indexOf('?') >=0) 
             { 
               client.println("HTTP/1.1 204 Prova.....");
               client.println();
               client.println(); 
             }
             else 
             {
          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          client.println();

          client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<TITLE>Arduino GET test page</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");

          client.println("<H1>ARDUINO Semplice ON-OFF</H1>");
      
          client.println("<a href=\"/?on\" target=\"inlineframe\">ON</a>");
          client.println("<a href=\"/?off\" target=\"inlineframe\">OFF</a>");

          client.println("<IFRAME name=inlineframe style=\"display:none\" >");         
          client.println("</IFRAME>");

          client.println("</BODY>");
          client.println("</HTML>");
             }

          delay(1);
          client.stop();
       
          if(readString.indexOf("on") >0)//controlla se on
          {
            digitalWrite(40, HIGH);   
            Serial.println("Led On");
          }
          if(readString.indexOf("off") >0)//controlla se off
          {
            digitalWrite(40, LOW);    // set pin 4 low
            Serial.println("Led Off");
          }
          
          readString="";

        }
      }
    }
  }
}

questa la copi in un file di testo e la rinomini "cometipare.html" e la metti sul desktop del pc col touch

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  </head>
  <body>

  <input type=button onClick="parent.location='http://192.168.2.177/?on'" value='ON'>
  <input type=button onClick="parent.location='http://192.168.2.177/?off'" value='OFF'>

  </body>
</html>

ho messo 2 tasti di esempio, come puoi notare richiamo l'ip con allegato l'istruzione
aggiungi altri tasti a piacere con indirizzo di un altro arduino
oppure crea un breve javascript sempre dentro a questa paginetta html che ti invia un treno di IP+istruzioni per centralizzare tutto

Per ottenere il tuo indirizzo completo di stringa di comando dei tuoi arduini fai cosiì
entra in un arduino caricando la pagina html del suo sketch
clicca col tasto destro sul pulsante che ti interessa avere l'indirizzo completo di istruzione
fai copia indirizzo e incollalo su un notepad lo userai nella tua html sul desktop
Provalo così e vedi se il comando arriva all'arduino di destinazione.

puoi otenere molti dati anche facendo col tasto destro sulla pagina del tuo arduino selezionando "visualizza sorgente pagina" anche li hai i collegamenti ipertestuali

copiando l'intera sorgente pagina e mettendola dentro un file sul desktop rinominandola sempre .html dovresti ottenere una copia di quella dentro ad arduino, che va poi modificata nell'esecuzione delle istruzioni.

questo è lo stesso identico sketch di prima, ma è "cieco" funziona ugualmente ma nessuna pagina web è visualizzata, (se invii http://192.168.2.177 si avrà una pagina bianca) arduino in questo caso prende ordini dal client con metodo get senza avere nessuna html incorporato nello sketch. Comunichi via lan, ma esclusivamente con una pagina caricata nel tuo pc e solamente se conosci le stringhe giuste da inviare potrai usarlo.

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 192, 168, 2, 177 }; // ip in lan
Server server(80); //server porta
String readString;

void setup()
{
  pinMode(40, OUTPUT);
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  Client client = server.available();
  if (client) 
  {
    while (client.connected()) 
    {
      if (client.available()) 
      {
        char c = client.read();
        if (readString.length() < 100) readString += c;
        if (c == '\n') 
        {
             if(readString.indexOf('?') >=0) 
             { 
               client.println("HTTP/1.1 204 ");
             }
             else 
             {
              client.println("HTTP/1.1 200 OK"); 
              client.println("Content-Type: text/html");
             }
          delay(1);
          client.stop();
       
          if(readString.indexOf("on") >0)//controlla se on
          {
            digitalWrite(40, HIGH);   
            Serial.println("Led On");
          }
          if(readString.indexOf("off") >0)//controlla se off
          {
            digitalWrite(40, LOW);    // set pin 4 low
            Serial.println("Led Off");
          }
          readString="";
        }
      }
    }
  }
}

così semplificato dovresti capire meglio come arduino riceve i dati. Per quanto concerne il limite di dati in una stringa verso arduino (parlavi di 9000 caratteri) nessuno ti vieta di inviarli a blocchi, io invio file da 200 e + Kb ad arduino e non si è mai arrabbiato.
Per per l'invio di dati da arduino al client ti rimando alla prossima puntata

è molto tardi, per il momentro guardati questo.

ciao

Questo dovrebbe essere quello che chiedi, mettilo sul tuo desktop cambiando i paramentri e fammi sapere, è fatto in forma grezza ma funziona
Leggi anche tutto il post di sopra

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  
  <script type="text/javascript">
  // cambia i comandi dopo l'ip non so quali siano i tuoi  questo programma usa /?on
  // forse il tuo usa /?L1 o L=1
  
  
  
  //intercetto il tasto premuto prelevandone l'ID 
  function evento_click (tasto_id)
  {
    if(tasto_id == "on_all")
    {
      window.parent.location = "http://192.168.2.177/?on"
      
      // queste righe sono commentate perchè ho un arduino soltanto sbloccale per provare 
      // mettendo gli ip corretti
            
      //window.parent.location = "http://192.168.2.178/?on"
      //window.parent.location = "http://192.168.2.179/?on"
      //window.parent.location = "http://192.168.2.180/?on"
      
    }
    
    if(tasto_id == "off_all")
    {
      window.parent.location = "http://192.168.2.177/?off"
      
      // queste righe sono commentate perchè ho un arduino soltanto sbloccale per provare 
      // mettendo gli ip corretti
      
      //window.parent.location = "http://192.168.2.178/?off"
      //window.parent.location = "http://192.168.2.179/?off"
      //window.parent.location = "http://192.168.2.180/?off"

     //se vuoi puoi copiare gli ip in array e usare un for per leggerli tutti


    }
    
  }
  </script>
  
  
  </head>
  <body>

 <div>luce camera <input type=button onClick="parent.location='http://192.168.2.177/?on'" value='ON'>
 <input type=button onClick="parent.location='http://192.168.2.177/?off'" value='OFF'> </div>
 
 <div>luce cucina <input type=button onClick="parent.location='http://192.168.2.178/?on'" value='ON'>
 <input type=button onClick="parent.location='http://192.168.2.177/?on'" value='OFF'> </div>
 
   <p> </p>
    <p> </p>
    
  <div><input type=button id="on_all" onclick="evento_click(this.id)" value="Accendi tutte le stanze"></div>
  <p>
  <div><input type=button id="off_all" onclick="evento_click(this.id)"" value='Spegni tutte le stanze'></div>
  </p>

  </body>
</html>

Se tu pensi di lasciare un pc dedicato allora togli tutte le linee dagli sketch che riguardano l'html da tutti gli arduini, saranno più veloci e non ti servono.
solo queste 2 righe sono importanti che dicono al client che tipo di dati gli stanno arrivando e risposta 200 di successo
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");

Fai una copia di backup prima di fare modifiche non si sa mai.

Se ho commesso errori tecnici chiedo perdono, se qualcuno vuole consigliare e/o modifcare allo scopo di migliorare sono ben accetti.