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:
#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");
}