Arduino colgado o webserver deja de funcionar

Hola tengo problemas de hace tiempo con un webserver, tengo una placa arduino mega con ethernet shield, cuando cargo el sketch funciona a la perfección, el problema se da con el tiempo de repente deja de funcionar, puede ser después de unas horas o un día, lo que tengo que hacer es reiniciarlo y aun asi aveces lo hago hasta dos o tres veces al mismo tiempo para que empiece a funcionar de nuevo pero al final despues del tiempo que les menciono deja de funcionar...

Este mismo código solo que con menos controles digitales (menos código) lo cargo en un arduino uno y pasa exactamente lo mismo...

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

//Declaración de la direcciones MAC e IP. También del puerto 80
byte mac[] = {0x00, 0x22, 0x48, 0x9f, 0xe2, 0x3d}; //MAC
IPAddress ip(10, 10, 1, 16); //IP
IPAddress gateway(10, 10, 1, 253);
IPAddress subnet(255, 255, 0, 0);
IPAddress dnServer(10, 10, 1, 253);
EthernetServer servidor(82);

int PIN_LED = 8;
String readString = String(30);
String state41 = String(3);
String state39 = String(3);
String state37 = String(3);
String state35 = String(3);
String state33 = String(3);
String state31 = String(3);
String srcimg = "http://ceaipes.ddns.net:83/prueba2/css2/images/";

void setup()
{

Ethernet.begin(mac, ip, subnet, gateway, dnServer); //Inicializamos con las direcciones asignadas
servidor.begin();
pinMode(41, OUTPUT);
pinMode(39, OUTPUT);
pinMode(37, OUTPUT);
pinMode(35, OUTPUT);
pinMode(33, OUTPUT);
pinMode(31, OUTPUT);

digitalWrite(41, LOW);
digitalWrite(39, LOW);
digitalWrite(37, LOW);
digitalWrite(35, LOW);
digitalWrite(33, LOW);
digitalWrite(31, LOW);

state41 = "OFF";
state39 = "OFF";
state37 = "OFF";
state35 = "OFF";
state33 = "OFF";
state31 = "OFF";
}

