Go Down

Topic: Shield de Ethernet que se cuelga / deja de funcionar al azar (Read 986 times) previous topic - next topic

giltesa

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 :/


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

Code: [Select]

#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");   
}
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.

Arduastur

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

Un saludo  ;)

giltesa

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 :/
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.

Sergegsx


giltesa

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.
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.

Go Up