[RESOLVIDO ufa...] Problema ao ler página web com Ethernet Shield

Salve pessoal,

Estou quebrando a cabeça, e realmente não sei onde posso estar errando.

Tenho um arduino mega 2560 com um ethernet shield. Nele eu uso com sucesso o servidor web, em que com o No Ip consigo me conectar no arduino e enviar alguns comenados.

Porém agora preciso fazer o arduino ler uma página web de tempos em tempos, porém o arduino consegue se conectar, mas não retorna nenhuma leitura da página. Abaixo os trechos de código que são relevantes ao caso. O método que efetua a leitura é o notificaIP.

O problema está neste trecho de código. Ambas as instruções clientIP.connected() e clientIP.available() sempre retornam falso, independente do tempo que espero (Já coloquei o numT com 10000).

while((!clientIP.connected() || !clientIP.available()) && numT<100) {
Serial.print(F(“Espera dados”));
Serial.println(numT);
delay(1);
numT++;
}
while (clientIP.connected() || clientIP.available()) {
c = clientIP.read();
Serial.print(c);
}

Será que alguém consegue me ajudar?

//FreeMemory
#include <MemoryFree.h>

//Incluir modulos ethernet
#include <SPI.h>
#include <Ethernet.h>

//Incluir modulo SD
#include <SD.h>

//Sensor temperatura
#include <DHT.h>

// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   20

//Variaveis ethernet
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,177); 
byte subnet[] = { 
  255, 255, 255, 0 };
byte gateway[] = { 
  192, 168, 0, 1 };
EthernetServer server(80);
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer

EthernetClient clientIP;
unsigned long horaNotIP;

//Variaveis SD


//## Declacao dos Pinos INICIO
//Pinos do sensor temperatura e humidade
const int pinTemp = A8;
//Pino do SD
const int pinSD = 4;
//Pin leds
const int pinLedAmarelo = 6;
const int pinLedVerde = 7;
//Pinos dos reles
const int pinRele1=22;
//Pino do buzzer
const int pinBuz=30;
//## Declacao dos Pinos FIM

//##Declaracao dos estados dos reles
int stRele1=0;
unsigned long horaAcionaRele;

//Led de aviso funcionamento
int stLedAmarelo=0;
unsigned long horaLedAmarelo;

//Declara sensor de temperatura
DHT dht(pinTemp, DHT11);
int valTemperatura=0;
int valTempMax=0;
int valTempMin=50;
int valHumidade=0;
int valHumMax=0;
int valHumMin=100;
unsigned long horaLeituraTemp;

void setup() {
  Serial.begin(9600);
  Serial.println(F("Iniciando dispositivo"));
  iniciaPinos();
  
  digitalWrite(pinLedVerde, HIGH);
  //Apito inicial
  tone(pinBuz,1500);
  delay(700);
  noTone(pinBuz);
  digitalWrite(pinLedVerde, LOW);  
  digitalWrite(pinLedAmarelo, HIGH);
  
  //Inicia variaveis de controle de intervalo de tempo
  horaAcionaRele=millis()-500;
  horaLeituraTemp = 0;
  horaLedAmarelo=millis()-100;
  horaNotIP=millis();
  
  Serial.println(F("Iniciar ethernet"));
  iniciaEthernet();  
  digitalWrite(pinLedAmarelo, HIGH);
  
  Serial.println(F("Iniciar cartao SD"));
  if (!iniciaSD()) {    
    Serial.println(F("ERRO: SD nao inicializado"));
    tone(pinBuz,600);
    delay(1000);
    noTone(pinBuz);
    return;
  } else {
    digitalWrite(pinLedAmarelo, LOW);
  }

  Serial.println(F("Iniciar valores max min"));
  iniciaValoresMaxMin();
  
  Serial.println(F("Iniciar sensor de temperatura"));
  dht.begin();
  lerSensorHumidadeTemperatura();
  digitalWrite(pinLedAmarelo, LOW);

  Serial.println(F("Notificar IP"));
  notificaIP();
  
  Serial.println(F("Dispositivo inicializado"));  
  
  Serial.print(F("Memoria disponivel inicio: "));
  Serial.println(freeMemory());
}

void loop() {  
  loopEthernet(); //Controle as requisições do servidor web
  lerSensorHumidadeTemperatura();
  
  //Notificar IP
  if (comparaTempo(horaNotIP)>=15000) {
    notificaIP();
  }

    Serial.print(F("Memoria: "));
    Serial.println(freeMemory());    
}