void loop()
{
EthernetClient cliente = servidor.available();

if (cliente)
{
boolean lineaenblanco = true;
while (cliente.connected()) //Cliente conectado
{
if (cliente.available())
{
char c = cliente.read();
if (readString.length() < 30) //Leemos petición HTTP caracter a caracter
{
readString.concat(c); //Almacenar los caracteres en la variable readString
}
if (c == '\n' && lineaenblanco) //Si la petición HTTP ha finalizado
{
int LED = readString.indexOf("LED=");
if (readString.substring(LED, LED + 7) == "LED=F41")
{
digitalWrite(41, LOW);
state41 = "OFF";
} else if (readString.substring(LED, LED + 7) == "LED=T41")
{
digitalWrite(41, HIGH);
state41 = "ON";
}
else if (readString.substring(LED, LED + 7) == "LED=541")
{
digitalWrite(41, HIGH);
delay(5000);
digitalWrite(41, LOW);
state41 = "OFF";
}

if (readString.substring(LED, LED + 7) == "LED=F39")
{
digitalWrite(39, LOW);
state39 = "OFF";
} else if (readString.substring(LED, LED + 7) == "LED=T39")
{
digitalWrite(39, HIGH);
state39 = "ON";
}
else if (readString.substring(LED, LED + 7) == "LED=539")
{
digitalWrite(39, HIGH);
delay(5000);
digitalWrite(39, LOW);
state39 = "OFF";
}

if (readString.substring(LED, LED + 7) == "LED=F37")
{
digitalWrite(37, LOW);
state37 = "OFF";
} else if (readString.substring(LED, LED + 7) == "LED=T37")
{
digitalWrite(37, HIGH);
state37 = "ON";
}
else if (readString.substring(LED, LED + 7) == "LED=537")
{
digitalWrite(37, HIGH);
delay(5000);
digitalWrite(37, LOW);
state37 = "OFF";
}

if (readString.substring(LED, LED + 7) == "LED=F35")
{
digitalWrite(35, LOW);
state35 = "OFF";
} else if (readString.substring(LED, LED + 7) == "LED=T35")
{
digitalWrite(35, HIGH);
state35 = "ON";
}
else if (readString.substring(LED, LED + 7) == "LED=535")
{
digitalWrite(35, HIGH);
delay(5000);
digitalWrite(35, LOW);
state35 = "OFF";
}

//Cabecera HTTP estándar
cliente.println("HTTP/1.1 200 OK");
cliente.println("Content-Type: text/html");
cliente.println();
//Página Web en HTML
cliente.println("");
cliente.println("");
cliente.println("");
cliente.println("LAMPARA ON/OFF");
cliente.println("");
cliente.println("");
cliente.println("");

cliente.println("

");
// cliente.println("");

cliente.print("Estado de Salida 41: ");
cliente.print(state41);
cliente.println("

<a class=abrir onClick=location.href='./?LED=T41'><img src="+srcimg+"abrir.png /><a class=cerrar onClick=location.href='./?LED=F41'><img src="+srcimg+"cerrar.png /><a class=5min onClick=location.href='./?LED=541'><img src="+srcimg+"5min.png />
");
cliente.println("
");

cliente.print("Estado de Salida 39: ");
cliente.print(state39);
cliente.println("

<a class=abrir onClick=location.href='./?LED=T39'><img src="+srcimg+"abrir.png /><a class=cerrar onClick=location.href='./?LED=F39'><img src="+srcimg+"cerrar.png /><a class=5min onClick=location.href='./?LED=539'><img src="+srcimg+"5min.png />
");
cliente.println("
");

cliente.print("Estado de Salida 37: ");
cliente.print(state37);
cliente.println("

<a class=abrir onClick=location.href='./?LED=T37'><img src="+srcimg+"abrir.png /><a class=cerrar onClick=location.href='./?LED=F37'><img src="+srcimg+"cerrar.png /><a class=5min onClick=location.href='./?LED=537'><img src="+srcimg+"5min.png />
");
cliente.println("
");

cliente.print("Estado de Salida 35: ");
cliente.print(state35);
cliente.println("

<a class=abrir onClick=location.href='./?LED=T35'><img src="+srcimg+"abrir.png /><a class=cerrar onClick=location.href='./?LED=F35'><img src="+srcimg+"cerrar.png /><a class=5min onClick=location.href='./?LED=535'><img src="+srcimg+"5min.png />
");
cliente.println("
");

cliente.println("");
cliente.println("

");
cliente.println("");
cliente.stop();//Cierro conexión con el cliente
readString = "";
}
}
}
}
}

Alguien por ahí ????

Muy buenas, tengo un problema similar con mi Arduino UNO + Shield Wifi.

Mi servidor funciona durante un tiempo y al cabo del rato se cuelga y no vuelve a funcionar hasta que se reinicia. He comprobado que si tiene un cliente conectado con el que comunicarse aguanta depie (al menos 1 o 2 días) pero cuando se queda sin carga se cae al poco rato.

Buscando en el foro encontré un problema similar que tal vez te sirva:
http://forum.arduino.cc/index.php?topic=269185.0

Yo he probado a darle alimentación directa al Arduino por si se tratase de eso y a conectarle que el propio Arduino se conecte a si mismo para mantenerse activo. Por ahora sin exito. Ahora mismo estaba intentando que el servidor comprobara períodicamente su estado y si no está conectado volviese a intentar la reconexión.

Te dejo el código por si te pudiese servir.

#include <WiFi.h>
#include <SPI.h>

// Network configuration.
char ssid[] = SSID;
char pass[] = PASS;
IPAddress jailIP(serverIP);
WiFiServer server(80);
//WiFiClient client_perm;

int status = WL_IDLE_STATUS;

double refTime = millis();
double currentTime = 0;

void setup() {
  Serial.begin(9600);
  
  connectWiFi();
  
  // Connecting permanent client
  //delay(1000);
  // client_perm.connect(routerip,80);
  //if (client_perm) {
  //   Serial.println("permanent client connected");
  //}
  
  Serial.print("WiFi firmware version: ");
  Serial.println(WiFi.firmwareVersion());

    //Reference values
  Serial.println("---------------------------------------------"); 
  Serial.println("Reference values:");
  Serial.print("WL_CONNECTED - "); Serial.println(WL_CONNECTED);
  Serial.print("WL_NO_SHIELD - "); Serial.println(WL_NO_SHIELD);
  Serial.print("WL_IDLE_STATUS - "); Serial.println(WL_IDLE_STATUS);
  Serial.print("WL_NO_SSID_AVAIL - "); Serial.println(WL_NO_SSID_AVAIL);
  Serial.print("WL_SCAN_COMPLETED - "); Serial.println(WL_SCAN_COMPLETED);
  Serial.print("WL_CONNECT_FAILED - "); Serial.println(WL_CONNECT_FAILED);
  Serial.print("WL_CONNECTION_LOST - "); Serial.println(WL_CONNECTION_LOST);
  Serial.print("WL_DISCONNECTED - "); Serial.println(WL_DISCONNECTED);
  Serial.println("---------------------------------------------");  
}

void loop() { 
  
  currentTime = millis();
  
  if ((currentTime - refTime) > 5000) {
    // Send the current temperature and humidity each 5 seconds.
    WiFiClient client = server.available();
    if (client == true) {
        Serial.println("Client connected");
    }
    refTime = currentTime;
  }

  Serial.print("Server status=");
  Serial.println(server.status());

  if (server.status() != WL_NO_SSID_AVAIL)  {
      connectWiFi();
  }
  delay(100);

}

void connectWiFi() {
  /* Connect to the provided WLAN if possible.*/ 
  
    if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("Fatal Error - No WiFi Shield detected!");
    while (true) {};
  }
  else {
    Serial.print("Connecting Wifi...");
      // Trial to set a fix IP address to the Jail.
      WiFi.config(jailIP);
  
    if (WiFi.begin(ssid,pass) == WL_IDLE_STATUS) {
      Serial.println("Fail");
      Serial.println("Connection refused!");
      delay(10000);
    }
    else {
       Serial.println("OK");
       Serial.print("Succesfully connected to ");
       Serial.println(ssid);
       server.begin();
       Serial.println("Server initializated");
    }
  }
}

Por ahora sigo haciendo pruebas a ver si logro mantener vivo al servidor. ¡Si alguien sabe el motivo de estos bloqueos sería de gran ayuda!

Hola oldsphere pues yo he intentado varias cosas y no me ha funcionado, inclusive compre un arduino mega por si era problema de memoria pero sigue en las mismas, el problema es que no se en que momento se atora pueden pasar algunas horas o 1 día, 2, y el problema es que no se porque, hice pruebas con otras ethernet shield le quite css al webserver, en fin sin éxito alguno, ojala alguien nos eche la mano, gracias

Yo conectaba mi servidor al servidor del Arduino y acababa petando por la base de datos, porque no cerraba las conexiones. No se si os sera de ayuda, cuando encendeis el arduino y probais muchas veces seguidas funciona todo perfecto?

Hola Bujan pues no tengo ese problema, el arduino en todo momento responde, siempre esta mandando datos a la base de datos, el problema se da cuando entro al web server...

Eso es lo que he estado probando. Me he hecho un script de python que se conecta durante 1 minuto en intervalos aleatorios entre 30s y 15min. Las dos primeras pruebas funcionaron sin problemas durante 21h y 39h respectivamente. La tercera prueba lleva 46,45h.

Lamentablemente, aunque el arduino está configurado para reconectarse una vez se cae no logra volver a reconectar...

Pensé que podía deberse a alguna variable o buffer que se iba llenando y cuando desbordaba petaba el arduino, pero los tiempos que tarda en llegar al fallo parecen aleatorios así que no se si eso tiene mucho sentido. Seguiré haciendo pruebas a ver si encuentro algo que me ayude a descifrar que está pasando.

No se si probar a bajarle la versión del firmware a la anterior, a ver si le apetece funcionar...

Hola Oldsphere ya baje la version al firmware y sigue en las mismas condiciones, y si el problema es que no se en que momento exacto se cuelga...

Bueno, al final despues de 70h petó el último intento.
Gracias por el aviso jimmybarraza, me ahorro el intento. ¿Alguien tiene alguna idea sobre por donde seguir?

Estas usando un IP fija, no es posible que el router se la este asignando a otro elemento de la red por alguna razón?

Prueba a configurar el rango de DHCP del router de 17 en adelante, o desactivarlo y usa ip estáticas en todos los dispositivos de la red.

Podría venir por ahí el problema viendo la aleatoriedad de varios días incluso

Pues me parece una idea estupenda Go_zalo... efectivamente la ip que tiene estaba en el rango conflictivo por la DHCP. Acabo de cambiarlo y lanzar una prueba, a ver si superamos las 70h!!

Muchas gracias por la idea, ya os cuento si funciona!

Muy buenas y Feliz año a todos!

Lamentablemente mi placa WiFi no ha querido empezar bien el año y el 1 por la mañana volvió a petar después de 27h.
Tocará seguir peleandose...

Seguimos en las mismas, se sigue trabando estoy por rendirme ...

Tendrás que probar otro shield wifi... Con el mismo programa

Hola Estimados,

con el modulo ENC28J60 tengo un problema similar, se me cuelga con un sketch grande que tengo cargado en un mega. he notado que se cuelga mas rapido, cuando el delay entre el envio al servidor mysql y la llegada de la respuesta al arduino es mayor a 1.5 seg se cuelga super rapido.

es esquema es mas o menos así.

lee sensores, según valores acciona relee.
lee el timer y si es hora enviar los datos al server.
sigue el loop de los sensores y el timer.
si la respuesta del server se demoro se cuelga el modulo ether, pero el resto de los sensores siguen funcionando.
hace el envio, pero como esta colgado no hace nada y sigue el loop de los sensores.
el sketch se demora como 600 mili en recorrer todo el loop.

unas pruebas que hice estubo alrededor de 40 up, pero use el mega, el ether y una sonda de temperatura.
el sketch se demora 50 mili en recorrer el loop.

aun no consigo solucionarlo di vuelta por todo google, pero no conseguí mucho. pero creo que el problema esta en la respuesta del server y la función callback en mi caso. pero no he tenido tiempo de investigar mas, así que si les es de ayuda luego publicare el código.

disculpen es normal que se caliente el micro del shield ethernet? esque cada vez que la conecto se calienta y no se si es porque se haya quemado o asi sucede. hace tiempo se me quemo el micro de la arduino uno pero en esa ocasion si se calento muchisimo es por eso que pregunto

alguien que conteste porfavor. el ejemplo de webserver solo me envia en el monitor serial "server is 0.0.0.0" y no se a que se deba

Hola.
Acabo de echar un vistazo a este hilo que acaban de abrir sobre ethernet shield, y tiene a su vez un vínculo en el que comenta dos cosas que quizás tengan que ver con este hilo:

  • Que es fácil que se produzca un problema de memoria (y consiguiente cuelgue) a poco que se incrementen las peticiones de clientes.
  • Que cuando se envían muchos datos la placa se calienta bastante.

Muy buenas,

Después de un tiempo he vuelto a las andadas con esto. En mi caso el arduino no tenía mucho tráfico, pero de todas formas decidí volver a empezar de nuevo por lo más sencillo.

El siguiente codigo es para que el Arduino conecte con la SSID y se quede conectado. Sin servidor, ni cliente ni tráfico ni nada. Cada 100ms comprueba que todo está como debe de estar y, si no lo está, manda un aviso del nuevo estado.

#include <WiFi.h>
#include <SPI.h>

// Network configuration
char ssid[] = SSID;
char pass[] = PASS;
IPAddress JailIP(192, 168, 1 , 100);
WiFiServer server(80);

int wifiStatus = WL_IDLE_STATUS;

void setup() {
  Serial.begin(9600);
  connectWiFi();
}

void loop() {
  // put your main code here, to run repeatedly:
  if (changeStatus())  {
    wifiStatus = WiFi.status();
   
    Serial.println(" Wifi status has changed!");
    Serial.print("New status is ");
    Serial.println(wifiStatus);
  }

   delay(100);
  
}


void connectWiFi() {
  /* Connect to the provided WLAN if possible */
  
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("Fatal Error - No WiFi Shield detected");
    while(true);  // don't continue
  }
  else {
    WiFi.config(JailIP);
    while ( wifiStatus != WL_CONNECTED ) {
      Serial.print( "Attempting to connect to SSID: ");
      Serial.println(ssid);

      wifiStatus = WiFi.begin(ssid,pass);
      Serial.print("WiFi status: ");
      Serial.println(wifiStatus);
      
      delay(10000);
    }
   Serial.print("Connected to ");
   Serial.println(ssid);
   Serial.print("IP Address: ");
   Serial.println(WiFi.localIP());
  }
}
    
 boolean changeStatus() {
    /* Check if the stastus of the Wifi have changed */

    int nStatus = WiFi.status();
    if (wifiStatus == nStatus) 
      return false;
    else
      return true;
}

El resultado es que cada 80s o así el sistema falla, tarda unos segundos en reponerse y al poco tiempo vuelve a reiniciarse el ciclo. Lo he probado con un arduino UNO rev2 y rev3 por si se tratase de eso pero nada. Viendo que la placa no es capaz ni de mantenerse sola conectada sin ningun tipo de carga me empiezo a temer que la placa está defectuosa y que voy a tener que buscarme alguna alternativa...
Intentaré a la desesperada reiniciar el software por si algo no le gustó la última vez y, si los vientos no cambian, tendré que darme por vencido y empezar a buscar alternativas.