[PROBLEMA] Web server con arduino

Ciao a tutti, per l'esame di stato di quest'anno avevo pensato di portare un progettino sulla casa domonita, comandata tramite pagina web che risiederà su una micro sd e che sarà inviata da arduino (mega).
Il mio problema è che una volta che arduino invia la pagina al client, e poi premo il tasto di accensione led, non succede nulla... Sapreste aiutarmi?

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

// MAC address
byte mac[] = { 0x04 , 0x18 , 0xD6 , 0x00, 0xXX, 0xXX };
// eventuale indirizzo IP statico da utilizzare
byte ip[]= {192,168,1,50 };


EthernetServer server(80);
EthernetClient client;
File htmlFile;
String readString;

int lcucina=3, lgarage=6, i, ltemp=8; //Interno Casa
int luce;
int vetL[]= {0,0,0,0,0,0,0,0};
byte x;


void setup() {
  
    
    if(!SD.begin(4)) { return; }
  
    // inizializzazione dell'ip, mac, e server
    Ethernet.begin(mac, ip);
    server.begin();
    
    Serial.begin(9600);
    while (!Serial) {
      // wait for serial port to connect. Needed for Leonardo only
    }
    Serial.print("L'indirizzo IP del server e':  ");
    Serial.println(Ethernet.localIP());
    
    // inizializzazione pin della shield ethernet 
    pinMode(10, OUTPUT);
   
    // luce cucina
    pinMode(lcucina, OUTPUT);
    
    //luce garage
    pinMode(lgarage, OUTPUT);
   
    
}
void loop() {
    
   
    
    //Inizializzazione del server ed invio della pagina web  
    client = server.available();
    if(client){
      
      boolean currentLineIsBlank= true;
        while(client.connected()){
             if(client.available()){
                char c=client.read();
                Serial.write(c);
                
                
                if (readString.length() < 100) {
                    //store characters to string
                    readString += c;
                    //Serial.write("C: "+ c);
                }
                
                if(c== '\n' && currentLineIsBlank){
                  
                   //Serial.print(readString); 
                   
                   client.println("HTTP/1.1 200 OK");
                   client.println("Content-Type: text/html");
                   client.println();
                   
          
                   //apertura file html da sd
                   htmlFile= SD.open("casadom.htm");
                   if(htmlFile){
                      while(htmlFile.available()){
                            x=(htmlFile.read());
                            client.print(char(x));
                            //Serial.println(char(x));
                      }
                      htmlFile.close();
                   }
                   
                   
                  
                   //Serial.print(readString);
                   if(readString.indexOf("luc1") > 0) {  
                     Serial.write("funziona");
                     digitalWrite(lcucina, HIGH);   
                   }
                   
                   
                   /*
                   if(readString.indexOf("luc5") > 0) luce=5;          
                   if(readString.indexOf("luc1") > 0) luce=1;
                   
                   switch(luce){
                       case '5':
                            if(vetL[luce]==0){
                               digitalWrite(lgarage, HIGH);
                               vetL[luce]=1;
                            }
                            else{
                               digitalWrite(lgarage, LOW);
                               vetL[luce]=0;
                            }
                       break;
                       
                       case '1':
                            if(vetL[luce]==0){
                               digitalWrite(lcucina, HIGH);
                               vetL[luce]=1;
                            }
                            else{
                               digitalWrite(lcucina, LOW);
                               vetL[luce]=0;
                            }
                       break;
                   }
                   */
                   
                   
                   
                }
                
                if(c == '\n') {
                   currentLineIsBlank = true;          
                   
                }
                else if (c != '\r') {
                        currentLineIsBlank = false;
                }
                
             }
             readString="";
        }
        client.stop();
        Serial.println("client disconnected");
    }
    //Fine inizializzazionem invio della pagina web e disconnessione client
    
    //Inizio Programma:
    
    
}

Il tasto della pagina web è questo:

<input type="submit" onclick='/luc1' value="On/Off">

La shield ethernet è una HanRun HR911105A 14/16 mentre la versione dell'ide è 1.5.8

Tiutepe:
Ciao a tutti,

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

HanRun HR911105A 14/16 è il connettore... non è che hai una enc28j60 ? Perchè in questo caso le lib sono diverse e anche l'utilizzo.

marinaio67:
HanRun HR911105A 14/16 è il connettore... non è che hai una enc28j60 ? Perchè in questo caso le lib sono diverse e anche l'utilizzo.

ho appena letto sull'integrale, c'è scritto che è una WIZnet w5100 supporta anche la micro sd.
Comunque il programma mi funziona il problema è soltanto nell'invio della stringa dal client ad arduino per farmi accendere il led

Tiutepe:
ho appena letto sull'integrale, c'è scritto che è una WIZnet w5100...