//Notificar alteracao de IP ao servidor
void notificaIP() {  
  if (clientIP.connect("http://minhacasa.bonino.com.br",80)) {
    Serial.println(F("Not IP"));
    clientIP.println("GET /com/notip.ashx HTTP/1.0");
    clientIP.println("Host: minhacasa.bonino.com.br");
    clientIP.println();
    
    char c;
    int numT=0;
    //esperar dados servidor

   //O problema começa aqui. Ambas as instruções clientIP.connected() e clientIP.available() sempre retornam falso, independente do tempo que espero (Já coloquei o numT com 10000).

    while((!clientIP.connected() || !clientIP.available()) && numT<100) {
      Serial.print(F("Espera dados"));
      Serial.println(numT);
      delay(1); 
      numT++;
    }
    while (clientIP.connected() || clientIP.available()) {
      c = clientIP.read();
      Serial.print(c);
    }    
    Serial.println(F("FIM"));
    
    Serial.println(F("Desconectando"));
    clientIP.stop();
  } else {
    Serial.println(F("Erro Not IP"));
  }
  horaNotIP=millis();
}

Acho que descobri o problema. Creio não ser possível usar o Ethernet Shield como servidor e cliente ao mesmo tempo.

Quando inicio o Ethernet da forma abaixo, o cliente não conecta.
Ethernet.begin(mac, ip, gateway, subnet);

Agora, se mudo a chamada do método, o cliente funciona, mas o server para de funcionar:
Ethernet.begin(mac);

Outro detalhe, para tornar a conexão estável, tive que aumentar o timeout do client.connec(server,80). (http://forum.arduino.cc/index.php/topic,49401.0.html)
Incluindo os trechos abaixo no código:
#include <utility/w5100.h>

E logo após o Ethernet.begin:
W5100.setRetransmissionTime(0x2710);
W5100.setRetransmissionCount(5);

Alguém tem alguma luz sobre como fazer o Ethernet Shield funcionar como cliente e servidor simultaneamente?

Abraços,

Ricardo

Finalmente consegui resolver o problema. E foi bem coisa de noob mesmo esse erro. Faltou eu especificar o servidor de DNS na chamada do ethernet.begin.

Declarei a variável dnsIP usando o dns público do Google (8.8.8.8) e alterei a chamada do método:
Ethernet.begin(mac, ip, dnsIP, gateway, subnet);

Fiz também algumas melhorias, como por exemplo no client.connect usar diretamente o IP e não a URL, perdendo menos tempo para resolver o IP. E para resolver o IP do site, criei um método específico que chamo no setup e também uma vez ao dia. Sendo que os códigos ficaram assim. O que acham?

//Notificar alteracao de IP ao servidor
void notificaIP() {   
  tempoNotIP=10000;
  int con;
  Serial.print(F("IP: "));
  Serial.println(serverIPRes);
  if (serverIPRes==1) {
    con = clientIP.connect(serverIP,80);
  } else {
    con = clientIP.connect(serverName,80);
  }
  
  Serial.print(F("Con "));
  Serial.println(con);
  
  if (con==1) {
    Serial.println(F("Not IP"));
    clientIP.println("GET /com/notip.ashx HTTP/1.0\r\nHost: minhacasa.bonino.com.br\r\nConnection: close\r\n\r\n");
    
    int numT=0;
    //esperar dados servidor
    while((!clientIP.connected() || !clientIP.available()) && numT<15000) {
      delay(1); 
      numT++;
    }
    Serial.println();
    
    while (clientIP.connected() || clientIP.available()) {
      char c = clientIP.read();
      if (req_index >= (REQ_BUF_SZ - 1)) req_index=0;
      if (req_index < (REQ_BUF_SZ - 1)) {
          HTTP_req[req_index] = c;          // save HTTP request character
          req_index++;
      }       
      Serial.print(c);
    }
    
    Serial.println(F("FIM"));
    
    Serial.println(F("Desconectando"));
    clientIP.stop();    

    if (StrContains(HTTP_req, "IP[")) {
      tempoNotIP=600000;
      Serial.println(F("Ler IP"));
    }
    
    //limpar buffer
    req_index = 0;
    StrClear(HTTP_req, REQ_BUF_SZ);    
  } else {
    Serial.println(F("Erro Not IP"));
  }
}

void resolveIPServer() {
  IPAddress tempIP;
  IPAddress errIP;
  
  tempoResIP=10000;
  
  serverIPRes = dnsClient.getHostByName(serverName,tempIP);
  if (serverIPRes==1) {
    if (!tempIP==errIP) {
      serverIP=tempIP;
      tempoResIP = 86400000;
      Serial.println(serverIP);
    } else {
      Serial.println(F("Erro IP2"));
    }
  } else Serial.println(F("Erro IP"));
}