AJUDA!!Ethernet Shield não está a comunicar correctamente!

Boa Noite pessoal, iniciei esta semana um projecto com Arduino Uno e Ethernet Shield WIZNET, o projecto basicamente é o sensor DHT22 e BMP180 que enviam informação da temperatura na rua, humidade, pressão etç para o ThingSpeak, o problema é que as vezes a estação liga-se a rede outras vezes não.

No serial diz a Estação ligou-se a rede com DHCP, e ela nao se liga aparecendo depois falha na conecção.

Outras vezes liga-se ao fim de algumas tentativas.

Vou postar codigo aqui. Obrigado

//Estação Metereológica SPT V1.0 Ethernet Shield
//Baseado em envio de dados para Thingspeak
#include "DHT.h"
#include <SPI.h>
#include <Ethernet.h>
#include <Adafruit_BMP085.h>
#include <Wire.h> 



#define DHTPIN 2 

#define DHTTYPE DHT22

Adafruit_BMP085 bmp;


// Definicões do sensor : pino, tipo
DHT dht(DHTPIN, DHTTYPE);


// Definições da Rede Local
byte mac[] = { 0xD4, 0x28, 0xB2, 0xFF, 0xA0, 0xA1 }; // Deve ser o unico na Rede LOCAL

byte ip[]      = { 192, 168,   1,  200 };                // Must be unique on local network
byte gateway[] = { 192, 168,   1,   254 };
byte subnet[]  = { 255, 255, 255,   0 };





// Initialize Arduino Ethernet Client
EthernetClient client;


// Definições ThingSpeak
char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "NN20KMC0QB71XFDG";
const int updateThingSpeakInterval = 16 * 1000;      // Tempo intervalo em Milisegundos ThingSpeak (Numero de Segundos * 1000 = interval)

// Configuração Varíavel 
long lastConnectionTime = 0; 
boolean lastConnected = false;
int failedCounter = 0;

void setup()
{
  // Arranca a Porta Serial para Debug no Monitor Serial
  Serial.begin(9600);

  dht.begin();
  bmp.begin();

  
  // Arranca a Placa Ethernet
  startEthernet();
}

void loop()
{
  // Leitura da Humidade
  float h = dht.readHumidity();
  // Leitura da temperatura (Celsius)
  float t = dht.readTemperature();
  //Leitura Temperatura BMP180
  float b = bmp.readTemperature();
  //Leitura da Altitude do BMP180
  float a = bmp.readAltitude();
  //Leitura de Pressão
  float p = bmp.readPressure();
  //Leitura de Altitude Real
  float ra = bmp.readAltitude(101500);
  //Altitude Relação ao Mar
  float am = bmp.readSealevelPressure();
  
  // Verifica se o sensor esta respondendo
  if (isnan(h) || isnan(t))
  {
    Serial.println("Falha ao ler dados do Sensor DHT22");
    return;
  }

  // Faz a leitura do Valor de Temperatura e Humidade
  String analogValue0 = String(t);
  String analogValue1 = String(h);
  String analogValue2 = String(b);
  String analogValue3 = String(a);
  String analogValue4 = String(p);
  String analogValue5 = String(ra);
  String analogValue6 = String(am);

//Serial.println(t);
  //Serial.println(b);
 //Serial.println(ra);
  //Serial.println(am);
// delay(3000);

 
  
  // Mostra a actualização do Sensor
  if (client.available())
  {
    char c = client.read();
    Serial.print(c);
  }

  // Desliga-se do ThingSpeak
  if (!client.connected() && lastConnected)
  {
    Serial.println("...Desligado");
    Serial.println();
    
    client.stop();
  }
  
  //  Actualiza o Thingspeak
  if(!client.connected() && (millis() - lastConnectionTime > updateThingSpeakInterval))
  {
    //updateThingSpeak("field1="+analogValue0);
    //updateThingSpeak("field2="+analogValue1);
    //updateThingSpeak("field3="+analogValue2);
    //updateThingSpeak("field4="+analogValue3);
    updateThingSpeak("field1="+analogValue0+"&field2="+analogValue1+"&field3="+analogValue2+"&field4="+analogValue3+"&field5="+analogValue4+"&field6="+analogValue5+"&field7="+analogValue6);
  }
  
  // Check if Arduino Ethernet needs to be restarted
  if (failedCounter > 3 ) {startEthernet();}
  
  lastConnected = client.connected();
}

void updateThingSpeak(String tsData)
{
  if (client.connect(thingSpeakAddress, 80))
  {         
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(tsData.length());
    client.print("\n\n");

    client.print(tsData);
    
    lastConnectionTime = millis();
    
    if (client.connected())
    {
      Serial.println("Connecting to ThingSpeak...");
      Serial.println();
      
      failedCounter = 0;
    }
    else
    {
      failedCounter++;
  
      Serial.println("A conecção com o Servidor falhou... ("+String(failedCounter, DEC)+")");   
      Serial.println();
    }
    
  }
  else
  {
    failedCounter++;
    
    Serial.println("Conecção com o servidor falhou, tentaiva ("+String(failedCounter, DEC)+")");   
    Serial.println();
    
    lastConnectionTime = millis(); 
  }
}

void startEthernet()
{
  
  client.stop();

  Serial.println("Conectar a Estação a rede...");
  Serial.println();  

  delay(1000);
  
  // Connect to network amd obtain an IP address using DHCP
  if (Ethernet.begin(mac) == 0)
  {
    Serial.println("DHCP Failed, reset Arduino to try again");
    Serial.println();
  }
  else
  {
    Serial.println("A Estação ligou-se a rede usando DHCP");
    Serial.println();
  }
  
  delay(1000);
}

Acho que podes escalonar melhor o código... ou como já fiz anteriormente, fazer download da biblioteca da ThingSpeak em vez de estar a fazer tudo manualmente.

Porque é que terminas o cliente se ainda não configuraste a porta Ethernet??

  client.stop();

Algum motivo para estares a usar DHCP? Com DHCP o código aumenta bastante e tens também de chamar o método Ethernet.maintain regularmente para não seres desligado do router/switch. Por esse motivo, usar uma morada fixa será melhor... julgo eu.

Já experimentaste adicionar o maintain()?