Arduino data logger

Salve,
sono alle prime esperienze con arduino e sto realizzando un data logger per il mio impianto fotovoltaico.
Ho già realizzato una prima release che leggendo i lampeggi del led del contatore attraverso una fotoresistenza mi consente di monitorare la produzione dell'impianto e funziona alla grande..
Adesso volevo aggiungere altri dati come un sensore di temperatura ed uno di irragiammento e qui è nato il problema...

Questo è il codice:

#include <Wire.h>
#include <WProgram.h>
#include <DS1307.h>
#include <Fat16.h>
#include <Fat16util.h>
#include <Stdio.h>


SdCard card;
Fat16 file;
int wattsens =2;
unsigned long t1=millis();
char name[12]={'0','0','0','0','0','0','0','0','0','0','0'};
int ora=0;
int data[7];
int kw=0;

void setup(void) 
{
 Serial.begin(9600);
 pinMode(A0,INPUT);
 digitalWrite(A0,LOW); 
 digitalWrite(wattsens,HIGH);
 if (!card.init());
 // Serial.println("errore init!!");
 if (!Fat16::init(&card));
 // Serial.println("errore init file!!");
}

void loop(void)
{
  if(name[0]=='0' || data[4]!=RTC.get(DS1307_DATE,true))
  {
    RTC.get(data,true);
    sprintf(name,"%d_%d_%d.txt",data[4],data[5],(data[6]-2000));
  }
  while(digitalRead(wattsens));
  unsigned long t2=millis();
  unsigned long interval=t2-t1;
  t1=t2;
  kw=analogRead(A0);
  Serial.println(kw);
  
  file.open(name, O_CREAT | O_APPEND | O_WRITE);
  if(ora != RTC.get(DS1307_HR,true))
  {
    ora=RTC.get(DS1307_HR,false);
    file.print(interval);
    file.print('\t');
    file.print(kw);
    file.print('\t');
    file.print(ora);
    file.print(':');
    file.println(RTC.get(DS1307_MIN,false));
  }
  else
  {
    file.print(interval);
    file.print('\t');
    file.println(kw);    
  }
  file.close();
  while(!digitalRead(wattsens));
  delay(50);
}

Praticamente mi da come valore letto sempre 1023 anche se cortocircuito A0 con ground; premetto che utilizzando un codice più semplice o l'esempio AnalogInSerial I valori letti sono invece quelli che ci si aspetta senza mofdificare in alcun modo l'hardware che evidentemente funziona correttamente... Potrebbe essere un problema di troppa RAM impiegata???Come posso stabilirlo?
Il processore è un Atmega168 su un seeeduino stalker.

ciao sandstorm
Il nome del primo pin analogico non é A0 ma 0.
Se scrivi A0 é una variabile non defiita e perrcui non so che valore Ti da.
Devi cancellare il seguente codice:

pinMode(A0,INPUT);
digitalWrite(A0,LOW);

Per leggere il valore analogico della antrata analogica 0 Ti basta

kw=analogRead(0);

Ciao Uwe

ciao uwe
ho fatto quanto da te suggerito ma purtroppo il problema persiste...

Come già anticipato nel primo post con un codice semplice tipo quello sotto la lettura ADC è esatta nonostante uso A0 e le righe di inizializzazione siano del tutto inutili; le avevo messe solo per certezza che le resistenze di pull-up interne fossero disattivate:

void setup(void) 
{
  Serial.begin(9600);
 pinMode(A0,INPUT);
 digitalWrite(A0,LOW);
}

void loop(void)
{
  int kw=analogRead(A0);
  Serial.println(kw);
  delay(500);
}

Lasciale via quelle righe e definisi con pinMode cosa é wattsens
prendi come esempio il AnalogInSerial degli esempi nel IDE.
Spediscimi il coice modificato non funzionante e spedisci anche lo schema elettrico.
Non usare una fotoresistenza per leggere il lapeggiare del Led del Contatore ma un fototransistore perché la fotoresistenza é lenta nella risposta.
ciao Uwe

Questo è il codice:

#include <Wire.h>
#include <WProgram.h>
#include <DS1307.h>
#include <Fat16.h>
#include <Fat16util.h>
#include <Stdio.h>


SdCard card;
Fat16 file;
int wattsens =2;
unsigned long t1=millis();
char name[12]={'0','0','0','0','0','0','0','0','0','0','0'};
int ora=0;
int data[7];
int kw=0;



void setup(void) 
{
 Serial.begin(9600);
 pinMode(wattsens,INPUT);
 digitalWrite(wattsens,HIGH);
 if (!card.init());
 // Serial.println("errore init!!");
 if (!Fat16::init(&card));
 // Serial.println("errore init file!!");
}

void loop(void)
{
  if(name[0]=='0' || data[4]!=RTC.get(DS1307_DATE,true))
  {
    RTC.get(data,true);
    sprintf(name,"%d_%d_%d.txt",data[4],data[5],(data[6]-2000));
  }
  while(digitalRead(wattsens));
  unsigned long t2=millis();
  unsigned long interval=t2-t1;
  t1=t2;
  kw=analogRead(0);
  Serial.println(kw);
  file.open(name, O_CREAT | O_APPEND | O_WRITE);
  if(ora != RTC.get(DS1307_HR,true))
  {
    ora=RTC.get(DS1307_HR,false);
    file.print(interval);
    file.print('\t');
    file.print(kw);
    file.print('\t');
    file.print(ora);
    file.print(':');
    file.println(RTC.get(DS1307_MIN,false));
  }
  else
  {
    file.print(interval);
    file.print('\t');
    file.println(kw);    
  }
  file.close();
  while(!digitalRead(wattsens));
  delay(50);
}

Riguardo lo schema elettrico è quello del seeduino stalker con l'aggiunta della sola fotoresistenza fra il D2 e la massa. Su A0 ho collegato momentaneamente per provare solo una resistenza da 1K verso massa.
Col codice sopra il valore di kw continua ad essere 1023....
Il problema scompare se commento le seguenti righe relative al primo if:

if(name[0]=='0' || data[4]!=RTC.get(DS1307_DATE,true))
  {
    RTC.get(data,true);
    sprintf(name,"%d_%d_%d.txt",data[4],data[5],(data[6]-2000));
  }

Questo mi fa pensare ad un problema di insufficiente memoria SRAM disponibile....

Risolto!!!
Il bug era nella lunghezza del vettore name che contiene il nome del file, allungandolo di un carattere 13 invece di 12 funnziona tutto!! Probabilmente sprintf sovrascriveva col carattere di terminazione della stringa '\0' chissà cosa in memoria....