[RISOLTO] Rimozione SD e ripristino automatico al reinserimento

Ciao a tutti
Ho inserito nel progetto una funzione (nello sketch) che controlla ethernet e SD card se sono correttamente funzionanti e un piccolo timer RC esterno che controlla se il micro sta funzionando correttamente o meno segnalando con un led allarme un errore generico.
Ora la domanda è :
perchè quando faccio ripetere le righe di inizializzazione degli shield al di fuori del setup richiamando gli stessi init vengono ignorati? insomma le periferiche non si ripristinano più, c'e' qualche modo per inizializzare di nuovo senza resettare tutto?

In pratica vorrei estrarre la SD leggerla e reinserirla senza dover resettare tutto oppure sostituirla con un altra "in corsa"

grazie

In automatico viene chaiamata una volta la funzione setup() e poi di continuo la funzione loop(). Se non chiami la Tua funzione begin() da una delle due funzioni nominate non verrá mai eseguito.
Il C non é come il HTML, PHP, il basic o un file batch di DOS o LINUX che viene eseguito dal inizio alla fine . il C incomincia con la funzione main(). nella main() di Arduino é scritto dio eseguire 1 volta il setup() e infinite volte il loop().
Ciao Uwe

Credo che pablos voglia dire un'altra cosa.
Cioè che lui ha una funzione che inizializza il modulo SD. Se questa funzione viene chiamata nel setup essa funziona, se viene chiamata in un secondo momento da un altro punto dello sketch non funziona più.

@pablos:
potresti postare il codice di quella funzione e del tuo setup?

leo72:
Credo che pablos voglia dire un'altra cosa.
Cioè che lui ha una funzione che inizializza il modulo SD. Se questa funzione viene chiamata nel setup essa funziona, se viene chiamata in un secondo momento da un altro punto dello sketch non funziona più.

@pablos:
potresti postare il codice di quella funzione e del tuo setup?

esatto ... ok metto insieme i pezzi e posto grazie :slight_smile:

pablos:
In pratica vorrei estrarre la SD leggerla e reinserirla senza dover resettare tutto oppure sostituirla con un altra "in corsa"

Sul connettore della SD hai due segnali aggiuntivi, uno ti dice se è protetta da scrittura, l'altro ti avvisa se è inserita oppure no, questo lo devi usare per verificare se viene estratta e poi reinserita in modo da poter reinizializzare la sua lettura.

Sul connettore della SD hai due segnali aggiuntivi, uno ti dice se è protetta da scrittura, l'altro ti avvisa se è inserita oppure no, questo lo devi usare per verificare se viene estratta e poi reinserita in modo da poter reinizializzare la sua lettura.

il mio problema non è sapere se è presente o meno, è farla vedere di nuovo
Questo sketch funziona perfettamente fino a quando non la estraggo

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

const int SD_CS = 4;          // pin 4 is the SPI select pin for the SDcard
const int ETHER_CS = 10;   // pin 10 is the SPI select pin for the Ethernet


byte ip[] = { 192, 168, 2, 177 };                     
byte subnet[] = { 255, 255, 255, 0 };                
byte gateway[] = { 192, 168, 2, 1 };                 
byte mac[] = { 0x00, 0x11, 0x22, 0x33, 0xFB, 0x11 }; 

const int Pin2 = 2; //uscita led errore generico
boolean has_filesystem = true;

void setup() 
{
  Serial.begin(9600);
  
   pinMode(Pin2, OUTPUT);  //led errore
  pinMode(SS_PIN, OUTPUT);	// set the SS pin as an output(necessary to keep the board as master and not SPI slave)
  digitalWrite(SS_PIN, HIGH);	// and ensure SS is high
  // Ensure we are in a consistent state after power-up or a reset
  // button These pins are standard for the Arduino w5100 Rev 3
  // ethernet board They may need to be re-jigged for different boards
  pinMode(ETHER_CS, OUTPUT); 	// Set the CS pin as an output
  digitalWrite(ETHER_CS, HIGH); // Turn off the W5100 chip! (wait for configuration)
  pinMode(SD_CS, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(SD_CS, HIGH); 	// Turn off the SD card! (wait for configuration)

  sd_init() ;

  Ethernet.begin(mac, ip);
}

void sd_init() 
{   
  if (!card.init(SPI_FULL_SPEED, SD_CS)) { has_filesystem = false; }
  if (!volume.init(&card)) { has_filesystem = false; }
  if (!root.openRoot(&volume)) { has_filesystem = false;}
}  

void loop() 
{

  if (!volume.init(&card)) { has_filesystem = false; }  //Se estraggo la scheda SD ottengo un errore immediato
  
  if (!has_filesystem) 
  { 
    digitalWrite(Pin2, HIGH); // led ERRORE .... che si accende se estraggo la scheda
    sd_init(); // tento un ripristino 
  } 

..............
..............
..............

}

A me viene da suggerirti di copiare tutta la parte di inizializzazione dei pin dentro alla funzione sd_init, togliendola dal setup.

Con questo possiamo rimuovere la SD visualizzando un errore con un led, al reinserimento, si inizializza nuovamente continuando la scrittura spegnendosi il led. Posso estrarre la scheda leggere i log, modificare i file e reinserirla senza riavviare arduino e tutte le periferiche connesse ..... mi piace!!! :slight_smile:

P.S. non si ripristinava perchè "root.openRoot(&volume)" era già aperto dandomi un errore, perciò prima di tentare l'inizializzazione va chiuso con root.close(); .... ho messo anche file.close(); nel caso venisse estratta mentre sta scrivendo

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

const int SD_CS = 4;  // pin 4 is the SPI select pin for the SDcard
const int ETHER_CS = 10; // pin 10 is the SPI select pin for the Ethernet

byte ip[] = { 192, 168, 2, 177 };                               
byte mac[] = { 0x00, 0x11, 0x22, 0x33, 0xFB, 0x11 }; 

const int Pin2 = 2; //uscita led errore generico
boolean has_filesystem = true;

void setup() 
{
  Serial.begin(9600);
  delay(100);
  
   pinMode(Pin2, OUTPUT);  
  pinMode(SS_PIN, OUTPUT);	// set the SS pin as an output(necessary to keep the board as master and not SPI slave)
  digitalWrite(SS_PIN, HIGH);	// and ensure SS is high
  // Ensure we are in a consistent state after power-up or a reset
  // button These pins are standard for the Arduino w5100 Rev 3
  // ethernet board They may need to be re-jigged for different boards
  pinMode(ETHER_CS, OUTPUT); 	// Set the CS pin as an output
  digitalWrite(ETHER_CS, HIGH); // Turn off the W5100 chip! (wait for configuration)
  pinMode(SD_CS, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(SD_CS, HIGH); 	// Turn off the SD card! (wait for configuration)

  sd_init() ;

  Ethernet.begin(mac, ip);
}

void sd_init() 
{   
  has_filesystem = true; 
  if (!card.init(SPI_FULL_SPEED, SD_CS)) { has_filesystem = false; }
  if (!volume.init(&card)) { has_filesystem = false; }
  if (!root.openRoot(&volume)) { has_filesystem = false; } 
}  

void loop() 
{
  if (!volume.init(&card)) { has_filesystem = false; }  //Se estraggo la scheda SD ottengo un errore immediato
  if (!has_filesystem) 
  { 
    digitalWrite(Pin2, HIGH); // led ERRORE se SD rimossa (si accende)
     file.close(); 
     root.close(); 
     sd_init(); 
   } 
  else
  { 
    digitalWrite(Pin2, LOW); // led ERRORE rientrato (si spegne)
   } 
..............
..............
..............
}