Hola, tengo un Arduino UNO + EthernetShield + Modulo de 4 Relays + Tiny RTC.
Les comento un poco de que se trata mi proyecto.. Uso la ethernet para un webServer y desde una pagina controlar los relay. Tambien los relay se prenden y apagan segun la hora, es decir, funciona como un timer.
Cuando prendo el arduino, funciona todo perfectamente, pero pasadas unas 10 o 12 horas, este deja de funcionar, y ya no funciona el webServer y los relay no prenden ni apagan a la hora programada. Asique para que vuelva a funcionar tengo que reiniciar la placa.
sin verlo adivino que puede estar ocurriendo. Estas consumiendo toda la RAM del arduino.
Baja la libreria AvailableMemory
Mira el ejemplo e imprime la memoria en uso.
Verás que cuando llegas a esa situación de 10 a 12hs te quedas sin ram.
Una pregunta cuando compilas, el IDE te da datos sobre % de uso de RAM y de FLASH.
Copia y pega esos datos aqui por favor
surbyte, yo en un principio pense lo mismo, que era un problema de la RAM, busque algun codigo que me indique la RAM libre y encontre este justamente en el link que me pasaste:
int freeRam()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Serial.print(" SRAM Libre: "); Serial.println(freeRam());
Al prinicipio, imprimia 300 aprox. asique fui eliminando cosas del codigo, y logre aumentar la ram libre a 750. Al subirlo a 750, note que el sistema funciona mas tiempo (antes funcionaba 4 o 5 horas).
Asique, indudablemente es un problema de ram.. que puedo hacer para solucionarlo? ya que no puedo eliminar nada mas del codigo.
PD. En este momento tengo el arduino en uso. A la noche lo conecto a la pc y te paso los datos que me sale en el IDE al compilar.
Mi primer respuesta no te va a gustar, porque es obvia, cambia a un MEGA por ejemplo.
La alternativa es mirar el código y ver porque ocupa tanto.
Asumo que es un UNO pero no lo sé, es un UNO?
La compilación con el IDE arrojó esto en mi caso
Sketch uses 22.290 bytes (72%) of program storage space. Maximum is 30.720 bytes.
Global variables use 1.228 bytes (59%) of dynamic memory, leaving 820 bytes for local variables. Maximum is 2.048 bytes.
Solo te quedan 820bytes para variables locales.
Ahora que tengo un parámetro veré que puedo mejorar, si algo se puede.
Algo que vi en un programa de alto nivel, es que todo lo que es Web se puede guardar en la flash, liberando bastante memoria.
Veamos si puedo hacerlo.
Si, es un UNO.. y la compilacion me da esos valores que pusiste. No sabia que podia guardar cosas en la flash, ya mismo voy a ver ese link, y te comento como me fue.
vaya que fue rápido. Me alegro por la mejora que lograste!!!
El uso de enviar a flash este tipo de cosas es un recurso que pocos usan. Hay que difundirlo.
Bueno, lo probe algunos dias y sigue todo igual. Ahora funciona un poco mas de tiempo pero sigue pasando lo mismo. Deja de funcionar y no me queda otra que resetear el arduino.
Como resetearlo era la solucion intente lo siguiente, hacer que 3 veces por dia, el arduino se resetee a traves del siguiente codigo:
void Reset()
{
asm volatile (" jmp 0");
}
El arduino se resetea bien, pero no soluciona el problema, deja de funcionar igual.
Ya estoy pensando en sacar el webServer y dejar solo los procedimientos de timers, pero tampoco se si es la solucion.
además de lo que te dice surbyte, sería bueno que imprimas lo que te queda de ram en cada función, lo que deberías ver es que en cada loop, los datos se repitan. En teoría, los datos deberían sobrescribirse con cada comienzo del loop, por lo que en un momento te vas a encontrar con una función que en vez de repetir los datos los estará consumiendo. Ahí ya sería más fácil saber por donde puede ir el problema.
Exacto, lo importate es detectar cuál es la rutina responsable o qué no estas haciendo que consume memoria porque no hay dudas que es eso.
Y una cosa mas, elimina de tu cabeza el uso de un reset como posible solución.
Lo que si deben pensar es en que se ejecuta azarozamente o digamos de vez en cuando, porque esta claro que no es algo que se ejecute con frecuencia porque ya lo hubieras visto.
Mira en tu código y busca las cosas que tienen poca frecuencia a ver si está por ahi el responsable.