Shield de Ethernet que se cuelga / deja de funcionar al azar

Hola,

Estoy haciendo pruebas con la shield de ethernet, esta, enviando datos a un servidor php que los almacena y tal. Lo único que hace el Arduino es coger los datos de los sensores y enviarlos al servidor cada X tiempo programado, no hace nada más.

El problema está en que el Arduino funciona correctamente el tiempo que le da la gana, siempre llega un momento en el que se cuelga y deja de enviar los datos. Bueno, realmente más que colgarse lo que sucede es que la tarjeta deja de hacer su trabajo correctamente, el Arduino sigue funcionando y dándome avisos de error de conexión con un buzzer que le he puesto.

Estos cuelgues pueden darse a los pocos minutos, o a las horas, o tres días después... a un amigo le sucede incluso 11 días después, y otro usuario de un foro lo mismo...

Al principio pensaba que sucedía por las elevadas temperaturas que coge el mosfet al alimentar la placa con 12V, pero lo descarte ya que la última semana ha estado con 5V por el USB y sucede lo mismo.

Por el momento he descartado:

  • Temperaturas del mosfet, ahora está por USB.
  • Que fuera cosa del Duemilanove, así que lo probé con un Mega.
  • Que se quede sin SRAM libre (está en 1245 bytes libres y estables con un ATmega328)
  • Que fuera cosa del servidor, pero no ya que se queda indefinidamente colgado.
  • Que el router le revocara la IP por enviar “1 dato” cada 15 minutos, también lo tuve a 5 minutos una semana. (Tiene configurada una IP estática en el DHCP)
  • Que fuera cosa del router, por ello lo conecte también directo al de Ono en vez del router neutro.
  • Que como por defecto se conecta al router solo en el setup pues perdiera la conexión (lo pase al loop).

Y ya no sé qué más probar la verdad. Alguna solución que os suene leer por internet?
Tenia intención de montar una estación meteorológica 2.0 pero así es inviable :confused:

PD:
El código sin lo del buzzer para que se entienda mejor:

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

#include <OneWire.h>
#include <DallasTemperature.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress  ip( 192, 168, 1, 6 );
IPAddress server( 111, 222, 333, 444 );  // La IP real del servidor
EthernetClient client;

OneWire oneWire(2);
DallasTemperature sensores(&oneWire);

unsigned long tiempoAntes = 0;
unsigned long tiempoAhora = 0;
unsigned long tiempoEnvio = 600000; // 10 minutos




int freeRam()
{
   extern int __heap_start, *__brkval;
   int v;
   return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}



void setup()
{
   Serial.begin(9600);
   sensores.begin();
   while( !Serial );
}



void loop()
{
   tiempoAhora = millis();
   
   if( tiempoAhora - tiempoAntes > tiempoEnvio )
   {
      tiempoAntes = tiempoAhora;

      conectarseAlRouter();
      
   
      if( !client.connect(server, 80) )
      {
         Serial.println("Error de conexion");
      }
      else
      {
         sensores.requestTemperatures();

         client.print("GET /arduino.php");
         
         client.print("?temperatura="); client.print( sensores.getTempCByIndex(0) );
         client.print("&ram="); client.print( freeRam() );
         client.print("&tiempo="); client.print( millis()/1000/60/60 );

         client.println(" HTTP/1.1");
         client.println("Host: 111.222.333.444"); // La IP del host real
         client.println("Connection: close");
         client.println();

         client.flush();
         client.stop();
      }
   } 


} // End loop




void conectarseAlRouter()
{
   if( !Ethernet.begin(mac) )
   {
      Serial.println("Error de conexion usando DHCP");
      Ethernet.begin(mac, ip);
      
      // Una vez se cuelga da error aqui con cada envio de datos:
      while( !Ethernet.begin(mac) ) 
      {
         Ethernet.begin(mac, ip);
         delay(500);
      }
   }
   delay(1000);
   Serial.println("Conectando");   
}

Por aquí otro con el problema, a ver si nos pueden guiar.

Un saludo :wink:

De momento sigo igual, esta noche a las 5:55 se paro y lo resetee a las 8:36

Con lo que mo estaba currando :confused:

yo suelo hacer un begin unicamente en el setup().

También lo probé así, que es como viene en los ejemplos, pero igualmente deja de funcionar.

He estado leyendo por otros foros y comentan que es, o podría ser, problema de la librería, concretamente la funcion que cierra la conexión que no siempre la cierra correctamente. No pusieron ningún código para probarlo así que por el momento sigo igual.

Saludos.

hola amigo tengo el mismo problema que tu tengo un shield ethernet con un 2560mega y un rc522 y el hp de de vez en cuando se cuelga, yo le actualize el boot loader y el perro guardián para domar el programa que si se colgaba por alguna consulta al servidor se reiniciara esto quedo todo ok, el problema es cuando reinicia aveces no arranca la ethernet bien por un tema de reset que he leído por ahi sobre un condensador y resistencia de 10k

Te recomiendo que leas las Normas del Foro y crees tu propio hilo con el problema. Has una referencia a este problema si te parece para entenderlo mejor.
La última vez que respondieron Sep 01, 2013, 07:53 pm asi que según las normas todo mensaje que tiene mas de 120 días no debería continuarse.

Mientras te comento: agrega a tu sketch una rutina que indique la cantidad de RAM disponible porque creo que por ahi esta tu problema.
Seguramente usas variables String que son grandes consumidoras de RAM.
Revisa en tu compilación cuanta RAM queda disponible.
Intenta usar la opción F("etiqueta") que almacena todo lo que sea posible en la FLASH y no usa RAM.

Intenta por ahi y luego nos cuentas EN TU NUEVO HILO.