trying to test all sleep modes

I’m trying to test various sleep_mode on my Arduino UNO but I think I have some problem of race conditions because sometimes when I test the card goes to sleep and does not wake up anymore. Could someone help me? thanks in advance.

#include <avr/sleep.h>
#include <avr/power.h>

// sleep_mode_idle  - Turn off CPU clock
// sleep_pwr_save - Allows Timer2 to be running. Power Down + Timer.
// sleep_pwr_down - All clocks off. Cannot wake up from timer
// sleep_mode_ADC - ADC Noise Reduction. Turn of I/O clock in addition.
// sleep_mode_standby


int wakePin = 2;
intledRed = 13;

int buttonState; // stato corrente
int lastButtonState = LOW; //ultimo stato del bottone

long lastDebounceTime = 0;
long debounceDelay = 50;


void wakeUp(void) {

  sleep_disable();
  detachInterrupt(0);
  delay(50);
}

void setup() {
  // put your setup code here, to run once:
  pinMode(wakePin, INPUT_PULLUP);
  pinMode(rosso, OUTPUT);
  // digitalWrite(wakePin, HIGH);
  //digitalWrite(rosso, HIGH);
  Serial.begin(9600);

}

void sleep(void)
{

  // ADCSRA = 0; // disabilito il sottosistema ADC

  // set_sleep_mode(SLEEP_MODE_IDLE);       // tipo di modalità usata
  // set_sleep_mode(SLEEP_MODE_ADC);      // tipo di modalità usata
  // set_sleep_mode(SLEEP_MODE_PWR_SAVE); // tipo di modalità usata
  //  set_sleep_mode(SLEEP_MODE_STANDBY);  // tipo di modalità usata
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);    // tipo di modalità usata

  noInterrupts();

  sleep_enable();  // abilito il bit sul registro MCUCR dell’AVR

  attachInterrupt(0, risveglio, FALLING);

  interrupts();


  // disabilito tutte le periferiche non utilizzate per
  // aumentare il risparmio ma soprattutto alcune di queste
  // potrebbero far risvegliare la scheda

  // power_adc_disable();
  //  power_spi_disable();
  //  power_timer0_disable();
  //  power_timer2_disable();
  //  power_twi_disable();


  // uso il pin 2 per l’interrupt
  sleep_mode(); // mando la scheda in sleep

  // disabilito lo sleep
  sleep_disable();
  detachInterrupt(0);

  // riattivo le periferiche
  // power_all_enable();

}

// gli interrupt sono una bega
// devo usare una funzione debounce per controllare
// lo stato del bottone

boolean debounce() {

  //
  boolean retVal = false;

  // leggo il valore sul pin del bottone
  int reading = digitalRead(wakePin);

  //se lo stato è ALTO = bottone premuto
  if (reading != lastButtonState)
  {
    //e il tempo di debouce è l'attuale millis()
    lastDebounceTime = millis();

  }
  // se il tempo corrente - il tempo di debouce è > di 50ms proseguo
  if ((millis() - lastDebounceTime) > debounceDelay) {

    // se leggo uno stato diverso dal bottone vado avanti
    if (lettura != buttonState) {
      buttonState = lettura;
      if (buttonState == HIGH) { // se il valore è ALTO ritorno true
        retVal = true;

      }
    }
  }
  lastButtonState = reading; // leggo il prossimo
  return retVal;
}


void loop() {

  boolean pressed = debounce(); // controllo se ho premuto deve tornarmi true

  if (pressed == true)
  {
    digitalWrite(rosso, LOW);
    Serial.println("Sto dormendo");
    delay(50);
    sleep();
  }
  else {
    digitalWrite(ledRed, HIGH);
    Serial.println("sono sveglio");
    delay(50);
  }
}

any ideas?