Web Server com pagina salva no SD Card

Boa Noite pessoal, estou tentando fazer funcionar um web server no arduino com a pagina htm hospedada no cartão de memoria do internet shield. estou conseguindo fazer a leitura a pagina abre normalmente, mas nessa pagina tenho 3 botões onde envio comando para acender 3 leds independentes, mas quando clico no botão pra acender o led 1 acende todos de uma vez só. queria contar com a ajuda de vocês pra pode me ajudar a corrigir o erro, vou posta o código do exemplo abaixo pra melhorar entendimento..... desde já muito grato.

Codigo Arduino:

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

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x36 }; //physical mac address
byte ip[] = { 192, 168, 1, 99 }; // ip in lan
byte gateway[] = { 192, 168, 1, 2 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

int led1 = 5;
int led2 = 6;
int led3 = 7;

String readString = String(30);

String statusLed;

File webFile;

void setup()
{
    Ethernet.begin(mac, ip, gateway, subnet);  // initialize Ethernet device
    server.begin();           // start to listen for clients
    Serial.begin(9600);       // for debugging
    
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
    
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Found index.htm file.");
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
               if(readString.length() < 30){
                  readString += (c);
               }                
                if (c == '\n' && currentLineIsBlank) {
                  
                           // FAZ A VERIFICAÇÃO PRA ACENDER OU APAGAR O LED
         
                   if (readString.indexOf("1") >=0) {
                      digitalWrite(led1, !digitalRead(led1));
                  }
         
                   if (readString.indexOf("2")>=0) 
                   {
                      digitalWrite(led2, !digitalRead(led2));                
                      }
                   if (readString.indexOf("3") >=0)
                     {
                      digitalWrite(led3, !digitalRead(led3));
                    }
         
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connection: close");
                    client.println();
                    // send web page
                    webFile = SD.open("index.htm");        // open web page file
                    if (webFile) {
                        while(webFile.available()) {
                            client.write(webFile.read()); // send web page to client
                        }
                        webFile.close();
   
                    }
                    break;
                    readString = "";
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        //readString = "";
        client.stop(); // close the connection
        
    } 
}

Codigo da Pagina html a ser hospedada no cartão de memoria do shield internet:

<!doctype html>
<html>
<head>
<title>TESTE WEB SERVER SD CARD</title>
<meta name="viewport" content="width=320">
<meta name="viewport" content="width=device-width">
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
</head>

<body>

<center>

<font size="5" face="verdana" color="green">WEB  SERVER ARDUINO</font>
<font size="3" face="verdana" color="red"> & </font>
<font size="5" face="verdana" color="blue">SD CARD</font>


<form action="1" method="get">
<button type=submit style="width:200px;">Led 1</button> 
</form> 


<form action="2" method="get">
<button type=submit style="width:200px;">Led 2</button>  
</form> 


<form action="3" method="get">
<button type=submit style="width:200px;">Led 3</button>  
</form> 


</center>

</body>
</html>

Já fizeste o teste de ver o que é que o WebBrowser manda para o Arduino quando clicas no botão?

Para mim, parece-me que serão enviados os numeros 1,2 e 3 e como tal o teu código acende tudo.

Não deverias ter um pouco mais de cuidado e enviar algo com menos probabilidade de aparecer por engno??

Algo como "*1" ou "#2# ou mesmo "A3" ou até "Z1", etc...

Caro bubulindo desde quero lhe agradecer pela atenção.... Já fiz a verificação, cada clique no botão o link segue da seguinte forma:

Ao Clicar no Botão 1:
http://192.168.1.99/1

Ao Clicar no Botão 2:
http://192.168.1.99/2

Ao Clicar no Botão 3:
http://192.168.1.99/3

Também ja fiz alguns teste utilizando a seguinte forma:

Ao Clicar no Botão 1:
http://192.168.1.99/led1

Ao Clicar no Botão 2:
http://192.168.1.99/led2

Ao Clicar no Botão 3:
http://192.168.1.99/led3

e dessa forma ocorreu o mesmo erro, mas vou fazer uma tentativa usando os caracteres especiais como você me indicaste logo que tiver o rusultado postarei.

Quando clicas no botão, esse é o endereço que aparece na barra do browser... mas não é isso que é enviado para o Arduino...

Coloca aquela linha especificada no código em baixo e corre o teu programa com a porta série aberta e coloca aqui o resultado.

if (c == '\n' && currentLineIsBlank) {
                  
   // FAZ A VERIFICAÇÃO PRA ACENDER OU APAGAR O LED
   Serial.println(readString); //ADICIONADO PARA TESTES      
   if (readString.indexOf("1") >=0) {

Quando fizeste essa experiência do led1, led2, led3... que código alteraste no Arduino?

Outra coisa, não deverias usar apenas um form no teu html em vez de três?

Meu caro bubulindo vou fazer esse teste ainda hoje e lhe postarei o resultado em seguida... mais um vez muito obrigado pela atenção...

bubulindo:
Quando fizeste essa experiência do led1, led2, led3... que código alteraste no Arduino?

E a resposta a esta pergunta???

Quando fizeste essa experiência do led1, led2, led3... que código alteraste no Arduino?

Esse é o código que foi alterado no arduino

 if (readString.indexOf("led1") >=0) {
                      digitalWrite(led1, !digitalRead(led1));
                  }
         
                   if (readString.indexOf("led2")>=0) 
                   {
                      digitalWrite(led2, !digitalRead(led2));                
                      }
                   if (readString.indexOf("led3") >=0)
                     {
                      digitalWrite(led3, !digitalRead(led3));
                    }

Esse foi o código alterado no html:

<form action="led1" method="get">
<button type=submit style="width:200px;">Led 1</button> 
</form> 


<form action="led2" method="get">
<button type=submit style="width:200px;">Led 2</button>  
</form> 


<form action="led3" method="get">
<button type=submit style="width:200px;">Led 3</button>  
</form>

Respoata a outra pergunta:

Outra coisa, não deverias usar apenas um form no teu html em vez de três?

Cada form e um botão independente que acende e apaga leds diferentes, que no caso era pra funcionar da seguinte forma botão 1 acende e apaga led1, botão 2 acende e apaga led3 eo botão 3 acende e apaga le3.

Caro amigo bubulindo, fiz o teste pra ver o que o navegador estava mandado para o arduino como você me indicou, e realmente pude constatar que ele está enviando um único valor independente do botão a ser clicado segue abaixo os ocorrido:

Botão 1:

30GET /1? HTTP/1.1
Host: 192.

Botão 2:

30GET /1? HTTP/1.1
Host: 192.

Botão 3:

30GET /1? HTTP/1.1
Host: 192.u

mas não conseguir ainda descobris porque esta ocorrendo isso pois como pode ser verificado no código acima os modo GET de cada botão esta passando Valores Diferentes e o navegador exibe de Forma correta como no detalhe mostrado asseguir:

Botão 1:

http://192.168.1.99/1

Botão 2:

http://192.168.1.99/2

Botão 3:

http://192.168.1.99/3

Outro erro que tens é não limpares a variável readString após a usares.

Ou seja, o browser está a mandar os dados correctos, mas tu nunca passas esses dados para a variável readString. È estranho porque tens uma linha que fazia isso comentada no teu código....

Corrige isso e volta a experimentar.

Também não será pior mudares o nome de readString para outra coisa qualquer que não um método... algo como recStr, por exemplo...
Pode não ser esse o problema, mas nunca se sabe.

No entanto, o que imprimiste chega para ver porque é que as três luzes acendem... nessa string tens um 1,2 e 3 e o teu código acende as luzes se vir um 1 ou 2 ou 3...

Experimenta também dar um nome a cada um dos botões de Submit...

Como vês pela string que colocaste no post em cima, experimenta pesquisar por "/X?" para determinar qual foi o botão que foi pressionado. X é obviamente o número do botão.

Caro amigo bubulindo, antes de mais nada quero lhe deixar meus agradecimento pela atenção prestada e pelo empenho na ajuda que me deste.... muito agradecido por tudo. com relação ao problema o mesmo foi solucionado quando seguir suas instruções de verificar a a string (readString = "":wink: como você observou a mesma estava posicionada no local errado onde não poderia ser zerada e no local correto ela esta citada apenas como comentário... segue o código após ser corrigido para fins de estudos caso mais alguém do fórum tenha alguma duvida similar.

Código Corrigido:

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

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x36 }; //physical mac address
byte ip[] = { 192, 168, 1, 99 }; // ip in lan
byte gateway[] = { 192, 168, 1, 2 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

int led1 = 5;
int led2 = 6;
int led3 = 7;

String readString = String(30);

String statusLed;

File webFile;

void setup()
{
    Ethernet.begin(mac, ip, gateway, subnet);  // initialize Ethernet device
    server.begin();           // start to listen for clients
    Serial.begin(9600);       // for debugging
    
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
    
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Found index.htm file.");
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
               if(readString.length() < 30){
                  readString += (c);
               }                
                if (c == '\n' && currentLineIsBlank) {
                  
                           // FAZ A VERIFICAÇÃO PRA ACENDER OU APAGAR O LED
         
                   if (readString.indexOf("1") >=0) {
                      digitalWrite(led1, !digitalRead(led1));
                  }
         
                   if (readString.indexOf("2")>=0) 
                   {
                      digitalWrite(led2, !digitalRead(led2));                
                      }
                   if (readString.indexOf("3") >=0)
                     {
                      digitalWrite(led3, !digitalRead(led3));
                    }
         
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connection: close");
                    client.println();
                    // send web page
                    webFile = SD.open("index.htm");        // open web page file
                    if (webFile) {
                        while(webFile.available()) {
                            client.write(webFile.read()); // send web page to client
                        }
                        webFile.close();
   
                    }
                    break;
                                   }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        readString = "";
        client.stop(); // close the connection
        
    } 
}

Mais uma vez muito obrigado por tudo.

Olá, sei que o tópico já é antigo, mas pesquisando como colocar a pagina no SD cheguei aqui. mas, mesmo copiando seu código todo continuo com problemas. Quando eu abro o IP no navegador os 2 relés ligam e desligam rapidamente, quando clico nos botoes eles fazem a mesma coisa. só de recarregar a pagina...mesma coisa

Alguma dica??

Muito Obrigado!

ola, sou novo com o arduino, e estou com uma duvida utilizei esse topico para criar meu projeto. fiz algumas alteraçoes para que ele controlasse um robo no estilo drone, funciona perfeitamente mas gostaria de adicionar alguns sensores nele de modo que os dados obitidos pelos sensores fossem exibidos na pagina html que esta no cartao sd. por enquanto so consigo que isso funcione em conjunto com o codigo html dentro do arduino. desde ja agradeço por qualquer ajuda.

ola, sou novo com o arduino, e estou com uma duvida utilizei esse topico para criar meu projeto. fiz algumas alteraçoes para que ele controlasse um robo no estilo drone, funciona perfeitamente mas gostaria de adicionar alguns sensores nele de modo que os dados obitidos pelos sensores fossem exibidos na pagina html que esta no cartao sd. por enquanto so consigo que isso funcione em conjunto com o codigo html dentro do arduino. desde ja agradeço por qualquer ajuda.