e sulla derivata che c'è scritto? :smiling_imp: scherzo...
Metti anche lo schema...

marinaio67:
e sulla derivata che c'è scritto? :smiling_imp: scherzo...
Metti anche lo schema...

Non so fornirti lo schema preciso, perchè ho comprato una scheda cinese su ebay, so solo dirti che è simile a questa http://www.arduino.cc/en/Main/ArduinoEthernetShield e che come INTEGRATO ha un wiznet W5100 cioè lo stesso del link.
COmunque non so se può influire ma volevo dirti che ho un funduino atmega2560 (versione cinese)

Buonasera, ho rianalizzato il programma ed ho notato che in realtà nella stringa readString non mi salva il contenuto della variabile "c". Sapreste dirmi il perchè non me lo salva?
Ecco lo spezzone dello sketch:

if (readString.length() < 100) {
     //store characters to string
     readString += c;
     Serial.write("c");
}

buonasera
potresti postare lo sketch completo e la pagina html completa in modo che noi con 2 click possiamo provare il tutto

camperos:
buonasera
potresti postare lo sketch completo e la pagina html completa in modo che noi con 2 click possiamo provare il tutto

Ecco lo sketch di arduino:

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

// MAC address
byte mac[] = { 0x04 , 0x18 , 0xD6 , 0x00, 0x62, 0xF8 };
// eventuale indirizzo IP statico da utilizzare
byte ip[]= {192,168,1,50 };


EthernetServer server(80);
EthernetClient client;
File htmlFile;
String readString;

int lcucina=3, lgarage=6, i, ltemp=8; //Interno Casa
int luce;
int vetL[]= {0,0,0,0,0,0,0,0};
byte x;


void setup() {
  
    
    if(!SD.begin(4)) { return; }
  
    // inizializzazione dell'ip, mac, e server
    Ethernet.begin(mac, ip);
    server.begin();
    
    Serial.begin(9600);
    while (!Serial) {
      // wait for serial port to connect. Needed for Leonardo only
    }
    Serial.print("L'indirizzo IP del server e':  ");
    Serial.println(Ethernet.localIP());
    
    // inizializzazione pin della shield ethernet 
    pinMode(10, OUTPUT);
   
    // luce cucina
    pinMode(lcucina, OUTPUT);
    
    //luce garage
    pinMode(lgarage, OUTPUT);
   
    
}
void loop() {
    
   
    
    //Inizializzazione del server ed invio della pagina web  
    client = server.available();
    if(client){
      boolean currentLineIsBlank= true;
        while(client.connected()){
             if(client.available()){
                char c=client.read();
                //Serial.print(c);
                
                
                if (readString.length() < 100) {
                    //store characters to string
                    //readstring.concat(c);
                    readString += c;
                    Serial.print(c);
                    
                }
                  
                
                
                if(c== '\n' && currentLineIsBlank){
                  
                   client.println("HTTP/1.1 200 OK");
                   client.println("Content-Type: text/html");
                   client.println();
                   
          
                   //apertura file html da sd ed invio
                   htmlFile= SD.open("casadom.htm");
                   if(htmlFile){
                      while(htmlFile.available()){
                            x=(htmlFile.read());
                            client.print(char(x));
                            //Serial.println(char(x));
                      }
                      htmlFile.close();
                   }
                   
                   
                   Serial.println("READSTRING1 inizio: "); 
                   Serial.print(readString);
                   Serial.println("READSTRING11 Finish ");
                   
                   if(readString.indexOf("luc1") > 0) {  
                     Serial.println("READSTRING2 inizio: "); 
                     Serial.print(readString);
                     digitalWrite(lcucina, HIGH); 
                     Serial.println("readstring ffffunziona");  
                   }
                                 
                   
                }
                
                if(c == '\n') {
                   currentLineIsBlank = true;          
                   
                }
                else if (c != '\r') {
                        currentLineIsBlank = false;
                }
                
             }
             readString="";
        }
        client.stop();
        Serial.println("Client disconnesso");
    }
    //Fine inizializzazionem invio della pagina web e disconnessione client
    
    //Inizio Programma:
    
    
}

Pagina web (nello sketch ho configurato solo la luce della cucina, quindi premete solo quel bottone):


Salve ragazzi ho modificato lo sketch, ed invece di queste righe di codice

if (readString.length() < 100) {
       //store characters to string
       readString += c;
       Serial.print(c);
}

Ho messo questa:

readString.concat(c);

e adesso i viene salvata perfettamente nella stringa, il problema adesso è perchè non mi trova nella nella stringa la parola "luc1", ecco lo spezzone di codice:

