Come controllare la presenza di SD card su modulo SD

Salve a tutti, sto lavorando ad una serra che si autogestisce ed ho solo un unico piccolo problema, ho preparato tutti i dati da mettere in SD ma vorrei che attraverso l'accensione di due led mi indica la presenza o meno della SD, ho provato controllando la presenza del file

  File dataFile = SD.open("serra.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    digitalWrite (40, HIGH);
    digitalWrite(41, LOW);
    dataFile.print("temperatura");
    dataFile.println(dataStringT);
    dataFile.print("umidita");
    dataFile.println(dataStringH);
    dataFile.close();
  }
}else if(((now.hour() == 8) && (now.minute() >= 01)) && (now.second() <= 6)){
      dataFile.close();
}else {

 digitalWrite (41, HIGH);
 digitalWrite(40, LOW);
}

delay(50);

Facendo così al primo avvio se ho la card montata il led della card montata si accende ma se durante l'esecuzione del loop tolgo la card il led non cambia viversa se faccio il primo avvio senza card il led che la card non c'è si accende ma poi durante il loop se la tolgo lo stato dei led non cambia.
Magari sarà una cavolata ma non riesco a venire fuori, ringrazio fin da subito chi mi aiuta

Questo è il modulo SD

E la mia scheda è un mega 2560

Forse non ho capito io. Non sei su un PC con S.O., quei moduli non sono pensati per estrarre la SD quando vuoi.
Perchè la estrai ?

qualcosa non torna con le graffe... dopo il primo if chiudi 2 graffe prima dell'else... c'è altro codice prima?
se c'è metti il codice completo, altrimenti correggi le graffe e vedi cosa succede.

Di solito gli zoccolini per le SD e microSD hanno un'apposito contatto che rileva se la scheda e' inserita o meno ... nel tuo non e' connessa ai pin ? ... hai guardato se magari i contatti sono accessibli comunque ?

Ciao a tutti e grazie per le risposte, allora il codice che ho postato fa parte di un codice molto più grande io vi ho messo solo il pezzo però ora ve lo metto un po' più completo

if (SD.exists("serra.txt")){
  
  digitalWrite(41, HIGH);
  digitalWrite(40, LOW);
 
if((((now.hour() == 08) && (now.minute() >= 01)) && (now.second() >= 00)) && (now.second() <= 03)){
  
String dataStringT = "";

char buffer3[10];  
String stringT = dtostrf(t,6,2,buffer3);  
dataStringT = stringT;

String dataStringH = "";

char buffer4[10];  
String stringH = dtostrf(h,6,2,buffer4);  
dataStringH = stringH;

String dataStringTR = "";

char buffer5[10];  
String stringTR = dtostrf(HumTerr1,6,2,buffer5);  
dataStringTR = stringTR;

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.

File dataFile = SD.open("serra.txt", FILE_WRITE);

    dataFile.print("temperatura");
    dataFile.println(dataStringT);
    dataFile.print("umidita");
    dataFile.println(dataStringH);
    dataFile.print("umidita terreno ");
    dataFile.println(dataStringTR);
    dataFile.print(now.day());
    dataFile.print("-");
    dataFile.print(now.month());
    dataFile.print("-");
    dataFile.print(now.year());
    dataFile.println("*******");
    dataFile.close();
    //Serial.println(dataStringT);
    //Serial.println(dataStringH);
    //Serial.println(dataStringTR);
}

if((((now.hour() == 20) && (now.minute() >= 01)) && (now.second() >= 00)) && (now.second() <= 03)){
  
String dataStringT = "";

char buffer3[10];  
String stringT = dtostrf(t,6,2,buffer3);  
dataStringT = stringT;

String dataStringH = "";

char buffer4[10];  
String stringH = dtostrf(h,6,2,buffer4);  
dataStringH = stringH;

String dataStringTR = "";

char buffer5[10];  
String stringTR = dtostrf(HumTerr1,6,2,buffer5);  
dataStringTR = stringTR;

File dataFile = SD.open("serra.txt", FILE_WRITE);
  
    dataFile.print("temperatura");
    dataFile.println(dataStringT);
    dataFile.print("umidita");
    dataFile.println(dataStringH);
    dataFile.print("umidita terreno");
    dataFile.println(dataStringTR );
    dataFile.print(now.day());
    dataFile.print("-");
    dataFile.print(now.month());
    dataFile.print("-");
    dataFile.print(now.year());
    dataFile.println("*******");
    //Serial.println(dataStringT);
    //Serial.println(dataStringH);
    //Serial.println(dataStringTR);
    dataFile.close();
  }
 
}else{
      digitalWrite(40, HIGH);// scrittura SD non eseguita
      digitalWrite(41, LOW);// scrittura SD non eseguita
}

delay(50);

questo è il codice completo se avete anche soluzioni migliori per semplificare il codice vi ringrazio.
ho fatto un'altra prova con questa istruzioneif (SD.exists("serra.txt")) ma mi da comunque lo stesso problema

I zoccolo Sd hanno 2 interuttori: Presenza SD e attivo protezione di scrittura.
Vedi se la Tua scheda li usa.
Ciao Uwe

Ciao Uwe, purtroppo non vedo niente di quello che mi hai descritto te, sono delle scritte oppure sono dei tipo pin?

Ragazzi mi dispiace avervi fatto perdere tempo ma ho risolto, posto il pezzo di sketch

if (!card.init(SPI_HALF_SPEED, 53)){
  
  digitalWrite(41, LOW);
  digitalWrite(40,HIGH);// SD non presente

}else{
    
     digitalWrite(40, LOW);
     digitalWrite(41, HIGH);// SD presente
 
if((((now.hour() == 8) && (now.minute() >= 01)) && (now.second() >= 00)) && (now.second() <= 03)){
  
String dataStringT = "";

char buffer3[10];  
String stringT = dtostrf(t,6,2,buffer3);  
dataStringT = stringT;

String dataStringH = "";

char buffer4[10];  
String stringH = dtostrf(h,6,2,buffer4);  
dataStringH = stringH;

String dataStringTR = "";

char buffer5[10];  
String stringTR = dtostrf(HumTerr1,6,2,buffer5);  
dataStringTR = stringTR;

File dataFile = SD.open("SERRA.txt", FILE_WRITE);

    dataFile.print("temperatura");
    dataFile.println(dataStringT);
    dataFile.print("umidita");
    dataFile.println(dataStringH);
    dataFile.print("umidita terreno ");
    dataFile.println(dataStringTR);
    dataFile.print(now.day());
    dataFile.print("-");
    dataFile.print(now.month());
    dataFile.print("-");
    dataFile.print(now.year());
    dataFile.println("*******");
    dataFile.close();
    //Serial.println(dataStringT);
    //Serial.println(dataStringH);
    //Serial.println(dataStringTR);
}
}

questo invece va messo prima del setup

Sd2Card card;

vi ringrazio e mi scuso per il disturbo se volte e siete interessati vi posterò il codice intero della mi serra, frutto di quasi 1 anno di lavoro :slight_smile: :slight_smile:

Riccardo