Ma scusa, la loop() è già una while() (anzi while(1)), perché aggiungerne una tua? Tra l'altro ti impedirà in futuro di fare anche altre cose...
In questi casi la cosa migliore, e che permette maggiore flessibilità anche in futuro, è implementare una "macchina a stati finiti" e "lasciare libera" la loop() di girare. Se non hai mai avuto a che fare con macchine a stati finiti chiedi pure, comunque sia in linea di massima sarebbe una cosa del tipo:
volatile boolean evento = false;
// Stati:
#define S_START 0
#define S_WAIT 1
#define S_EXEC 2
// Variabile di stato
int stato = 0; // 0=stato iniziale, 1= attesa, 2=fai qualcosa dopo l'attesa
...
void setup()
{
...
}
void loop()
{
switch (stato)
{
case S_START:
if (Miacondizione) {
evento = false;
// Attivo l'interrupt, ad esempio:
attachInterrupt(digitalPinToInterrupt(PIN_ALARM), IST_alarm, RISING;
stato = S_WAIT;
}
else
FaiQualcosa();
break;
case S_WAIT:
if (evento) { // E' stato attivato l'interrupt!
detachInterrupt(digitalPinToInterrupt(PIN_ALARM));
stato = S_EXEC; // Procedi
}
break;
case S_EXEC:
FaiQualcosaltro();
stato = S_START; // Torno all'inizio (?)
break;
}
...
void IST_alarm{
evento = true; // Attenzione agli interrupt multipli, eviterei evento = !evento;
}