W5100 hangs randomly while sending data to Exosite (Working Code Included)

Dear all,

I finally got my sketch to work with a Genuine Arduino Uno and W5100 shield. After an x amount of hours usually 15-18 hours the connection is lost. I observed several RX flashes, a link flash etc. Is there some sort of keep alive tip you can give me?

Here is my code:

#include <EEPROM.h>
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Exosite.h>
 
// Pin use
#define ONEWIRE 7 //pin to use for One Wire interface

// Set up which Arduino pin will be used for the 1-wire interface to the sensor
OneWire oneWire(ONEWIRE);
DallasTemperature sensors(&oneWire);
 
/*==============================================================================
* Configuration Variables
*
* Change these variables to your own settings.
*=============================================================================*/
String cikData = "myCIK";  // <-- FILL IN YOUR CIK HERE! (https://portals.exosite.com -> Add Device)
byte macData[] = {my mac data};        // <-- FILL IN YOUR Ethernet shield's MAC address here.

// User defined variables for Exosite reporting period and averaging samples
#define REPORT_TIMEOUT 30000 //milliseconds period for reporting to Exosite.com
#define SENSOR_READ_TIMEOUT 5000 //milliseconds period for reading sensors in loop


/*==============================================================================
* End of Configuration Variables
*=============================================================================*/

EthernetClient client;
Exosite exosite(cikData, &client);

//
// The 'setup()' function is the first function that runs on the Arduino.
// It runs completely and when complete jumps to 'loop()' 
//
void setup() {
  Serial.begin(9600);
  Serial.println("Boot");
  // Start up the OneWire Sensors library
  sensors.begin();
  delay(1000);
  Serial.println("Starting Exosite Temp Monitor");
  Serial.print("OneWire Digital Pin Specified: ");
  Serial.println(ONEWIRE);
  Ethernet.begin(macData);
  // wait 3 seconds for connection
  delay(3000); 

}

//
// The 'loop()' function is the 'main' function for Arduino 
// and is essentially a constant while loop. 
//
void loop() {
  static unsigned long sendPrevTime = 0;
  static unsigned long sensorPrevTime = 0; 
  static float temp1F;
  static float temp2F;
  static float temp3F;
  char buffer[7];
  String readParam = "";
  String writeParam = "";
  String returnString = "";  
   
  Serial.print("."); // print to show running

// Read sensor every defined timeout period
  if (millis() - sensorPrevTime > SENSOR_READ_TIMEOUT) {
    Serial.println();
    Serial.println("Requesting temperature...");
    sensors.requestTemperatures(); // Send the command to get temperatures
    float temp1C = sensors.getTempCByIndex(0);
    Serial.print("Celsius:    ");
    Serial.print(temp1C);
    Serial.println(" C ..........DONE");
    temp1F = DallasTemperature::toFahrenheit(temp1C);
    Serial.print("Fahrenheit: ");
    Serial.print(temp1F);
    Serial.println(" F ..........DONE");
    delay(1000);
    
    sensors.requestTemperatures(); // Send the command to get temperatures
    float temp2C = sensors.getTempCByIndex(1);
    Serial.print("Celsius:    ");
    Serial.print(temp2C);
    Serial.println(" C ..........DONE");
    temp2F = DallasTemperature::toFahrenheit(temp2C);
    Serial.print("Fahrenheit: ");
    Serial.print(temp2F);
    Serial.println(" F ..........DONE");
    delay(1000);
    sensors.requestTemperatures(); // Send the command to get temperatures
    float temp3C = sensors.getTempCByIndex(2);
    Serial.print("Celsius:    ");
    Serial.print(temp3C);
    Serial.println(" C ..........DONE");
    temp3F = DallasTemperature::toFahrenheit(temp3C);
    Serial.print("Fahrenheit: ");
    Serial.print(temp3F);
    Serial.println(" F ..........DONE");
    delay(1000);
    
    sensorPrevTime = millis();
  }

  // Send to Exosite every defined timeout period
  if (millis() - sendPrevTime > REPORT_TIMEOUT) {
    Serial.println(); //start fresh debug line
    Serial.println("Sending data to Exosite...");
    
    readParam = "";        //nothing to read back at this time e.g. 'control&status' if you wanted to read those data sources
    writeParam = "temp1="; //parameters to write e.g. 'temp=65.54' or 'temp=65.54&status=on'
    
String tempValue = dtostrf(temp1F, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2
    
    writeParam += tempValue;    //add converted temperature String value
    
    writeParam += "&temp2="; //parameters to write e.g. 'temp=65.54' or 'temp=65.54&status=on'
    
   tempValue = dtostrf(temp2F, 1, 2, buffer); 
    
    writeParam += tempValue;    //add converted temperature String value
    
     writeParam += "&temp3="; //parameters to write e.g. 'temp=65.54' or 'temp=65.54&status=on'
    
   tempValue = dtostrf(temp3F, 1, 2, buffer); 
    
    writeParam += tempValue;    //add c
    
    
    
    //writeParam += "&message=hello"; //add another piece of data to send

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
      Serial.println("Exosite OK");
      if (returnString != "") {
        Serial.println("Response:");
        Serial.println(returnString);
      }
    }
    else {
      Serial.println("Exosite Error");
    }

    sendPrevTime = millis(); //reset report period timer
    Serial.println("done sending.");
  }
  delay(1000); //slow down loop
}

and the working output:

https://portals.exosite.com/views/2912715874/1035621595 (you can also observe the “dead time”)