Datalogger di pressione

#include <DHT.h>
#include <DHT_U.h>
#include <ADS1115_WE.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include "RTClib.h"
#include <avr/wdt.h>

#define DHTTYPE DHT22   // DHT 22 
#define I2C_ADDRESS 0x48 //definisce indirizzo ADC

#define S_WAIT 0 //stato di attesa interupt
#define S_SAVE 1 //stato di salvataggio dati 

#define P_TEMP 7 //definisce pin per il sensore di temoperatura
#define P_INT 2   //definisce pin per Allarme RTC DS3231
#define P_CS 5       //Definisce il pin per il CS
#define P_RELAY 3       //definisce il pin per relè malfunzionamento

volatile int Status = S_WAIT; //devinisco la variabile che seziona lo stato in cui è la macchina
volatile bool isISR = false; //variabile che definisce se è avvenuto o no l'interupt 

float voltage0 = 0;
float voltage1 = 0;
float voltage2 = 0;
float voltage3 = 0;

DHT dht(P_TEMP, DHTTYPE); //inizializza oggetto DHT
RTC_DS3231 rtc; //inizializza oggetto RTC
ADS1115_WE adc = ADS1115_WE(I2C_ADDRESS); //inizializza ADC

DateTime now;
File dataFile;

void setup() {
  Serial.begin(9600); //avvia la seriale a 9600
  delay(500);  // attende la stabilizazione della seriale 
  InitSD();  
  InitRTC();
  InitDHT();
  InitADC(); 
  pinMode(P_RELAY, OUTPUT);//imposto l'uscita del relay come OUTPUT 
  digitalWrite(P_RELAY, HIGH); //eccito il relè/chiudo il contatto NO
  pinMode(P_INT, INPUT_PULLUP);//imposto l'uscita del Interupt ccome INPUT + Pullup
  //wdt_enable(WDTO_8S); //avvia WDT 8 seocndi
  Serial.println("Fase di inizializazione completata");
}

void loop() {
 delay(100);
  switch (Status) {
      case S_WAIT:
      unsigned long Ora = millis();
      while(millis()<Ora+1000){   
          }
      Serial.println("è passato un secondo in wait");// stampa ogni secondo per vedere se sta girando);
      if(isISR){Status=S_SAVE;}
      break;
      
      case S_SAVE:
        Serial.println("Sono in save");
        StopISR();
        Leggi();
        Scrivi();
        ImpostaAlarm();
        StartISR();
        Status = S_WAIT;


    break;}}



float readChannel(ADS1115_MUX channel) {
  float voltage = 0.0;
  adc.setCompareChannels(channel);
  adc.startSingleMeasurement();
  while(adc.isBusy()){}
  voltage = adc.getResult_V(); // alternative: getResult_mV for Millivolt
  return voltage;
}

void AllarmISR() {
  isISR = true;
}

void InitSD() {
  while (!SD.begin(P_CS)) //attende che la SD si inizializzi
  {
    Serial.println("Impossibile trovare SD, Ritento tra 5 secondi");
    Serial.flush();
    delay(5000);
  }
  Serial.println("SD Inizializata");
}

void InitRTC() {
  while (!rtc.begin())  //aspetta che RTC Risponda
  {
    Serial.println(("Impossibile trovare DS3231, Ritento tra 5 secondi"));
    Serial.flush();
    delay(5000);
  }
  rtc.disable32K(); // disabilita uscita 32K
  rtc.writeSqwPinMode(DS3231_OFF); //disattiva uscita onda quadra
  rtc.clearAlarm(1);
  rtc.disableAlarm(1);
  Serial.println("RTC Inizializato");
}

void InitDHT() {
  dht.begin(); //inizializza DHT22
  delay(100);
  Serial.println("DHT22 Inizializato");
}

void InitADC() {
  Wire.begin();
  while (!adc.init())  //aspetta che ADC Risponda
  {
    Serial.println(("Impossibile inizializare ADC, Ritento tra 5 secondi"));
    Serial.flush();
    delay(5000);
  }
  adc.setVoltageRange_mV(ADS1115_RANGE_6144); //setta lettura +/- 6.114v
  adc.setMeasureMode(ADS1115_SINGLE); //single shot
  Serial.println("ADC Inizializato");
}




void StartISR() {
  isISR = false;
  attachInterrupt(digitalPinToInterrupt(P_INT), AllarmISR, FALLING);  
}

void StopISR() {
  detachInterrupt(digitalPinToInterrupt(P_INT));
}

void Leggi() {
  Serial.print("Sono in Leggi");
  voltage0 = readChannel(ADS1115_COMP_0_GND); //Avvia lettura canale 0
  voltage1 = readChannel(ADS1115_COMP_1_GND); //Avvia lettura canale 1
  voltage2 = readChannel(ADS1115_COMP_2_GND); //Avvia lettura canale 2
  voltage3 = readChannel(ADS1115_COMP_3_GND); //Avvia lettura canale 3
  Serial.print("letture ADC ok");
} 

void Scrivi() {
  
  while (bool FileReady = false)
        if(dataFile){
          dataFile = SD.open("datalog.txt", FILE_WRITE); //apre file csv
          FileReady = true;
        }else{
          Serial.println("Errore apertura file Datalog.txt");
          delay(100);
        } 
  
  
  
  noInterrupts(); //disabilita gli interupts per evitare strane cose durante la scrittura
  DateTime now = rtc.now(); //carica in now data e ora attuali
  File dataFile;
  dataFile = SD.open("datalog.txt", FILE_WRITE); //apre file csv
  dataFile.print(now.day(), DEC);
  dataFile.print('/');
  dataFile.print(now.month(), DEC);
  dataFile.print('/');
  dataFile.print(now.year(), DEC);
  dataFile.print(" ");
  dataFile.print(now.hour(), DEC);
  dataFile.print(':');
  dataFile.print(now.minute(), DEC);
  dataFile.print(':');
  dataFile.print(now.second(), DEC);
  dataFile.print(" ");
  dataFile.print(voltage0);
  dataFile.print(" ");
  dataFile.print(voltage1);
  dataFile.print(" ");
  dataFile.print(voltage2);
  dataFile.print(" ");
  dataFile.println(voltage3);
  dataFile.close();  //chiude file CSV
  interrupts();  //riabilita gli interrupts per il normale funzionamento
  Serial.flush(); // svuota seriale 
  Serial.println("scrittura file completata");
}


void ImpostaAlarm(){
  //DateTime next = (DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute() + 1, 0));
  // Io per aggiungere un minuto farei così, prova a vedere se funziona:
  //DateTime next = DateTime(rtc.now() + 60);
  // calculate a date which is 7 days, 12 hours, 30 minutes, and 6 seconds into the future
   DateTime next (now + TimeSpan(0,0,1,0));
  
  rtc.setAlarm1(next, DS3231_A1_Hour);
  Serial.print("Imposta allarme alle ");
  Serial.print(next.hour());
  Serial.print(":");
  Serial.println(next.minute());
}

Il programma compila ma non va......
è come se quando entra in S_SAVE, si blocchi....

Per vederlo ho forzato Status = S_WAIT e poi S_SAVE (dove dovrebbe essere)

Buon WE