RAM Esaurita

Dunque praticamente faccio delle letture di potenza ogni minuto, a partire da questo progetto: Open Energy Monitor
poi mi connetto ad internet tramite Wishield ed invio le letture su un mio sito. Fin quì tutto in ordine, adesso però vorrei inserire i dati di configurazione della connessione in una sd card a caricarli da li!

#include <SD.h> //SD card functions
#include <WiServer.h>
#include "EmonLib.h"             // Include Emon Library
#include <MemoryFree.h>

#define DEBUG 1

// Definizione Parametri Rete Wireless
#define WIRELESS_MODE_INFRA	1  // Infrastrutturata (basata su Access Point)
#define WIRELESS_MODE_ADHOC	2  // Ad-hoc (senza Access Point)

....VARIABILI PER LA CONNESSIONE....

// Richiesta GET
GETrequest sentDataTo (site_ip, 80, "www.riggivale.eu", "/em/api/post?apikey=ba87740e20a5fed755441c429636bbde&json={power:567.89,import:515.53}");
  
// Variabile segna tempo per attendere per nuovi invii di dati
long updateSearch = 0;

const int chipSelect = 4;

EnergyMonitor emon1,emon2;
  
// Inizializzazione Scheda
void setup() {
  // Inizializzo porta seriale
  Serial.begin (9600);

  WiServer.enableVerboseMode (true);
  
  Serial.print("freeMemory()=");
  Serial.println(freeMemory());
  WiServer.init (NULL);
  Serial.print("freeMemory()=");
  Serial.println(freeMemory());

  emon1.current(4, 30);       // Current: input pin, calibration.  
  emon2.current(5, 30);       // Current: input pin, calibration.
}

// Programma Principale
void loop() {
  // Se passato periodo di attesa esecuzione ricerca
  if ( (millis() - updateSearch) >= 60000 ) {
    Serial.print("freeMemory()=");
    Serial.println(freeMemory());
  
    double Correnterms = emon1.calcIrms(1480);  // Calculate Irms
    double Correnterms2 = emon2.calcIrms(1480);  // Calculate Irms
    
    if (!WiServer.connection_up()){ //Se disconnesso tenta nuova connession prima di inviare i dati
       WiServer.init (NULL);
    }
    
    // Calcolo dell'url per l'invio della potenza importata ed esportata
    char percorso[150];
    double p =Correnterms*230.0;
    double p2 =Correnterms2*230.0;
    char tmp[10],tmp2[10];
    dtostrf(p,1,2,tmp);
    dtostrf(p2,1,2,tmp2);
    sprintf(percorso,"/em/api/post?apikey=ba87740e20a5fed755441c429636bbde&json={power:%s,import:%s}",tmp,tmp2);
    Serial.println(percorso);
  
    sentDataTo.URL = percorso;
    // Inizializzazione richiesta GET (parametro indica funzione a cui verra' passata la risposta)
    sentDataTo.setReturnFunc (NULL);
    if (WiServer.connection_up()){ // solo se connesso
      // Invio dei dati
      sentDataTo.submit();
    }  
    Serial.print("freeMemory()=");
    Serial.println(freeMemory());
    // Aggiorno tempo di riavvio (attensa di 1 minuto)
    updateSearch = millis();
  }
  // Avvio WiServer
  WiServer.server_task();
  // Attesa
  delay(10);
}

La semplice inclusione della SD.h si mangia tutta la memoria rimasta e al momento di inviare i dati ne mangia ancora di più e l'arduino si resetta