No te preocupes, el Arduino hace solo lo que tiene que hacer, no trabaja de más. La página web tiene 3 pestañas: Home/Estado actual del sistema/Gráficos (cada pestaña es un archivo .html. Incluso, para que el navegador no haga peticiones de más, el código CSS, JS y HTML de cada pestaña está incluido en el mismo archivo, no en archivos separados). Cuando el navegador hace una petición de ese archivo, el Arduino recibe la petición y le envia ese archivo (los archivos los tengo guardados dentro de la targeta micro SD. Para agilizar la velocidad de transferencia de los archivos los voy pasando con un buffer de 1K (lo sé, es muy grande, pero de momento voy sobrado de memoria ya que el Mega tiene 8K de SRAM)).
Por otra parte, el Arduino va muestreando las sondas y va almacenando los datos dentro de archivos .csv contenidos en la targeta SD. Cuando el cliente accede a la pestaña Estado actual del sistema, el navegador hace una petición de la información actual del sistema (temperatura actual de cada sonda, fecha y hora en la que se ha tomado, temperatura máxima, mínima, en que hora se han dado, identificador de sonda, alias,… Esta información, por comodidad, se guarda en SRAM, ya que así es muy fácil de brindar al cliente) la cual el Arduino responde con un archivo XML contenido dentro de la respuesta HTTP. El cliente va haciendo peticiones de forma periódica para actualizar los datos que se ven en esta pestaña. También, se puede configurar una resolución y tiempo de muestreo individualizado para cada sonda (estos parámetros, para cada sonda, se guardan en un archivo .txt dentro de la targeta SD).
Si el cliente accede a la pestaña Gráficos, el navegador hace una petición al Arduino solicitándole los datos históricos de temperatura guardados en los archivos .csv. De nuevo, el Arduino monta un archivo XML contenido dentro de la respuesta HTTP con los 100 últimos datos guardados (por defecto). También, el usuario puede seleccionar, para cada sonda, de que fecha/intervalo de fecha quiere que sean los datos a visualizar.
El sistema es flexible, se le pueden ir añadiendo más sondas aún estando encendido, tiene un LED indicador sobre lo que hace el Arduino, un botón para parar/reanudar el muestreo y un largo etcétera xDDD (cuando lo termine del todo, lo voy a colgar al foro).
Volviendo al tema de memoria:
En términos de uso de memoria, no veo diferencia en declarar una variable como global o declararla como static dentro del loop y pasarla como parámetro a las funciones que la utilizan. Gastas la misma memoria.
Acabo de ejecutar el siguiente ejemplo (estaba haciendo pruebas con if’s, for’s…):
#include <MemoryFree.h>
void setup(){
Serial.begin(9600);
for (int count = 0; count < 1; count++) {
Serial.print("freeMemory()=");
Serial.println(freeMemory());
unsigned long a[400] = {0};
Serial.print("freeMemory()=");
Serial.println(freeMemory());
}
Serial.print("freeMemory()=");
Serial.println(freeMemory());
}
void loop(){
Serial.print("freeMemory()=");
Serial.println(freeMemory());
}
Salida:
freeMemory()=7976
freeMemory()=7976
freeMemory()=7976
freeMemory()=7976
freeMemory()=7976
freeMemory()=7976
....
¿Por que cuando entra al loop no se borra el array a?
EDIT: por lo que me han dicho la razón residen en el hecho de que, como esta variable no se usa, el compilador lo detecta y la optimiza y, por tanto, no acaba consumiendo SRAM.