if(readString.indexOf("luc1") > 0) {  
       Serial.println("READSTRING2 inizio: "); 
       Serial.print(readString);
       digitalWrite(lcucina, HIGH); 
       Serial.println("readstring ffffunziona");  
}

luc1 vuole il singolo apice

camperos:
luc1 vuole il singolo apice

Che dici camperos? è giusto quello che ha fatto
Sta cercando una stringa (insieme di più caratteri) non un singolo char

char
int firstClosingBracket = stringOne.indexOf('>');

string
int firstListItem = stringOne.indexOf("

  • ");

    è scritto nel link che gli hai dato :neutral_face:

  • hai ragione, me ne vo' a nanna :smiley:

    E' presto per gli arduinici ad andare a nanna ... è solo l'1 ... nella norma si fanno le 4-5 di mattina!!! sono le ore migliori, lo diceva anche Einstein che dormiva di pomeriggio :grin: :grin:

    ok fino alle 3 e mezza resito :smiling_imp:

    così pare funzioni, da migliorare ma comunque talmente lento che diventa quasi inusabile..
    occhio che avevo modificato per la scheda wifi, dovrei aver ripristinato per la ethernet.

    nella parte html sostituito

    <input type='submit' onclick='/luc1' value="On/Off">
    

    con

    <h2><a href='/?luc1'>ACCENDI</a> | <a href='/?L=0'>SPEGNI</a></h2>
    
    void loop() { 
      //Inizializzazione del server ed invio della pagina web
      client = server.available();
      if (client) {
        Serial.println("new client");
        String readString = "";
       
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
            Serial.write(c);
           
          if (c == '\n' ) {
              if (readString.length() == 0) {
                //apertura file html da sd ed invio
                htmlFile = SD.open("casado.htm");
                if (htmlFile) {
                  while (htmlFile.available()) {
                    x = (htmlFile.read());
                    client.print(char(x));
                   // Serial.print(char(x));
                  }
                  htmlFile.close();
                }
                Serial.println F(("READSTRING1 inizio: "));
                Serial.println F(("READSTRING11 Finish "));
              }
              else {     
                readString = "";
              }
            }
            else if (c != '\r') {  
              readString += c;   
            }
            if (readString.indexOf("L=0") > 0) {
              digitalWrite(lcucina, LOW);            
            }
            if (readString.indexOf("luc1") > 0) {
              Serial.println F(("READSTRING2 inizio: "));
              digitalWrite(13, HIGH);               
              Serial.println("readstring ffffunziona");
            }
          }
        }
        client.stop();
        Serial.println F(("Client disconnesso"));
      }
    }
    

    ora il meritato riposo :stuck_out_tongue:

    camperos grazie mille per il tempo che hai perso per il mio problema, ma mi sai dire perchè ci mette così tanto ad elaborare la stringa dal client ad arduino? e a cosa serve quella F nel Serial.print?

    mi sai dire perchè ci mette così tanto ad elaborare la stringa dal client ad arduino?

    Perchè tutte le sante volte ad un click o ad un aggiornamento arduino è obbligato ad inviare il file "casado.htm" ricaricando la pag, (senza togliere nulla a nessuno) questo è il modo peggiore di fare un webserver :roll_eyes:
    Serve un po' di javascript e che la pagina venga caricata solo la prima volta che il client si collega ad arduino, perderà pochi secondi solo alla prima connessione.

    ieri
    http://forum.arduino.cc/index.php?topic=318373.15

    pablos:
    Perchè tutte le sante volte ad un click o ad un aggiornamento arduino è obbligato ad inviare il file "casado.htm" ricaricando la pag, (senza togliere nulla a nessuno) questo è il modo peggiore di fare un webserver :roll_eyes:
    Serve un po' di javascript e che la pagina venga caricata solo la prima volta che il client si collega ad arduino, perderà pochi secondi solo alla prima connessione.

    ieri
    Controllare Arduino via web - Software - Arduino Forum

    ok grazie pablos, però non capisco una cosa, se il problema fosse della pagina web, allora anche quando digito l'IP di arduino dovrebbe caricarla in modo lento, invece la carica all'istante, solo al click di un link ci mette precisamente 20 secondi per elaborare la richiesta.

    bhe 20 sec sono un po' troppi .... per me erano inacettabili anche 2 sec. :fearful:
    Dovrei caricarlo e provarlo per verificare .... solo dopo la mezzanotte però ... non posso scollegare niente

    più tardi ci guardo

    pablos:
    bhe 20 sec sono un po' troppi .... per me erano inacettabili anche 2 sec. :fearful:
    Dovrei caricarlo e provarlo per verificare .... solo dopo la mezzanotte però ... non posso scollegare niente

    più tardi ci guardo

    ok allora buona nottata xD e grazie ancora