Ethernet shield comunicazione con pagina web

Mauro_Titan:
mi potete aiutare nel capire dove sbaglio ?

ho modificato il listato ... per un solo led.
ma quando lo spengo subito si riaccende.
Perche ? .

perchè tra un loop e l'alto NON azzeri query... :smiley:

Paolc:
magari KrashNet quando il tuo blog sarà accessibile mi piacerebbe vederlo.....
pubblica il link quando puoi..

Spero di trovare il tempo e pubblicae in settimana!

lesto:
perchè tra un loop e l'alto NON azzeri query... :smiley:

Errato .. viene azzerata a fine programma.
e cmq. ho ricontollato e ricontrollato e l'unica differena e'nella scelta del pin
e cosi' ho impostato il PIN 8 e funziona :slight_smile:
penso che il problema sia che i pin 10-11-12 vengano utilizzati per dialogare con Arduino.
ipotizzo .. ma devo cercare.

Ciao-

Anche io un paio di settimane fa smanettavo con queste cose..
Il codice scritto sopra va bene...
Ma sarebbe interessante anche fare in modo di conoscere lo stato del led (acceso o spento) anche quando si è a regime..

Questo codice potrebbe essere utile.

Avevo cercato di aggiungere altri comandi.. Funzionano, ma ho incontrato un po di problemi con la formattazione e non riuscivo a fare funzionare due led contemporaneamente... Riuscivo a fare accendere a turno uno alla volta..
Accendendo uno si spegneva automaticamente l'altro...
Io per ora non ho molto tempo
Se volete provare e riuscite a modificare l'interfaccia per fare funzionare tutto, non sarebbe male...

Buon divertimento :grin:

@Mauro_Titan
metti una serial.println all'interno degli if per le digitalWrite, giusto per capire se le accensioni/spegnimenti derivano dal loop o qualcosa di esterno.
sul'arduino con atmega 168/328p i pin digitali 9-10-11 sono PWM, quindi se usi analogWrite.. o magari sono usati dallo shield ethernet....

Ragazzi, ho moificato un po di codici seguendo il link che ho postato su e prendendo come spunto anche qualche dritta dei post precedenti..

Quello che ho ottenuto è qesto:

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 10 }; // ip in lan
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80); //server port

String readString; //string
boolean LED1ON = false; //LED1 status flag
boolean LED2ON = false; //LED2 status flag
boolean LED3ON = false; //LED3 status flag
 
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, 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);
      if (c == '\n' && currentLineIsBlank) {
         Serial.print(readString);
        if(readString.indexOf("L=1") > 0) {
          digitalWrite(6, HIGH); // set the LED on
          LED1ON = true;
          }else{
          //led has to be turned OFF
          digitalWrite(6, LOW); // set the LED OFF
          LED1ON = false;
        }
        if(readString.indexOf("L=2") > 0) {//lets check if LED should be lighted
          //led has to be turned ON
          digitalWrite(7, HIGH); // set the LED on
          LED2ON = true;
          }else{
          //led has to be turned OFF
          digitalWrite(7, LOW); // set the LED OFF
          LED2ON = false;
        }
        if(readString.indexOf("L=3") > 0) {//lets check if LED should be lighted
          //led has to be turned ON
          digitalWrite(8, HIGH); // set the LED on
          LED3ON = true;
          }else{
          //led has to be turned OFF
          digitalWrite(8, LOW); // set the LED OFF
          LED3ON = false;
        }
        // INIZIO DICHIARAZIONE PAGINA HTML
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        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>");
        //Primo led
        client.println("<hr />");
        client.println("<h1>LED1</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED1ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=1'>ON</a> | <a href='/?L=01'>OFF</a></h2>");
        
        client.println("<hr />");
        
        //Secondo led
        client.println("<h1>LED2</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED2ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=2'>ON</a> | <a href='/?L=02'>OFF</a></h2>");
        client.println("<hr />");
        
        //terzo led
         client.println("<h1>LED3</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED3ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=3'>ON</a> | <a href='/?L=03'>OFF</a></h2>");
 
        client.println("</body></html>");
 
        //clearing string for next read
        readString="";
        //stopping client
        client.stop();
 
        } 
    } 
  } 
} 
}

L'interfaccia andrebbe anche bene.. Si riesce ad avere anche lo status di ogni led se ON oppure OFF...
L'unico problema che non riesco a risolvere in nessun modo è che non si possono accendere due led contemporaneamente.
L'accensione di uno implica lo spegnimento dell'altro.
Non riesco a risolvere.

Penso che sia un problema di qualche variabile condivisa o del booleano, ma non riesco ad inquadrarlo bene.

