Rimozione Sd senza bloccare Arduino

Ciao a tutti,
Ho fatto diversi tentativi, ma senza trovare una soluzione, quindi provo a chiedere, con la libreria originale Sd, come posso evitare di bloccare arduino alla rimozione e reinserimento della scheda? il secondo begin non lo accetta e ho controllato nel file della libreria, la modifica suggerita in altri topic (root.close), era già presente.
Ho un lettore di sd collegato ad un Mega
Grazie!

Sarebbe interessante vedere il codice

Standardoil:
Sarebbe interessante vedere il codice

#include <EEPROM.h>
#include <Wire.h>
#include <dht.h>
#include "Nextion.h"
#include <SD.h>
#include <SPI.h>

dht DHT;

File sdcard_file;  

int CS_pin = 53; 

void(* resetFunc) (void) = 0;

void setup()
{
 Serial.begin(9600);
 nexInit();  
  
 Wire.begin(0x02);             //imposto l’indirizzo dello slave
 Wire.onReceive(receiveEvent); //eventi per la ricezione del dato
 Wire.onRequest(requestEvent); //e per la richiesta del dato

   pinMode(CS_pin, OUTPUT);//declaring CS pin as output pin
if (SD.begin()){
   Serial.println("SD card is initialized and it is ready to use");
 } else{
   Serial.println("SD card is not initialized");
   return;
   } 
 
 // ----  EVENTI PER HMI NEXTION
 // Register the pop event callback function of the components

}


void loop() {

 nexLoop(nex_listen_list);
 // ESEGUO IL MIO CODICE, CON LE CHIAMATE PER LE SCRITTURE DEI LOG
}



void temp_tav_log(){

sdcard_file = SD.open("temp_tav.txt", FILE_WRITE); //Looking for the .txt in SD card

if (sdcard_file) { //If the file is found
// Serial.println("Writing to file is under process");
sdcard_file.print(giorno_UTC); //Writing to file
sdcard_file.print("/"); //Writing to file
sdcard_file.print(mese_UTC); //Writing to file 
sdcard_file.print(" ");  
sdcard_file.print(ora_UTC); //Writing to file
sdcard_file.print("."); //Writing to file
sdcard_file.print(minuti_UTC); //Writing to file 
sdcard_file.print(","); 
sdcard_file.print(temp);  
sdcard_file.print(","); 
sdcard_file.println(umid);  
sdcard_file.close(); //Closing the file
// Serial.println("Done");
}
else {
// Serial.println("Failed to open the file");
} 
}

void eventi_log(){
 
sdcard_file = SD.open("eventi.txt", FILE_WRITE); //Looking for the .txt in SD card

if (sdcard_file) { //If the file is found
// Serial.println("Writing to file is under process");
sdcard_file.print(giorno_UTC); //Writing to file
sdcard_file.print("/"); //Writing to file
sdcard_file.print(mese_UTC); //Writing to file 
sdcard_file.print("-");   
sdcard_file.print(ora_UTC); //Writing to file
sdcard_file.print(":"); //Writing to file
sdcard_file.print(minuti_UTC); //Writing to file 
sdcard_file.print(","); 
         switch (stato_eventi) {
           case 1:
             sdcard_file.println(" ATTIVATO SCENARIO GIORNO");
             break;
              // tutti gli altri case...                                                                                                                                                                                                                                               
         }
         stato_eventi=0;
sdcard_file.close(); //Closing the file
// Serial.println("Done");
}
else {
// Serial.println("Failed to open the file");
}
}

>luigi934: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

Io non vedo dove fai root.close()

Comunque se ricordo bene per smontare una SD devi fare sd.end()

E poi ripetere sd.begin() quando la hai rimessa per poterla usare di nuovo

Quindi devi prevedere un 'comando' apposta per farlo

Standardoil:
Io non vedo dove fai root.close()

Comunque se ricordo bene per smontare una SD devi fare sd.end()

E poi ripetere sd.begin() quando la hai rimessa per poterla usare di nuovo

Quindi devi prevedere un 'comando' apposta per farlo

già provato, ma quando riabilito l'SD con il begin, il mega si blocca

