lampeggio led in risparmio energetico se la microSD non è inserita

Buongiorno,
vorrei eseguire un lampeggio del led quando il software riconosce la mancanza di microSD.
Ho quindi inizialmente simulato la mancanza di microSD cosi:

EDIT: CODICI CORRETTI

#include <avr/sleep.h>
#include <avr/wdt.h>
#include <SPI.h>
#include <SD.h>
const byte PinChipSelect = 10;
bool statoLed;
File dataLogger;
void setup()
{
  MCUSR = 0; //resetta il registro di stato della MCU
  wdt_disable();
  Serial.begin(9600);
  pinMode(PinChipSelect, OUTPUT);
  analogReference(EXTERNAL);
  pinMode(13, OUTPUT);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  setWdt();
}
void loop()
{

  while (1)
  {
    Serial.println("microSD non inserita");
    digitalWrite(13, HIGH);
    delay(30);
    digitalWrite(13, LOW);
    ACSR |= (1 << ACD); //spegne il comparatore analogico
    ADCSRA &= ~(1 << ADEN); //spegne l'ADC
    MCUCR |= ((1 << BODS) | (1 << BODSE)); //spegne il BOD
    DIDR0 = 0; //disattivo i buffer digitali sui pin analogici
    //seguenza di sleep
    sleep_enable();
    sei();
    sleep_cpu();
    sleep_disable();
  }
  Serial.println("microSD presente.");
}
void setWdt()
{
  SREG &= ~(1 << SREG_I); //disattiva tutti gli interrupt
  //imposta il registro del watchdog
  WDTCSR |= ((1 << WDCE) | (1 << WDE));
  //imposta la modalità "interrupt" ed il timeout a 4 secondi
  WDTCSR = ((1 << WDIE) | (1 << WDP3));
  SREG |= (1 << SREG_I); //riattiviamo gli interrupt globali
}
ISR (WDT_vect)
{
  //reimposta la modalità interrupt+reset
  WDTCSR |= ((1 << WDCE) | (1 << WDIE));
}

ed il lampeggio funziona perfettamente spegnendo il led immediatamente prima di "addormentarsi". La frequenza del lampeggio è data dall'overflow del watchdog che è impostato a 4 secondi.

Quindi, preso coscienza del funzionamento, adatto al mio codice reale:

#include <avr/sleep.h>
#include <avr/wdt.h>
#include <SPI.h>
#include <SD.h>
const byte PinChipSelect = 10;
bool statoLed;
File dataLogger;
void setup()
{
  MCUSR = 0; //resetta il registro di stato della MCU
  wdt_disable();
  Serial.begin(9600);
  pinMode(PinChipSelect, OUTPUT);
  analogReference(EXTERNAL);
  pinMode(13, OUTPUT);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  setWdt();
}
void loop()
{
  while (!SD.begin(PinChipSelect))
  {

    Serial.println("microSD non inserita");
    digitalWrite(13, HIGH);
    Serial.print("Dovrebbe accendersi il LED: ");
    statoLed = digitalRead(13);
    if (statoLed == HIGH) Serial.println("ACCESO");
    else Serial.println("SPENTO");
    delay(30);
    digitalWrite(13, LOW);
    Serial.print("Dovrebbe spegnersi il LED: ");
    statoLed = digitalRead(13);
    if (statoLed == HIGH) Serial.println("ACCESO");
    else Serial.println("SPENTO");
    delay(50);
    ACSR |= (1 << ACD); //spegne il comparatore analogico
    ADCSRA &= ~(1 << ADEN); //spegne l'ADC
    MCUCR |= ((1 << BODS) | (1 << BODSE)); //spegne il BOD
    DIDR0 = 0; //disattivo i buffer digitali sui pin analogici
    //seguenza di sleep
    sleep_enable();
    sei();
    sleep_cpu();
    sleep_disable();
  }
  Serial.println("microSD presente.");
}
void setWdt()
{
  SREG &= ~(1 << SREG_I); //disattiva tutti gli interrupt
  //imposta il registro del watchdog
  WDTCSR |= ((1 << WDCE) | (1 << WDE));
  //imposta la modalità "interrupt" ed il timeout a 4 secondi
  WDTCSR = ((1 << WDIE) | (1 << WDP3));
  SREG |= (1 << SREG_I); //riattiviamo gli interrupt globali
}
ISR (WDT_vect)
{
  //reimposta la modalità interrupt+reset
  WDTCSR |= ((1 << WDCE) | (1 << WDIE));
}

l'overflow del watchdog funziona ma non il lampeggio del LED13 difatti in seriale trovo:

Dovrebbe accendersi il LED: SPENTO
Dovrebbe spegnersi il LED: SPENTO

P.S: ho utilizzato il led interno di arduino per vedere velocemente il funzionamento..

Io vedo che accendi il led ma non lo spegni dopo il delay.

 digitalWrite(LED13, LOW);

Grazie Arco per la risposta, purtroppo avevo impostato malissimo i codici pubblicati. Chiedo perdono.
Adesso ho controllato e riprovato i codici e ho modificato il post precedente, come puoi vedere, adesso c'è il digitalWrite(13,LOW);

e con:
while(1) mi funziona

ma con:
while (!SD.begin(PinChipSelect)) non funziona il lampeggio.

P.S: ho tolto la variabile LED13, tanto, c'è solo quel led ed è una prova ::slight_smile:

Pochi giorni fa c'è stata una richiesta simile, nella libreria standard la begin la puoi richiamare una sola volta, magari dipende da quello, cerca nelle discussioni avevo dato un suggerimento di una libreria alternativa, magari fa al caso tuo

ho risolto in loop con:

if (card.init(SPI_HALF_SPEED, PinChipSelect)) 
{}else{}

inserendo in setup:

Sd2Card card;

grazie a tutti per l'aiuto :wink: