problema memorizzazione su SD in uno specifico periodo di tempo

Buongiorno ragazzi,
ho provato di tutto (entro le mie piccole conoscenze) e non sono riuscito a risolvere il mio problema.

Questo è lo sketch completo:

/*
  PIN SD CARD: 10-11-12-13
  PIN LCD: 9-8-6-5-4-3
  PIN POMPA: 2
  PIN VENTOLA: 1
  PIN DHT: 7

  PIN DIGITALI LIBERI: 0


  PIN RTC: A4-A5
  PIN TERRENO ANALOGICO: A3

  PIN ANALOGICI LIBERI: A0-A1-A2
*/

#include <SD.h>
#include <Wire.h>
#include "DHT.h"
#include <HCRTC.h>
#include <LiquidCrystal.h>
#include "RTClib.h"


#define I2CDS1307Add 0x68
#define SD_CS_DIO 10
#define DHTPIN 7
#define DHTTYPE DHT22

int umidita = 0;
int siccita = 0;
int pompa = 2;
int ventola = 1;
int ht = A3;
const int chipSelect = 10;

Sd2Card card;
SdVolume volume;
SdFile root;

HCRTC HCRTC;
File DataFile;

DHT dht(7, DHT22);
LiquidCrystal lcd(9, 8, 6, 5, 4, 3);

void setup() {

pinMode(pompa, OUTPUT);
pinMode(ventola, OUTPUT);
pinMode(ht, INPUT);
pinMode(DHT22, INPUT);
pinMode(10, OUTPUT);

RTC_DS1307 rtc;
RTC_DS1307 RTC;

Serial.begin(9600);
SD.begin();
lcd.begin(8, 2);
dht.begin();
RTC.begin();
Wire.begin();


/*/.......PRESENTAZIONE..........
lcd.setCursor(0, 0);
lcd.print("Prog per");
lcd.setCursor(0, 1);
lcd.print("semenzai");

delay( 2500 );
lcd.clear();

lcd.setCursor(0, 0);
lcd.print("...by...");
lcd.setCursor(1, 1);
lcd.print("gianky");

delay( 2500 );
lcd.clear();
.....FINE PRESENTAZIONE......
*/
analogReference(INTERNAL);
RTC.adjust(DateTime(__DATE__, __TIME__));
//HCRTC.RTCWrite(I2CDS1307Add, 17, 2, 18, 00, 0, 0, 2); impostare una data predefinita
Serial.begin(9600);
pinMode(10, OUTPUT);// change this to 53 on a meg

}

void loop(){
//LETTURE SENSORI
//temperatura e umidità dell'aria
float sommagradi = 0;
float sommaumidita = 0;
float mediagradi = 0;
float mediaumidita = 0;
float hterreno = 0;

float h = dht.readHumidity();//con DHT22 modificare a float
float t = dht.readTemperature();//con DHT22 modificare a float

if (isnan(h) || isnan(t)) {
Serial.println("Errore lettura DHT");
lcd.setCursor(0, 0);
lcd.println("Err lett");
lcd.setCursor(0, 1);
lcd.println("DHT");
delay(2500);
lcd.clear();
return;
}

//calcolo media umidità
for(int i=0;i<=4;i++){
h = dht.readHumidity();
sommaumidita = sommaumidita +h;
delay(2000);
}
mediaumidita = sommaumidita/5;

//calcolo media temperatura
for(int i=0;i<=4;i++){
t = dht.readTemperature();
sommagradi = sommagradi + t;
delay(2000);
}
mediagradi = sommagradi/5;

//lettura e dichiarazioni variabili di sensore umidità terreno
int terreno = A3;
int valterreno = 0;
int sommavalterreno = 0;
float mediavalterreno = 0;

valterreno = analogRead(terreno);
siccita = map (mediavalterreno, 0, 1023, 0, 100);
hterreno = 100-siccita;


if (mediaumidita >= 80 || t > 30) {
digitalWrite(ventola, HIGH);
} else {
digitalWrite(ventola, LOW);
}
if (hterreno <=50) {
digitalWrite(pompa, HIGH);

} else {
digitalWrite(pompa, LOW); 
}



//PRINT LCD   P: POMPA  
//            V: VENTOLA
 
if(pompa==HIGH){
lcd.setCursor(0, 0);
lcd.print("P:ACCESA");
}else{
lcd.setCursor(0, 0);
lcd.print("P:SPENTA");
}

if(ventola==HIGH){
lcd.setCursor(0, 1);
lcd.print("V:ACCESA");
}else{
lcd.setCursor(0, 1);
lcd.print("V:SPENTA");

delay(2000);
lcd.clear();
}

lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.print(mediagradi);
lcd.print("C");

lcd.setCursor(0, 1);
lcd.print("Haria");
lcd.print(mediaumidita);
lcd.print("%");
delay(2000);
lcd.clear();

lcd.setCursor(0, 0);
lcd.print("Hterreno");
lcd.setCursor(0, 1);
lcd.print(hterreno);
lcd.print("%");
lcd.clear();

PRINT SERIAL
Serial.print("Umidita' terreno: ");
Serial.println(hterreno);
delay(1000);
Serial.print("Umidita' aria: ");
Serial.print(mediaumidita);
Serial.println("%");
Serial.print("Temperatura aria: ");
Serial.print(mediagradi);
Serial.println("C");
Serial.println("");


//PRINT SD-CARD
DataFile = SD.open("dati.csv",FILE_WRITE);
HCRTC.RTCRead(I2CDS1307Add);

DataFile = SD.open("dati.csv",FILE_WRITE);
if(DataFile){
if (HCRTC.GetMinute() == 0 || (HCRTC.GetMinute() == 30)){
DataFile.print(HCRTC.GetDateString());
DataFile.print(";");
DataFile.print(HCRTC.GetTimeString());
DataFile.print(";");
DataFile.print(mediagradi);
DataFile.print(";");
DataFile.print(mediaumidita);
DataFile.println(";");
DataFile.close();
}
else{
DataFile.close();
}
}
}

Questo sketch è ambientato in un semenzaio per automatizzarlo e memorizzarne i dati raccolti cosi da fare un grafico giornaliero, settimanale, mensile, annuo.

Ho fatto uno sketch in cui con un dht22 misuro temperatura e umidità, successivamente fa la media di 5 valori e li stampa sull'LCD, infine in base all'umidità e temperatura vengono attivate due ventole e una pompa. ma questo poco importa.

Quando l'RTC da il minuto 0 oppure 30, mi memorizza data, ora e la media in una scheda SD.
quindi:

HCRTC.RTCRead(I2CDS1307Add);
DataFile = SD.open("dati.csv",FILE_WRITE);
if(DataFile){
if (HCRTC.GetMinute() == 0 || (HCRTC.GetMinute() == 30)){
DataFile.print(HCRTC.GetDateString());
DataFile.print(HCRTC.GetTimeString());
DataFile.print(";");
DataFile.print(mediagradi);
DataFile.print(";");
DataFile.print(mediaumidita);
DataFile.println(";");
DataFile.close();
Serial.println("Memory");
Serial.println();
}
else{
DataFile.close();
Serial.println();
}
}

Ho utilizzato la libreria HCRTC perchè molto intuitiva.

andiamo al problema:
il loop dura 27s quindi quando l'orologio sarà al minuto 0 oppure 30, riesce a memorizzare due dati in un minuto...perché semplicemente in un minuto riesce a fare due loop. E non va bene. Allora ho pensato di "risolvere" aggiungendo delle pause, ma prima o poi, ci sarà un minuto in cui riuscirà a fare due loop...ho pensato di poter fare un interrupt ma non ci ho capito molto (su come applicarlo)...

Ci sarebbero poi altri problemi di "grafica" con excel ma quello poi lo affrontiamo magari più avanti..

Vorrei ringraziarvi, il karma lo metterò a chi risponde :smiley:

Prima cosa che secondo me non ha molto senso.
Apri il file, e se eventualmente sei al minuto voluto, ci scrivi dentro.
Che senso ha?

Invece per me più corretto: verifichi il minuto, se quello voluto, solo dentro l'if apri il file, ci scrivi e lo chiudi.

Per il minuto. Scusa ma se tu verifichi il minuto, mica è detto che ci passi una volta sola. Anzi.
Se la loop() supponiamo dura 20 sec, l'RTC trova il minuto 30 anche fino a 3 volte. 12:30:00 12:30:20 12:30:40
Perchè non te ne freghi e scarichi il dato tante volte nel file per tutta la durata di uno/due minuti ?
if (HCRTC.GetMinute() >= 0 && (HCRTC.GetMinute() <= 1)){

nid69ita:
Prima cosa che secondo me non ha molto senso.
Apri il file, e se eventualmente sei al minuto voluto, ci scrivi dentro.
Che senso ha?

Invece per me più corretto: verifichi il minuto, se quello voluto, solo dentro l'if apri il file, ci scrivi e lo chiudi.

Per il minuto. Scusa ma se tu verifichi il minuto, mica è detto che ci passi una volta sola. Anzi.
Se la loop() supponiamo dura 20 sec, l'RTC trova il minuto 30 anche fino a 3 volte. 12:30:00 12:30:20 12:30:40
Perchè non te ne freghi e scarichi il dato tante volte nel file per tutta la durata di uno/due minuti ?
if (HCRTC.GetMinute() >= 0 && (HCRTC.GetMinute() <= 1)){

Hai ragione, per una cosa e un altra lo volevo mettere dentro l'if l'apertura del file e poi mi sono dimenticato... per il discorso del minuto:
Quando io vado a inserire troppi dati sul file csv che poi andrà aperto con excel, il risultato sara questo:

Cioè non si capisce nulla nell'asse dell'ascisse, cioe del ora e della data. Troppi dati vicini...potrei magari risolvere raggruppandoli, è possibile su excel? Anche perchè poi cosi è impossibile fare un report giornaliero...figuriamoci uno mensile..Grazie ancora!

Non sono esperto di Excel.
Penso si potrebbe fare la media dei valori in stesso minutaggio così da non avere quell'ammasso di dati
Forse si chiamano tabelle pivot. Ma non le conosco.

Altra idea, in arduino. Creare una variabile "semaforo" che permetta di sapere se quel minuto lo hai già scritto in file.

if ( (HCRTC.GetMinute() >= 0 && HCRTC.GetMinute() <= 1) && semaforo==0)
{ semaforo=1;
... salva su file
}
else
{ semaforo=0;
}

ciao Nid69ita,
io dovrei riuscire a stampare qualcosa del genere:

18/02/17;00:00:41;20.30;71.24;
;00:30:00;20.30;71.20;
;02:00:00;20.30;71.20;
;02:30:00;20.30;71.20;
;03:00:00;20.30;71.20;

Etc... (dei secondi non me ne frega nulla). Quindi 1 volta al giorno (a mezzanotte) mi stampa la data (insieme al resto) e poi dopo ogni mezz'ora:

data;ora;Temp;Umidità
;03:00:00;20.30;71.20;

Il ";" senza nessun dato accanto significa in formato csv su excel che la casella della data è vuota...eviteremo cosi un gran numero di date inutili, ma solo una al giorno..l'essenziale.

Ora, per fare questo mi sono sbattuto la testa per ore senza arrivare a una conclusione...sono riuscito a fare questo:

 HCRTC.RTCRead(I2CDS1307Add);
  if (DataFile) {
    if (HCRTC.GetHour() == 0 && (HCRTC.GetMinute() == 0) && semaforo == 0) {
      semaforo = 1;
      DataFile = SD.open("prova.txt", FILE_WRITE);
      DataFile.print(HCRTC.GetDateString());
      DataFile.print(";");
      DataFile.close();
    }
    else {
      semaforo = 0;
      DataFile.close();
    }
    
HCRTC.RTCRead(I2CDS1307Add); 
    if (DataFile) {
      if (HCRTC.GetMinute() == 0 && semaforo2 == 0) {
        semaforo2 = 1;
       
        DataFile.print(HCRTC.GetTimeString());
        DataFile.print(";");
        DataFile.print(mediagradi);
        DataFile.print(";");
        DataFile.print(mediaumidita);
        DataFile.println(";");
        DataFile.close();
      }
    }
    else {
      semaforo = 0;
      DataFile.close();
    }

    
HCRTC.RTCRead(I2CDS1307Add);
DataFile = SD.open("prova.txt", FILE_WRITE);
    if (DataFile) {
      if (HCRTC.GetMinute() == 30 && semaforo3 == 0) {
        semaforo3 = 1;
        
        DataFile.print(";");
        DataFile.print(HCRTC.GetTimeString());
        DataFile.print(";");
        DataFile.print(mediagradi);
        DataFile.print(";");
        DataFile.print(mediaumidita);
        DataFile.println(";");
        DataFile.close();
      }
      else {
        semaforo3 = 0;
        DataFile.close();
      }

Cosi facendo, mi stampa sempre il doppio in data....ma come faccio?? Grazie!

Gianky00:
Cosi facendo, mi stampa sempre il doppio in data....ma come faccio?? Grazie!

Non ho capito. Hai 2 volte la stessa data ?

No, è come se la tua implementazione non funzionasse...il che mi sembra strano pure a me..cioe continua ad entrare negli if e salvare anche quando è gia entrato in quel minuto

E così ?

HCRTC.RTCRead(I2CDS1307Add);
if ( semaforo==0 && HCRTC.GetHour() == 0 && HCRTC.GetMinute() == 0) 
{ DataFile = SD.open("dati.csv",FILE_WRITE);
  if(DataFile)
  { semaforo = 1;
    DataFile.print(HCRTC.GetDateString());
    DataFile.print(";");
    DataFile.print(HCRTC.GetTimeString());
    DataFile.println(";");
    DataFile.close();
  }
}
else
{ semaforo=0;
}

ok nid69ita, scusami se rispondo adesso.
Ho preso il tuo sketch e mi crea due file, un dati.csv (sul quale non scrive nulla) e l'altro prova.txt dove scrive per due volte la data..quindi ad ogni loop...
tutto normale se non fosse che arduino non capisca che una volta memorizzato in quel minuto deve uscire..eppure ci deve essere un modo!

EDIT: nel file .txt c'è scritto:

18/02/17;18/02/17;

oops, copia e incolla. editato sopra. :slight_smile:

Per capire meglio quel che succede ho aggiunto nel file ANCHE l'ora/min/sec

hey nid, grazie intanto per avermi risposto. Purtroppo non funziona, capisco cosa gli vuoi dire ad arduino e sinceramente non capisco nemmeno io perché non lo svolga...questo è quello scritto aprendo il file con un blocco note:

18/02/17;00:00:27;
18/02/17;00:00:54;
]

Si vede che in un minuto (quello della mezzanotte) è riuscito a fare due loop ed entrarci...quando dichiaro la variabile semaforo faccio cosi:

int semaforo;

dovrebbe essere giusto..

Parrebbe di si. Per provare, stampa dentro al file anche semaforo. Voglio proprio vedere se ci butta 2 volte 1 o 0,1

ciao nid, scusami se rispondo adesso..ho avuto molto da fare. Allora, lo sketch mi stampa questo su scheda SD:

18/02/17;00:00:27;
semaforo=1

18/02/17;00:00:54;
semaforo=1

questo è l'intero sketch:

/*
  PIN SD CARD: 10-11-12-13
  PIN LCD: 9-8-6-5-4-3
  PIN POMPA: 2
  PIN VENTOLA: 1
  PIN DHT: 7

  PIN DIGITALI LIBERI: 0


  PIN RTC: A4-A5
  PIN TERRENO ANALOGICO: A3

  PIN ANALOGICI LIBERI: A0-A1-A2
*/

#include <SD.h>
#include <Wire.h>
#include "DHT.h"
#include <HCRTC.h>
#include <LiquidCrystal.h>
#include "RTClib.h"


#define I2CDS1307Add 0x68
#define SD_CS_DIO 10
#define DHTPIN 7
#define DHTTYPE DHT22

int umidita = 0;
int siccita = 0;
int pompa = 2;
int ventola = 1;
int ht = A3;
const int chipSelect = 10;

Sd2Card card;
SdVolume volume;
SdFile root;

HCRTC HCRTC;
File DataFile;

DHT dht(7, DHT22);
LiquidCrystal lcd(9, 8, 6, 5, 4, 3);

void setup() {

pinMode(pompa, OUTPUT);
pinMode(ventola, OUTPUT);
pinMode(ht, INPUT);
pinMode(DHT22, INPUT);
pinMode(10, OUTPUT);

RTC_DS1307 rtc;
RTC_DS1307 RTC;

Serial.begin(9600);
SD.begin();
lcd.begin(8, 2);
dht.begin();
RTC.begin();
Wire.begin();


/*/.......PRESENTAZIONE..........
lcd.setCursor(0, 0);
lcd.print("Prog per");
lcd.setCursor(0, 1);
lcd.print("semenzai");

delay( 2500 );
lcd.clear();

lcd.setCursor(0, 0);
lcd.print("...by...");
lcd.setCursor(1, 1);
lcd.print("gianky");

delay( 2500 );
lcd.clear();
.....FINE PRESENTAZIONE......
*/
analogReference(INTERNAL);
//RTC.adjust(DateTime(__DATE__, __TIME__));
HCRTC.RTCWrite(I2CDS1307Add, 17, 2, 18, 00, 0, 0, 2); //impostare una data predefinita
Serial.begin(9600);
pinMode(10, OUTPUT);// change this to 53 on a meg

}

void loop(){
  HCRTC.RTCRead(I2CDS1307Add);
  Serial.print(HCRTC.GetTimeString());
//LETTURE SENSORI
//temperatura e umidità dell'aria
float sommagradi = 0;
float sommaumidita = 0;
float mediagradi = 0;
float mediaumidita = 0;
float hterreno = 0;

float h = dht.readHumidity();//con DHT22 modificare a float
float t = dht.readTemperature();//con DHT22 modificare a float

if (isnan(h) || isnan(t)) {
Serial.println("Errore lettura DHT");
lcd.setCursor(0, 0);
lcd.println("Err lett");
lcd.setCursor(0, 1);
lcd.println("DHT");
delay(2500);
lcd.clear();
return;
}

//calcolo media umidità
for(int i=0;i<=4;i++){
h = dht.readHumidity();
sommaumidita = sommaumidita +h;
delay(2000);
}
mediaumidita = sommaumidita/5;

//calcolo media temperatura
for(int i=0;i<=4;i++){
t = dht.readTemperature();
sommagradi = sommagradi + t;
delay(2000);
}
mediagradi = sommagradi/5;

//lettura e dichiarazioni variabili di sensore umidità terreno
int terreno = A3;
int valterreno = 0;
int sommavalterreno = 0;
float mediavalterreno = 0;

valterreno = analogRead(terreno);
siccita = map (mediavalterreno, 0, 1023, 0, 100);
hterreno = 100-siccita;


if (mediaumidita >= 80 || t > 30) {
digitalWrite(ventola, HIGH);
} else {
digitalWrite(ventola, LOW);
}
if (hterreno <=50) {
digitalWrite(pompa, HIGH);

} else {
digitalWrite(pompa, LOW); 
}



//PRINT LCD   P: POMPA  
//            V: VENTOLA
 
if(pompa==HIGH){
lcd.setCursor(0, 0);
lcd.print("P:ACCESA");
}else{
lcd.setCursor(0, 0);
lcd.print("P:SPENTA");
}

if(ventola==HIGH){
lcd.setCursor(0, 1);
lcd.print("V:ACCESA");
}else{
lcd.setCursor(0, 1);
lcd.print("V:SPENTA");

delay(2000);
lcd.clear();
}

lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.print(mediagradi);
lcd.print("C");

lcd.setCursor(0, 1);
lcd.print("Haria");
lcd.print(mediaumidita);
lcd.print("%");
delay(2000);
lcd.clear();

lcd.setCursor(0, 0);
lcd.print("Hterreno");
lcd.setCursor(0, 1);
lcd.print(hterreno);
lcd.print("%");
delay(2000);
lcd.clear();

//PRINT SERIAL
Serial.print("Umidita' terreno: ");
Serial.println(hterreno);
Serial.print("Umidita' aria: ");
Serial.print(mediaumidita);
Serial.println("%");
Serial.print("Temperatura aria: ");
Serial.print(mediagradi);
Serial.println("C");
Serial.println("");


//PRINT SD-CARD
int semaforo;
HCRTC.RTCRead(I2CDS1307Add);
if(semaforo==0 && HCRTC.GetHour() == 0 && HCRTC.GetMinute() == 0) 
{ DataFile = SD.open("dati.csv",FILE_WRITE);
if(DataFile)
{semaforo = 1;
DataFile.print(HCRTC.GetDateString());
DataFile.print(";");
DataFile.print(HCRTC.GetTimeString());
DataFile.println(";");
DataFile.print("semaforo=");
DataFile.println(semaforo);
DataFile.println("");
DataFile.close();
}
}
else
{ semaforo=0;
DataFile=SD.open("dati.csv");
DataFile.println("");
DataFile.print("semaforo=");
DataFile.println(semaforo);
DataFile.close();
}
}

grazie :smiley:

int semaforo;
DEVE essere una variabile globale

P.S. nell'editor usa CTRL+T che ti indenta il codice in automatico e facilita la lettura

Perfetto!!
adesso mi stampa:

18/02/17;00:00:27;
semaforo=1

quindi funziona...ora dovrei far scrivere la data ad ogni mezzanotte e poi la rilevazione dell'ora, tempo e umidità ogni 15 minuti...avevo intenzione di procedere cosi:

  HCRTC.RTCRead(I2CDS1307Add);
  if (semaforo == 0 && HCRTC.GetHour() == 0 && HCRTC.GetMinute() == 0)
  { DataFile = SD.open("dati5.csv", FILE_WRITE);
    if (DataFile)
    { semaforo = 1;
      DataFile.print(HCRTC.GetDateString());
      DataFile.print(";");
      DataFile.print(HCRTC.GetTimeString());
      DataFile.print(";");
      DataFile.print(mediagradi);
      DataFile.print(";");
      DataFile.print(mediaumidita);
      DataFile.println(";");
      DataFile.close();
    }
  }
  else
  { semaforo = 0;
  }
  HCRTC.RTCRead(I2CDS1307Add);
    if (semaforo2 == 0 && (HCRTC.GetMinute() == 1 || HCRTC.GetMinute() == 15|| HCRTC.GetMinute() == 30|| HCRTC.GetMinute() == 45))
  { DataFile = SD.open("dati5.csv", FILE_WRITE);
    if (DataFile)
    { semaforo2 = 1;
      DataFile.print(";");
      DataFile.print(HCRTC.GetTimeString());
      DataFile.print(";");
      DataFile.print(mediagradi);
      DataFile.print(";");
      DataFile.print(mediaumidita);
      DataFile.println(";");
      DataFile.close();
    }
     else
  { semaforo2 = 0;
  }
  }

però mi stampa questo:

18/02/17;00:00:27;19.06;73.48;
;00:01:21;19.20;73.28;

quindi funziona in un primo momento, poi però semaforo non si azzera e quindi non ripete mai più il loop..

Confronta il secondo if con il primo, sono diversi. Devi vedere BENE dove chiudi le graffe. Usa CTRL+T nell'IDE

ciao nid69ita,
scusami se rispondo adesso ma ho avuto un po da fare..allora ho risolto il problema insieme ad altri di minore importanza..ho sostituito il delay con il millis e ovviamente adesso ho un problema.
Il tuo sketch con semaforo funziona che al primo loop stampa..al secondo no, al terzo loop ristampa ecc...
Utilizzando millis ho migliaia di loop in un secondo. Il sistema del semaforo non può funzionare..potrei fare un contatore dove quando è zero stampa su SD, un numero diverso da zero non stampi nulla..e che si resetti ogni volta c'è il tempo:

0':00'' - 15':00'' - 30':00'' - 45':00''

ma non saprei da dove inziare.. :frowning: :confused:

Posta lo sketch attuale.

Ciao nid, scusami se non l'ho fatto prima. Questo è tutto lo sketch:

/*
    PIN SD CARD: 10-11-12-13
    PIN POMPA: 2
    PIN VENTOLA: 1
    PIN DHT: 7

    PIN DIGITALI LIBERI: 6


    PIN RTC: A4-A5
    PIN TERRENO ANALOGICO: A3

    PIN ANALOGICI LIBERI: A0-A1-A2
*/

#include <SD.h>
#include <Wire.h>
#include "DHT.h"
#include <HCRTC.h>
#include "RTClib.h"


#define I2CDS1307Add 0x68
#define SD_CS_DIO 10
#define DHTPIN 7
#define DHTTYPE DHT22

DHT dht(7, DHT22);

int umidita = 0;
int siccita = 0;
int pompa = 2;
int ventola = 1;
int ht = A3;
int semaforo;
int semaforo2;
int LDR = A0;
int valoreLDR = 0;

const int chipSelect = 10;

unsigned long tempoPrecedente = 0;
unsigned long intervallo = 2000;

HCRTC HCRTC;
File DataFile;



void setup() {

  pinMode(pompa, OUTPUT);
  pinMode(ventola, OUTPUT);
  pinMode(ht, INPUT);
  pinMode(DHT22, INPUT);
  pinMode(10, OUTPUT);
  pinMode( LDR, INPUT);

  RTC_DS1307 rtc;
  RTC_DS1307 RTC;

  Serial.begin(9600);
  SD.begin();
  dht.begin();
  RTC.begin();
  Wire.begin();


  /*/.......PRESENTAZIONE..........
    lcd.setCursor(0, 0);
    lcd.print("Prog per");
    lcd.setCursor(0, 1);
    lcd.print("semenzai");

    delay( 2500 );
    lcd.clear();

    lcd.setCursor(0, 0);
    lcd.print("...by...");
    lcd.setCursor(1, 1);
    lcd.print("gianky");

    delay( 2500 );
    lcd.clear();
    .....FINE PRESENTAZIONE......
  */
  analogReference(INTERNAL);
  //RTC.adjust(DateTime(__DATE__, __TIME__));
  HCRTC.RTCWrite(I2CDS1307Add, 17, 2, 27, 00, 0, 0, 1); //impostare una data predefinita
  pinMode(10, OUTPUT);// change this to 53 on a meg

}

void loop() {

  //LETTURE SENSORI
  //temperatura e umidità dell'aria

  float h = dht.readHumidity();
  float t = dht.readTemperature();
  unsigned long tempoAttuale = millis();
  if (isnan(h) || isnan(t)) {
    Serial.println("Errore lettura DHT");
    return;
  }

  //lettura e dichiarazioni variabili di sensore umidità terreno
  int terreno = A3;
  int hterreno;
  int valterreno = 0;
  int sommavalterreno = 0;
  float mediavalterreno = 0;

  valterreno = analogRead(terreno);
  siccita = map (mediavalterreno, 0, 1023, 0, 100);
  hterreno = 100 - siccita;


  if (h >= 80 || t > 30) {
    digitalWrite(ventola, HIGH);
  } else {
    digitalWrite(ventola, LOW);
  }
  if (hterreno <= 50) {
    digitalWrite(pompa, HIGH);

  } else {
    digitalWrite(pompa, LOW);
  }


  //PRINT SERIAL

  if (tempoAttuale - tempoPrecedente >= intervallo) {
    tempoPrecedente = tempoAttuale;
    t = dht.readTemperature();
    h = dht.readHumidity();
    Serial.print("Temperatura:");
    Serial.println(t);
    Serial.print("Umidita':");
    Serial.println(h);

    valoreLDR = analogRead(LDR);
    Serial.print("valore LDR = ");
    Serial.println(valoreLDR);
    Serial.println("");
  }


  //ATTIVAZIONE POMPA

  if (valoreLDR > 200) {
    HCRTC.RTCRead(I2CDS1307Add);
    if (HCRTC.GetMinute() == 0 && HCRTC.GetSecond() <= 20) {
      digitalWrite(pompa, HIGH);
    }
    if (HCRTC.GetMinute() == 30 && HCRTC.GetSecond() <= 20) {
      digitalWrite(pompa, HIGH);

    }
  }
  else {
    digitalWrite(pompa, LOW);
  }
  //PRINT SD-CARD
  //giornaliero
  HCRTC.RTCRead(I2CDS1307Add);
  if (semaforo == 0 && (HCRTC.GetHour() == 0 && HCRTC.GetMinute() == 0))
  { DataFile = SD.open("giorno.csv", FILE_WRITE);
    if (DataFile)
    { semaforo = 1;
      if  (HCRTC.GetHour() < 10 && HCRTC.GetMinute() >= 10) {
        DataFile.print(HCRTC.GetDateString());
        DataFile.print(";");
        DataFile.print("0");
        DataFile.print(HCRTC.GetHour());
        DataFile.print(":");
        DataFile.print(HCRTC.GetMinute());
        DataFile.print(";");
        DataFile.print(t);
        DataFile.print(";");
        DataFile.print(h);
        DataFile.println(";");
        DataFile.close();
      }

      if  (HCRTC.GetMinute() < 10 && HCRTC.GetHour() >= 10) {
        DataFile.print(HCRTC.GetDateString());
        DataFile.print(";");
        DataFile.print(HCRTC.GetHour());
        DataFile.print(":");
        DataFile.print("0");
        DataFile.print(HCRTC.GetMinute());
        DataFile.print(";");
        DataFile.print(t);
        DataFile.print(";");
        DataFile.print(h);
        DataFile.println(";");
        DataFile.close();
      }

      if  (HCRTC.GetMinute() < 10 && HCRTC.GetHour() < 10) {
        DataFile.print(HCRTC.GetDateString());
        DataFile.print(";");
        DataFile.print("0");
        DataFile.print(HCRTC.GetHour());
        DataFile.print(":");
        DataFile.print("0");
        DataFile.print(HCRTC.GetMinute());
        DataFile.print(";");
        DataFile.print(t);
        DataFile.print(";");
        DataFile.print(h);
        DataFile.println(";");
        DataFile.close();
      }

      if  (HCRTC.GetHour() >= 10 && HCRTC.GetMinute() >= 10) {
        DataFile.print(HCRTC.GetDateString());
        DataFile.print(";");
        DataFile.print(HCRTC.GetHour());
        DataFile.print(":");
        DataFile.print(HCRTC.GetMinute());
        DataFile.print(";");
        DataFile.print(t);
        DataFile.print(";");
        DataFile.print(h);
        DataFile.println(";");
        DataFile.close();
      }
    }
  }
  else
  { semaforo = 0;
  }

  HCRTC.RTCRead(I2CDS1307Add);
  if (semaforo2 == 0 && (HCRTC.GetMinute() == 1 || HCRTC.GetMinute() == 15 || HCRTC.GetMinute() == 30 || HCRTC.GetMinute() == 45)) {
    DataFile = SD.open("giorno.csv", FILE_WRITE);
    if (DataFile) {
      semaforo2 = 1;
      if  (HCRTC.GetHour() < 10 && HCRTC.GetMinute() >= 10) {
        DataFile.print(";");
        DataFile.print("0");
        DataFile.print(HCRTC.GetHour());
        DataFile.print(":");
        DataFile.print(HCRTC.GetMinute());
        DataFile.print(";");
        DataFile.print(t);
        DataFile.print(";");
        DataFile.print(h);
        DataFile.println(";");
        DataFile.close();
      }

      if  (HCRTC.GetMinute() < 10 && HCRTC.GetHour() >= 10) {
        DataFile.print(";");
        DataFile.print(HCRTC.GetHour());
        DataFile.print(":");
        DataFile.print("0");
        DataFile.print(HCRTC.GetMinute());
        DataFile.print(";");
        DataFile.print(t);
        DataFile.print(";");
        DataFile.print(h);
        DataFile.println(";");
        DataFile.close();
      }

      if  (HCRTC.GetHour() < 10 && HCRTC.GetMinute() < 10) {
        DataFile.print(";");
        DataFile.print("0");
        DataFile.print(HCRTC.GetHour());
        DataFile.print(":");
        DataFile.print("0");
        DataFile.print(HCRTC.GetMinute());
        DataFile.print(";");
        DataFile.print(t);
        DataFile.print(";");
        DataFile.print(h);
        DataFile.println(";");
        DataFile.close();
      }

      if  (HCRTC.GetMinute() >= 10 && HCRTC.GetHour() >= 10) {
        DataFile.print(";");
        DataFile.print(HCRTC.GetHour());
        DataFile.print(":");
        DataFile.print(HCRTC.GetMinute());
        DataFile.print(";");
        DataFile.print(t);
        DataFile.print(";");
        DataFile.print(h);
        DataFile.println(";");
        DataFile.close();
      }
    }

  }
  else
  { semaforo2 = 0;
  }
}

Ho fatto delle if tra i minuti e ore perché quando utilizzavo il comando HCRTC.GetHour oppure HCRTC.GetMinute ed erano le due di notte e un minuto, mi stampava: 2:1...quindi ho risolto con delle if e mettere prima degli zeri cosi da stamparmi: 02:01 che è piu accettabile. Poi non ho usato il comando HCRTC.GetTimeString perché mi dava pure i secondi e a me non interessano

Elimina un pò di righe vuote, 1 va bene, quando ci sono più righe vuote, o si mette un commento oppure non si stà scrivendo il temino a scuola e più è lungo e meglio è.

Poi, dove scrivi su file, io lo vedo DUE volte, una con gli 0 come dici davanti a 02:10 esempio ma anche la versione senza gli 0.

Quando stampi dentro al file, metti in comune creando una funzione void che utilizzerai ovunque serve. E in quella funzione mette lo zero se serve. La scrivi al fondo di tutto il programma.

void ScriviFile(float t,float h)
{ DataFile.print(HCRTC.GetDateString());
  DataFile.print(";");
  if(HCRTC.GetHour()<10) DataFile.print("0");
  DataFile.print(HCRTC.GetHour());
  DataFile.print(":");
  if(HCRTC.GetMinute()<10) DataFile.print("0");
  DataFile.print(HCRTC.GetMinute());
  DataFile.print(";");
  DataFile.print(t);
  DataFile.print(";");
  DataFile.print(h);
  DataFile.println(";");
  DataFile.close();
}

Nel codice userai poi la chiamata a questa funzione:

if  (HCRTC.GetMinute() >= 10 && HCRTC.GetHour() >= 10) [/color]
{  ScriviFile(t,h);
}

Altro consiglio, le graffe di apertura mettile a inizio su riga successiva come ho fatto io qui

Altro consiglio, tutte le variabili dichiarale globali, all'inizio, per semplificare il codice.
E un nome più adeguato ad alcune variabili, esempio "terreno". Meglio all'inizio globale e con scritto Pin per capire a cosa serve. basta poi un byte (accetta valori 0-255) Anche semaforo e semaforo2 basta byte.
byte terrenoPin = A3;