void abilitaz_log(){
  if(x==168){ 
    SD.begin();
    stato_log_sd=1; 
    }
  if(x==169){ 
    SD.end();
    stato_log_sd=0; 
 }
}

il root.close è nel SD.cpp

 boolean SDClass::begin(uint8_t csPin) {
    if (root.isOpen()) {
      root.close();
    }

l'autore della libreria SD alternativa, consigliava di aggiungere queste righe nella libreria originale, ma probabilmente è stata aggiornata nel frattempo, perchè è già presente in quella attuale

Ok
Non c'era nel tuo primo programma

Ma la sd.begin() non richiede il numero di piedino?

Standardoil:
Ok
Non c'era nel tuo primo programma

Ma la sd.begin() non richiede il numero di piedino?

era in uno dei vari tentativi fatti :smiley:
ho provato anche a mettere il pin su begin, niente si blocca uguale.
non alla disattivazione, ma alla riattivazione

Io ti chiederei se metti tutto il programma

O almeno un programma compilabile che presenta il problema

Perché il primo pezzo che hai messo non ha evidentemente il problema

Il secondo credo che non compili dato che il pin nella sd.begin() non è opzionale, senza non compila

Quindi non sarà facile aiutarti in queste condizioni

Domanda … ma non basta chiudere tutti i files e NON fare nulla sulla SD per poterla rimuovere ed, eventualmente, inserirne un’altra? … a me sembra di aver sempre fatto solo così … boh … ::slight_smile:

Guglielmo

Io preferirei comunque chiudere anche la radice del file system, esattamente la cosa che fa la sd.end()

L'anno scorso o forse prima c'era uno che ha avuto un problema simile ma adesso non vado a vedere

... non so... ::slight_smile: ... non credo serva a qualche cosa ... NON c'è mica un OS che si legge la FAT/EXFAT e porta in cache i dati delle directory e dei files ...credo che ogni volta che apri un file va a leggere la directory, guarda dove è e lo apre/usa, quando lo chiudi ... tutto dimenticato :smiley:

Se a quel punto cambi SD ... manco se ne accorge (... anche perché sono ben poche le librerie che controllano il pin che indica la presenza della SD).

Poi magari mi sbaglio ... :grin:

Guglielmo

Standardoil:
Io ti chiederei se metti tutto il programma

O almeno un programma compilabile che presenta il problema

Perché il primo pezzo che hai messo non ha evidentemente il problema

Il secondo credo che non compili dato che il pin nella sd.begin() non è opzionale, senza non compila

Quindi non sarà facile aiutarti in queste condizioni

la parte del prg relativa alla SD è tutta qua, nel loop ci sono lo le chiamate ai void per salvare i log ad eventi/intervalli predefiniti (ho controllato e non ci sono scritture non volute). Il begin l'ho provato sia con, che senza pin (53), in entrambi i casi compila.

gpb01:
... non so... ::slight_smile: ... non credo serva a qualche cosa ... NON c'è mica un OS che si legge la FAT/EXFAT e porta in cache i dati delle directory e dei files ...credo che ogni volta che apri un file va a leggere la directory, guarda dove è e lo apre/usa, quando lo chiudi ... tutto dimenticato :smiley:

Se a quel punto cambi SD ... manco se ne accorge (... anche perché sono ben poche le librerie che controllano il pin che indica la presenza della SD).

Poi magari mi sbaglio ... :grin:

Guglielmo

è quello che pensavo anchio, invece cercando nei vari topic avevo trovato questo

ma, anche chiudendo il file dopo la scrittura, il mega si blocca

ho notato che si blocca anche se dopo un riavvio, senza aver mai scritto niente, estraggo e renserisco l'sd

luigi934:
... è quello che pensavo anchio, invece cercando nei vari topic avevo trovato questo
https://forum.arduino.cc/index.php?topic=324923.0

... ma quello è un vecchissimo thread di svariati anni fa ... le librerie in questi anni sono state aggiornate e cose di quegli anni non fanno più testo.

luigi934:
ho notato che si blocca anche se dopo un riavvio, senza aver mai scritto niente, estraggo e renserisco l'sd

Secondo me il tuo circuito ha altri problemi ... ad esempio, lunghezza dei cavi di collegamento tra MEGA e modulo SD. Il bus SPI è una brutta bestia data l'alta velocità che raggiunge e le frequenze in gioco ...

Come è collegato il modulo SD ?

Guglielmo

Io qualche dubbio lo ho

Sul circuito di certo

Sullo OP, che ci ha detto le cose un po' col singhiozzo, in particolare non ci ha ancora dato un programma compilabile che presenta il problema

E che ha confermato che adesso sta usando un programma non compilabile (????)

E da ultimo sulla libreria
Nel senso che in effetti sembra che senza una .end() tenga in memoria qualcosa

Ho cercato la discussione della quale parlavo ieri

In effetti allora ero scettico, ma mi sono dovuto ricredere, la .end() serve

La lettura di quella discussione è stata molto illuminante, anche su come ero 'strxxxo' nei mesi passati
Ma anche che senza una descrizione chiara del problema e del programma non se ne esce
Allora quello OP era riuscito a farcela

Standardoil:
... E da ultimo sulla libreria
Nel senso che in effetti sembra che senza una .end() tenga in memoria qualcosa

Ho cercato la discussione della quale parlavo ieri

In effetti allora ero scettico, ma mi sono dovuto ricredere, la .end() serve

Si, sono andato a leggermi i sorgenti, e ... qualche cosa tiene in memoria, per cui, per cambiare SD, effettivamente occorre la .end() (... è scritto anche nei commenti di tale metodo).

//call this when a card is removed. It will allow you to insert and initialise a new card.
  void SDClass::end() {
    root.close();
  }

C'è però da notare che il metodo .begin() ... provvede a farla direttamete lui se non è stata fatta ...

if (root.isOpen()) {
   root.close();
}

Guglielmo

P.S.: Interessante notare che la .end() NON è documentata nel reference della libreria ... ::slight_smile:

Standardoil:
... dato che il pin nella sd.begin() non è opzionale, senza non compila

Questo no, il pin della .begin() è opzionale e, se non messo, prende il valore di default che è 10 per la UNO e 53 per la MEGA. Anzi, se ne usi uno differente, comunque questi li DEVI devi definire come output o ... la libreria non funziona ...

Note that even if you use a different chip select pin, the hardware SS pin must be kept as an output or the SD library functions will not work.

Guglielmo

gpb01:
P.S.: Interessante notare che la .end() NON è documentata nel reference della libreria ... ::slight_smile:

Lo avevo già fatto notare io ai tempi...

Ma era caduto nel vuoto

Per il pin

A parte che su una mega magari non è lo stesso, il pin usato

Ma so vede, dai sorgenti citati, che non c'è il default

Standardoil:
Ma so vede, dai sorgenti citati, che non c'è il default

Non esattamente, non lo vedi nel .cpp, ma c'è un valore di default nel .h

boolean begin(uint8_t csPin = SD_CHIP_SELECT_PIN);

Anche il reference lo dice ...

cspin (optional): the pin connected to the chip select line of the SD card; defaults to the hardware SS line of the SPI bus

Guglielmo

gpb01:
... ma quello è un vecchissimo thread di svariati anni fa ... le librerie in questi anni sono state aggiornate e cose di quegli anni non fanno più testo.

Secondo me il tuo circuito ha altri problemi ... ad esempio, lunghezza dei cavi di collegamento tra MEGA e modulo SD. Il bus SPI è una brutta bestia data l'alta velocità che raggiunge e le frequenze in gioco ...

Come è collegato il modulo SD ?

Guglielmo

Il modulo SD è posizionato a pochi cm dal mega, escluderei dei problemi di collegamento.. il programma che ho postato, compila normalmente (non lho scritto tutto per comodità, sono circa 3000 righe di codice) e le scritture sulla SD avvengono regolarmente. Il problema si verifica al reinserimento della scheda, il mega si blocca nel momento in cui provo a scrivere nuovamente (finchè non scrivo niente, il progr continua a girare). Se tolgo e rimetto la scheda mentre è in blocco, riprende a funzionare finchè non scrivo nuovamente. E' come se perdesse il sync e vada in loop in attesa della SD.

Anche mettendo end() su un comando (come postato in prima pagina) ho lo stesso risultato

Voglio provare a caricare un programma esempio della libreria, solo per vedere se può dipendere dal mio sw o magari dal modulo stesso..