Avete qualchee suggerimento?

@dr4gone

L'unico problema che non riesco a risolvere in nessun modo è che non si possono accendere due led contemporaneamente.
L'accensione di uno implica lo spegnimento dell'altro.
Non riesco a risolvere.

Penso che sia un problema di qualche variabile condivisa o del booleano, ma non riesco ad inquadrarlo bene.

non c'entrano variabili condivise.
Sempicemente, tu verifichi che nella GET ci sia L=N (1, 2 o 3).

In tutti questi casi, se trovi una corrispondenza (L=1) accendi il led, altrimenti lo spegni.

if(readString.indexOf("L=1") > 0) {
          digitalWrite(6, HIGH); // set the LED on
          LED1ON = true;
}else{
          //led has to be turned OFF
          digitalWrite(6, LOW); // set the LED OFF
          LED1ON = false;
}

..mentre nel codice html che vai a generare scrivi:

client.print("

ON | OFF

");

cioè, prevedi (perlomeno, chi ha scritto il codice) che per spegnere il led si debba usare L=01

Quindi devi modificare il tuo codice in questo modo:

if(readString.indexOf("L=1") > 0) {
digitalWrite(6, HIGH); // set the LED on
LED1ON = true;
}
if(readString.indexOf("L=01") > 0) {
//led has to be turned OFF
digitalWrite(6, LOW); // set the LED OFF
LED1ON = false;
}

perchè possa funzionare nell'insieme.
Ricapitolando:
L=1 accende il led
L=01 spegne il led

Grazie. Sei un grande. Funziona tutto perfettamente. Karma +1 :grin:

Ma per fare qualcosa di più accattivante graficamente come si può fare? si deve sempre inglobare il codice della pagina (html, php o quello che è) e farlo stampare ad Arduino dallo sketch, o si può fare in modo di fare una grafica di base, in modo tale che lo sketch modifichi solo i dati essenziali,input/outpout e lo stato ?

Ciao

Ma per fare qualcosa di più accattivante graficamente come si può fare?

puoi:

  1. lavorare sull'attributo style dei tag html
  2. inserire nell'head una sezione dedicata al css (CSS Tutorial)
  3. inserire nell'head un riferimento ad un foglio di style, residente in un altro server;
  4. gestire tutte le chiamate ad Arduino da una pagina php / asp / pl etc etc, che risiede fisicamente su pc/server/altro, ma su cui pui lavorare con più margini.

La soluzione 1 è la meno elegante, ma la più veloce da implementare; ma non si ottengono miracoli.
La soluzione 2 non è male, ma se ti fai prendere la mano rischi di occupare tutto lo spazio disponibile nell'atmega solo per una questione estetica.
La soluzione 3 è interessante, anche perchè puoi cambiare l'interfaccia web senza toccare Arduino, ma lavorando sul file css esterno ad Arduino stesso.
La soluzione 4 a mio avviso è la più completa e scalabile, ma per progettini di questo livello, le 3 soluzioni sopra son più che sufficienti.

Grazie mille
Questo week end mi studio un po delle cose che hai proposto e vedo cosa riesco a tirarne fuori. :slight_smile:

Grazie dei suggerimenti!!!
Ho usato il metodo 3 che hai detto.. Cioè usare un server esterno per mettere gli stili css e le cose pesanti e far eseguire il codice html ad arduino... E' diventato tutto molto più utilizzabile.

Ora manca solo una cosa da capire. Come si può fare in modo di mettere un'autenticazione quando si cerca di accedere ad arduino.
Avevo visto che era stato fatto un codice adattato a un webduino, ma non riesco a trovare le librerie giuste e implementarle. Mi danno errore...

Avete qualche link dove repirire info? o qualche suggerimento?

io farei così: all'inizio arduino manda una pagina di autenticazione.
Se ha avito successo l'autenticazione si "inventa" un codice( quì torna utile la funzione rand() ), che viene inserito in un hidden input in ogni pagina (e quindi viene incluso nei parametri del GET).
Quindi arduino ogni richiesta controlla se è presente il codice e se è valido: se non lo è rimanda alla pagina di login, altrimenti esegue i comandi richiesti, e ovviamente alla pagina di risposta inserisce l'hidden input del codice.

[paranoia on]
Per una maggiore sicurezza puoi fare che arduino controlla non solo il codice, ma anche l'ip legato ad esso, e un time-out se il codice non viene usato per qualche tempo.
Per una sicurezza estrema puoi fare che la pagina di login abbia al suo interno uno script che faccia lo sha1 di pass+un numero random, e invii lo sha1 e il numero ad arduino. Anche arduino farà lo sha1 della pass in memoria+numero random: se i 2 sha1 corrispondono allora l'utente è autenticato.
Usa lo sha1 perchè ormai l'md5 è craccabile in pochi secondi.
[paranoia off]

in linea di massima ho capito cosa intendi.. ma per arrivare fisicamente a fare quello che dici ce ne vuole...

Hai qualche link da cui poter partire, oppure qualche info in più su come iniziare a procedere?

mi spiace, era un modello che avevo creato quando le sessioni funzionavano ancora solo con i cookies in php, e ormai chissà che fine ha fatto quel codice :frowning:

pitusso:
Ciao

Ma per fare qualcosa di più accattivante graficamente come si può fare?

puoi:
3. inserire nell'head un riferimento ad un foglio di style, residente in un altro server;
La soluzione 3 è interessante, anche perchè puoi cambiare l'interfaccia web senza toccare Arduino, ma lavorando sul file css esterno ad Arduino stesso.

Lasciando perdere per un attimo il discorso della sicurezza che per ora risulta troppo complicato, mi vorrei soffermare su alcuni punti inerenti alla gestione dell'interfaccia...

L'interfaccia è molto facile da realizzare con un foglio di stile css esterno e il codice html generato da arduino...
Con una pagina singola dove vengono messi tutti i controlli (LUCI, PORTE, GESTIONE CLIMATIZZAZIONE.. ecc) è semplice e funzionante.

Le cose si complicano un bel po quando si cerca ad esempio di inserire un menù per dividere i controlli (LUCI, PORTE, GESTIONE CLIMATIZZAZIONE.. ecc) separatamente, in diverse pagine raggiungibili dal menu... Come un vero e proprio sito web.

La stampa del codice con client.println da arduino, mi sembra che non sia più sufficente, in quanto non garantisce la selezionedei soli controlli che servono.

Quindi... ammattendo di avere questo menu:

// INIZIO DICHIARAZIONE PAGINA HTML
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        //Dichiarazione stile Css
        client.print("<html><head><link rel='stylesheet' type='text/css' href='stile.css'></head><body>");
        //dichiaro la classe per il menu
client.print("<div class='container'>");
        client.print("<div class='menu'>");
	client.print("<ul>");
		client.print("<li class='highlight'><span class='menu_r'><a href='http://' target='_self'><span class='menu_ar'>HOME</span></a></span></li>");
		client.print("<li><span class='menu_r'><a href='http://' target='_self'><span class='menu_ar'>PORTE</span></a></span></li>");
		client.print("<li><span class='menu_r'><a href='luci.html' target='_self'><span class='menu_ar'>LUCI</span></a></span></li>");
		client.print("<li><span class='menu_r'><a href='http://' target='_self'><span class='menu_ar'>CLIMA</span></a></span></li>");
		client.print("<li><span class='menu_r'><a href='http://' target='_self'><span class='menu_ar'>SENSORI</span></a></span></li>");
		client.print("<li><span class='menu_r'><a href='http://' target='_self'><span class='menu_ar'>COMBO</span></a></span></li>");
	client.print("</ul>");
	client.print("<br class='clearit' />");
client.print("</div>");

C'è un modo per far stampare ad arduino solo quello che serve?

Ad esempio, si preme il pulsante luci, e arduino fa il client.println solo della parte inerente alle luci.
Pulsante clima, e arduino stampa solo la pagine inerente al clima...

Avete qualche suggerimento su come procedere?

usando i form o pagine diverse per ogni comando (tanto poi ad arduino gli fai rispondere sempre la stessa pagina), e quindi la richiesta della pagina diventa il comando :slight_smile:

scusa ma non ti ho capito... che intendi per pagine diverse per ogni comando o form?

potresti fare un esempio pratico?

in pratica ogni comando anzichè essere una get è un link ad una pagina tipo "accendiLuce.html" ecc...
in base alla pagina richiesta arduino esegue il comando corrispondente.
Però il modo migliore è usando i form, perchè così puoi inviare più parametri

in linea di massima ho capito cosa intendi.. ma non il come realizzarla :grin: . Mi sa che oggi sono di coccio...

Più tardi cerco di capire come si può implementare una cosa del genere, anche perchè per ora non comprendo come si possa fare.
Bhe mi devo applicare un po. :smiley:

dr4gone,
un esempio abbastanza strutturato con gestione di pagine è presente anche sul playground:
http://www.arduino.cc/playground/Code/WebServer

..ci son vari modi per avanzare con il tuo progettino, ma cerca di procedere per gradi: ci metterai un pochino di più, ma te lo godrai di più!