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:
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?
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:
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....
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 = "" 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
}
}
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
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.