Iniciar y finalizar programa pulsando un botón

A ver como funciona esto, sin tantas variables auxiliares aux que no tienen sentido.

#include <SD.h>

File logFile1;

int analogPin= A0;
float Vout=0;
int raw= 0;
unsigned long myTime;
unsigned long delta=0;
unsigned long anterior =0;

int i = 0;
String a ="Boton";
String b = String(i);
String c = ".TXT";
String nombre = a+b+c;


const int LED =3;
const int BOTON = 2;
int val = 0; //val se emplea para almacenar el estado del boton
int state = 0; // 0 LED apagado, mientras que 1 encendido
int old_val = 0; // almacena el antiguo valor de val

void setup() {
  Serial.begin(115200);
  pinMode(LED,OUTPUT); // establecer que el pin digital es una señal de salida
  pinMode(BOTON,INPUT_PULLUP); // y BOTON como señal de entrada
}

void loop() {
  //abrir();
  //programa();
  //cerrar();
  Serial.println("1");

  val= digitalRead(BOTON); // lee el estado del Boton
  if ((val == HIGH) && (old_val == LOW))   {
      state = 1-state;
      if (state) {
          abrir();
          tiempo_0 = micros();
      }
        
      else { 
        cerrar();
        digitalWrite(LED,LOW); // apagar el LED
        Serial.println("3");
      }
  }
  old_val = val; // valor del antiguo estado
  
  if (state == 1)   {
      programa();
      digitalWrite(LED, HIGH); // enciende el LED
      Serial.println("2");
  }
}

String nombre1() {
  if(SD.exists(nombre) == 1)   {
    Serial.println("Nombre ocupado");
    i++;
    b = String(i);
    nombre=a+b+c;
  } 
  return nombre;
}

void programa() {
  myTime = micros() - tiempo_0;
  delta = myTime-anterior;
  // Serial.println(delta);
  raw= analogRead(analogPin);
  Vout= (raw * 5)/1024.0;
  // Serial.println(Vout);
  if (logFile1)  { 
    logFile1.print(myTime);
    logFile1.print(";");
    logFile1.println(Vout);
  } 
  else  {
    Serial.println("Error al abrir el archivo 2");
  }
  anterior=myTime;
}

void cerrar() {
    logFile1.close();
    Serial.println(F("Cerrando SD"));
}

void abrir() {
  Serial.print(F("Iniciando SD ..."));
  if (!SD.begin(9))   {
    Serial.println(F("Error al iniciar"));
    return;
  }
  while(SD.exists(nombre) == 1)   {
     nombre=nombre1();
  }
  Serial.println(F("Iniciado correctamente"));
  logFile1 = SD.open(nombre, FILE_WRITE);
}

No le he prestado atención a tus impresiones "1", "2", "3"