[Ajuda] EthernetShield W5100 + ArduinoMega 2650 Webclient não conecta

Comprei Ethernet shield W5100 e juntei ao meu arduino mega 2650 e utilizei o sketch de exemplo disponível no arduino Webclient.
O problema é que qualquer que seja o server que meta o arduino responde sempre “conection failed” nunca consegue conectar.

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,110 };
byte server[] = { 209,85,147,147 }; // www.google.com

// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
Client client(server, 80);

void setup() {
  // start the Ethernet connection:
  Ethernet.begin(mac, ip);
  // start the serial library:
  Serial.begin(9600);
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect()) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /arduino/arduinocode.text HTTP/1.0");
    client.println();
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    for(;;)
      ;
  }
}

Alguém tem alguma ideia de qual pode ser o problema?

Edit:

Consegui com que o arduino conseguisse conectar-se mas, apenas consigo isso se premir várias vezes no reset, parece que só as vezes é que se consegue ligar…
Alguma sugestão para evitar este problema?
Nota: Continuo a utilizar o mesmo código acima, ou seja, o exemplo disponibilizado ethernet WebClient.

Dependendo do tipo de escudo que estás a usar pode haver vários problemas.

a placa de Ethernet, que versão é? As mais recentes permitem o uso do SPI para comunicar com elas através daqueles 6 pinos que estão no Arduino. No entanto, as mais antigas não têm essa ligação e sem isso, os pinos do SPI (MISO, MOSI,SCK, SS) não combinam um com o outro.

Caso tudo esteja bem no hardware, tens de ter a certeza que a placa está ligada com um endereço IP que funcione dentro de casa. Alguns routers não dão acesso a endereços 110... Alguns não permitem IPs estáticos e precisas de correr um DHCP, etc...

Logo, primeiro tenta fazer um ping ao Arduino e vê se consegues ligação. Depois verifica isto que disse das ligações ao barramento SPI. Eu li isto na página da placa na sparkfun que tal vez te ajude:

Note that because the W5100 and SD card share the SPI bus, only one can be active at a time. If you are using both peripherals in your program, this should be taken care of by the corresponding libraries. If you're not using one of the peripherals in your program, however, you'll need to explicitly deselect it. To do this with the SD card, set pin 4 as an output and write a high to it. For the W5100, set digital pin 10 as a high output.

A versão da minha ethernet shield deve ser a ultima porque já faz ligação ICSP no centro do arduino mega logo a nível de hardware está a funcionar direito. Também consigo fazer ping sem problemas.
Já consegui uma conexão mas não sei porque nem sempre ele conecta a primeira.

O meu objectivo é analisar páginas php através do arduino a fim de activar as I/O dependendo dos valores que tenho no site, mas o me está a dificultar mais é arranjar uma maneira de interpretar as páginas usando o arduino.

Exemplo de uma monitorização feita pela porta série página php lida pelo arduino:

HTTP/1.1 200 OK
Date: Tue, 09 Aug 2011 23:22:24 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Content-Length: 1
Connection: close
Content-Type: text/html
<p>Sensor 1: 45º</p>
<p>Sensor 2: 23º</p>

Neste caso queria guardar os valores 45 e 23 a fim de os mostar num display LCD por exemplo.
Se alguém tiver alguma ideia de como poderei fazer isto :roll_eyes:

Fazes uma fnucão que encontre a palavra sensor na string e tiras os dados uqe estiverem entre essa palavra e o caracter <.

Os exemplos do Arduino na maioria das vezes são bem escritos, mas esse do Ethershield só serve para mostrar o caminho das pedras…
ele inicia o cliente ethernet, inicia o serial e ESPERA (delay) apenas 1 segundo, o que acho pouco para as latendias da rede/roteador, experimente aumentar o delay para 2000 e veja se tem sucesso, isso é quebra galho.

Roda este sketch que eu modifiquei para saber quanto tempo demora para se conectar…

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
unsigned long start
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,110 };
byte server[] = { 209,85,147,147 }; // www.google.com

// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
Client client(server, 80);

void setup() {
  // start the Ethernet connection:
  Ethernet.begin(mac, ip);
  // start the serial library:
  Serial.begin(9600);
  // give the Ethernet shield a second to initialize:
 
 //delay(1000); AO INVÉS DESSE DELAY VAMOS VER QUANTO TEMPO DEMORA PARA CONECTAR...


start=millis() ;
while(!client.connect()){
delay(50); //ESPERA 50MS PARA NÃO SOBRECARREGAR O ETHERSHIELD COM REQUISIÇÕES
}
Serial.println(" ");
Serial.print(millis()-start);
Serial.println("ms é o tempo que demorou para fazer a conexão.");


  // if you get a connection, report back via serial:
  if (client.connect()) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /arduino/arduinocode.text HTTP/1.0");
    client.println();
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    for(;;)
      ;
  }
}

Corri o código que forneceu para ver o tempo que demorava a conectar.

Obtive sempre valores a volta dos 800ms, vou mudar para 2s para assegurar que conecta.

816ms é o tempo que demorou para fazer a conexão.

Em relação a função para interpretar paginas html estou a ter algumas dificuldades pois consegui fazer a função.
Consegui fazer esta função que guarda de uma pagina web o que estiver dentro de ‘<’ e ‘>’, mas não é bem isto que preciso.
Queria começar a gravar depois de encontrar uma certa palavra e não um carácter, por exemplo quando encontrar a palavra ‘Sensor 1: ’ e termina de gravar quando encontrar ’ .’ (espaço + ponto).

char inString[32]; // string para a serial data
int stringPos = 0; // posicao da string
boolean startRead = false; // verifica a leitura

String readPage(){
//le a pagina e retorna tudo entre ‘<’ e ‘>’

stringPos = 0;
memset( &inString, 0, 32 ); //apaga a string em memoria

while(true){

if (client.available()) {
char c = client.read();

if (c == ‘<’ ) { //’<’ caracter inicial
startRead = true; //inicia leitura
}else if(startRead){

if(c != ‘>’){ //’>’ caracter final
inString[stringPos] = c;
stringPos ++;
}else{
//já leu a string logo pára a leitura
startRead = false;
client.stop();
client.flush();
Serial.println(“disconnecting.”);
return inString;

}

}
}

}

}

Procura por documentacão sobre estas funcões:

strstr() (procura uma string dentro de outra)

strcasestr().

Deve dar para o que pretendes, não?

Um problema com que me deparei por exemplo, estamos a ler continuamente uma página como é que posso comparar uma string com uma char c que sai do client.read()?

Acho que não é possível gravar a página inteira numa string para depois comparar certo? Não tenho ideias de como fazer isto. :(

Pois… Isso é um problema. Eu uso C, e como tal, tenho acesso ao buffer de memória para onde o Arduino leu a página Web. Então posso usar essa função, encontrar os dados que pretendo e deitar fora o que não preciso e repetir a leitura se ainda não esvaziei o buffer.

No entanto, só lendo um char de cada vez, torna-se mais complicado de fazer porque se leres para memória vais acabar por encher toda a memória do Arduino.

O que resultaria era algo como:

while (client.available() )  {

char c = client.read();

if (c== '<') { 

//encontra a parte que te importa ler para um array
//processa os dados

client.flush(); //limpa o buffer que já não é preciso
//salta do ciclo

}

O post desse cara mostra um modo de buscar um texto no buffer http://arduino.cc/forum/index.php/topic,70000.0.html Vá no site dele e olhe o codigo do RECEIVER e siga a variável ident.