ok ok
fatto la revisione del codice come consigliato sostituendo int con byte, char buf[] globale, tolto ogni riferimento alla classe String (spero che sprintf non ne faccia parte, altrimenti amen), la funzione è diventata void, messo serial.print ad ogni possibile fallimento di apertura, scrittura, lettura file
di seguito il codice rivisto:
#include <Wire.h> // libreria per lettura su seriale Wire
#include "RTClib.h" // libreria per lettura orologio
#include <SD.h> // libreria per uso SD
#include <DHT22.h> // libreria per sensore temperatura e umidità
#define DHT22_PIN 9 // pin ingresso dati sensore temperatura e umidità
/*
** MOSI - pin 11 // pin usati per SD
** MISO - pin 12 // pin usati per SD
** CLK - pin 13 // pin usati per SD
** CS - pin 10 // pin usati per SD
*/
RTC_DS1307 rtc; //inizializzazione orologio
DHT22 myDHT22(DHT22_PIN); //inizializzazione sensore temperatura/umidità
byte scrittura_ko=8; //led per avvertire mancata scrittura su file
byte luce=A0; // pin analogico per lettura luminosità A0
byte chipSelect = 10; // cs per scrittura SD
bool scritto=false; // flag per scrittura eseguita
bool inizio=false; // faccio iniziare periodo in qualsiasi momento
byte periodo=0; // inizio lettura dati e scrittura su SD
char nomefile[15]; // array nome file
char buf[80]; //array dati da inserire nel file
File myFile; // dichiarazione file
void setup () {
Serial.begin(9600); // inizializzo seriale
delay(2000);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
Serial.print("Initializing SD card...");
pinMode(10, OUTPUT); // pin cs per SD
pinMode(8,OUTPUT); // pin x led mancata scrittura su sd
if (!SD.begin(chipSelect))
{
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized.");
}
void loop () {
DateTime now = rtc.now(); //aggiorno orologio
if (inizio==false && now.second() <30 ){ // aggiorno periodo a qualsiasi ora metto in funzione il programma
periodo=30;
inizio=true;
}
if (inizio==false && now.second() >30 ){ // aggiorno periodo a qualsiasi ora metto in funzione il programma
periodo=0;
inizio=true;
}
if (scritto==false && now.second() == periodo ){ //verifico condizione per scrivere su file
sprintf(nomefile,"%02d%02d.txt",now.year(),now.month()); // creo nome file da anno e mese forniti da orologio
File dataFile = SD.open(nomefile , FILE_WRITE); // apro in scrittura il file nome file creato con sprintf
// if the file is available, write to it: // se non esiste lo crea in automatico
if (dataFile) { // se tutto a posto
dati();
dataFile.println(buf); // aggiungo al file i dati richiamati dalla funzione dati()
dataFile.close(); // chiudo il file
Serial.println("scritto da scrittura file");//scrivo su seriale il nome file
Serial.println(buf); // scrivo su seriale i dati aggiunti
scritto=true; //porto a vero la condizione scritto
//Serial.println(scritto);
}
else {
Serial.print("errore apertura file: " );
Serial.print(nomefile);
Serial.println(" mancata scrittura dati" );
digitalWrite(scrittura_ko, HIGH);
}
}
if (periodo == 0 && scritto==true ){ //condizione per aumentare il periodo di 30 minuti
periodo=30;
scritto=false;
}
if (periodo==30 && scritto==true){ //condizione per aumentare il periodo di 30 minuti
periodo=0;
scritto=false;
}
if (Serial.read()=='a'){ // comando letto su seriale per aprire in lettura il file creato
myFile = SD.open(nomefile);
if (myFile) {
Serial.println();
// read from the file until there's nothing else in it:
while (myFile.available()) { //condizione per leggere tutto il contenuto del file
Serial.write(myFile.read()); // scrivo su monitor seriale il contenuto del file
}
myFile.close(); // chiudo il file
}
else {
Serial.print("errore apertura file: " );
Serial.println(nomefile);
}
}
}
void dati() { // funzione per raccogliere dati da scrivere su file
myDHT22.readData(); //aggiorno dati temperatura e umidità
DateTime now = rtc.now(); // aggiorno orologio
int x = map(analogRead(luce),0,1024,100,0); //aggiorno e scalo valore luminosità
// char buf[60]; // inizializzo array dati da scrivere
sprintf(buf,"%02d/%02d/%02d; %02d:%02d ; %d; %hi.%01hi; %i.%01i",now.year(),now.month(),now.day(),
now.hour(),now.minute(),x,myDHT22.getTemperatureCInt()/10, abs(myDHT22.getTemperatureCInt()%10),
myDHT22.getHumidityInt()/10, myDHT22.getHumidityInt()%10);
// formatto i dati da scrivere e li inserisco in buf (globale)
Serial.println("scritto da funzione");
Serial.println(buf);
}
questo il risultato di serial.print
Initializing SD card...card initialized.
scritto da funzione
2018/07/12; 16:05 ; 59; 24.1; 56.0
scritto da scrittura file
2018/07/12; 16:05 ; 59; 24.1; 56.0
scritto da funzione
2018/07/12; 16:05 ; 59; 24.1; 56.0
scritto da scrittura file
2018/07/12; 16:05 ; 59; 24.1; 56.0
scritto da funzione
2018/07/12; 16:06 ; 59; 24.1; 56.0
scritto da scrittura file
2018/07/12; 16:06 ; 59; 24.1; 56.0
scritto da funzione
2018/07/12; 16:06 ; 58; 24.1; 56.1
scritto da scrittura file
2018/07/12; 16:06 ; 58; 24.1; 56.1
scritto da funzione
2018/07/12; 16:07 ; 54; 24.1; 56.1
scritto da scrittura file
2018/07/12; 16:07 ; 54; 24.1; 56.1
scritto da funzione
2018/07/12; 16:07 ; 56; 24.1; 56.1
scritto da scrittura file
2018/07/12; 16:07 ; 56; 24.1; 56.1
scritto da funzione
2018/07/12; 16:08 ; 58; 24.1; 56.1
scritto da scrittura file
2018/07/12; 16:08 ; 58; 24.1; 56.1
per il momento è tutto