Utiliza interrupciones al BOTON y pon a dormir al micro algo parecido a esto:
#include <LowPower.h>
void loop() {
attachInterrupt(digitalPinToInterrupt(BOTON), ServicioBoton, FALLING);//Asocio interrupcion al pin del boton
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);// Duerme el MCU inmediatamente
// espera dormido sin contar hasta que se pulse el boton
detachInterrupt(digitalPinToInterrupt(BOTON));//desactivo la interrupcion por si quiero usar el boton para otra cosa
abrir();
programa();
cerrar();
//al reiniciar el loop se dormira de inmediato sin contar.
}
void ServicioBoton (){
// no hace nada, o lo hace tu veras
}
Saludos.