Olá uso um mega com o Ethernet shield ha um bom tempo e venho percebendo de vez em quando que após o modem reiniciar por falta de energia ou até mesmo quando o modem da operadora perde conexão e se restabelece o Arduíno as vezes não retorna de forma correta para ser acessado, sendo que preciso reiniciar ele para voltar a funcionar.
Não sei qual problema que pode gerar este erro, geralmente demora meses para ocorrer será que se implementar alguma forma de testar a conexão com algum ping e reiniciar o Arduíno ?
Pode o arduino não renovar o IP e o modem/router não aceitar algo com IP fixo nos portos.
Configurar o router para ter um IP fixo em determinado porto, resolve isso.
Outro problema pode ter a ver com o código.
Se o arduino estiver a ler do ethernet shield dependendo se está conectado em vez de ser dependente dos caracteres em buffer, o W5100 bloqueia e não deixa reutilizar o socket.
OK coloquei todo o código aqui, nas configurações de rede fiz apenas a regra nat na porta 7777 para o ip do Arduíno essa questão de buffer realmente desconheço, nó código usei como base o exemplo do próprio Arduíno o sketch "ETHERNET - WEBSERVER"
#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal.h>
//#include <SD.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
EthernetServer server(7777);
IPAddress ip(10,0,0,120 );
#include "DHT.h"
#define DHTPIN A12
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#define BAUD_RATE 9600
#define TERM_CHAR '\n'
#define BUF_LEN 30
byte sampledata=50;
int h;
int t;
int i;
int count=0;
char c;
String readString = String(BUF_LEN);
void setup()
{
// disable Ethernet chip
pinMode(53, OUTPUT);//pino sd card mega no uno é o 10
digitalWrite(10, HIGH);
Serial.begin(9600);
//********************************************************************************************
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
Serial.begin(9600);
Serial.println("Iniciando programa..");
Serial.print(Ethernet.localIP());
//server.begin();
}
void loop()
{
//EthernetServer server(7777);//retorna com a porta
EthernetClient client = server.available();
if(client)
{
boolean continua = true;
String linha = "";
while(client.connected())
{
if(client.available()){
char c = client.read();
linha.concat(c);
if(c == '\n' && continua)
{
client.println("HTTP/1.1 200 OK");
// IMPORTANTE, ISSO FAZ O ARDUINO RECEBER REQUISIÇÃO AJAX DE OUTRO SERVIDOR E NÃO APENAS LOCAL.
client.println("Content-Type: text/javascript");
client.println("Access-Control-Allow-Origin: *");
client.println();
int iniciofrente = linha.indexOf("?");
if(iniciofrente>-1){ //verifica se o comando veio
iniciofrente = iniciofrente+6; //pega o caractere seguinte
int fimfrente = iniciofrente+3; //esse comando espero 3 caracteres
String acao = linha.substring(iniciofrente,fimfrente);//recupero o valor do comando
if ( acao == "001"){
digitalWrite(LUZ1, HIGH);
if(currentMillis - previousMillis >= 500) {
previousMillis = currentMillis;
lcd.setCursor(0,0);
lcd.print("Comando WEB ");
lcd.setCursor(0,1);
lcd.print("Rele 1 ON ");
}
}
client.print("dados({ sensor1 : ");
client.print(t);
client.print(", sensor2 : ");
client.print(h);
client.print(",");
client.print(" LUZ1 : ");
client.print(digitalRead(LUZ1));
client.print(",");
client.print(" LUZ2 : ");
client.print(digitalRead(LUZ2));
//client.print("})");
client.print(",");
client.print(" LUZ3 : ");
client.print(digitalRead(LUZ3));
client.print(",");
client.print(" LUZ4 : ");
client.print(digitalRead(LUZ4));
client.print(",");
client.print(" LUZ5 : ");
client.print(digitalRead(LUZ5));
client.print(",");
client.print(" LUZ6 : ");
client.print(digitalRead(LUZ6));
client.print(",");
client.print(" LUZ7 : ");
client.print(digitalRead(LUZ7));
client.print(",");
client.print(" LUZ8 : ");
client.print(digitalRead(LUZ8));
client.print(",");
client.print(" ALARME1 : ");
client.print(alarme1);
client.print(",");
client.print(" ALARME2 : ");
client.print(alarme2);
client.print("})");
}
break;
}
if(c == '\n') {
continua = true;
}
else if (c != '\r') {
continua = false;
}
}
}
delay(1);
client.stop();
}
}