Problema en rutina void loop() y libreria capsense

Hola me llamo Joseluis y quizá alguien pueda ayudarme a resolver un problema que tengo con un proyecto, ya que mis conocimientos de arduino y de electrónica son empíricos, explico a continuación. Estoy desarrollando una lampara que prende y paga por contacto, estoy usando la librería capsense, pero ademas de encender y apagar deseo activar un buzzer es decir que antes de apagar ejecute una melodía y antes de encender haga lo mismo. He intentado hacerlo usando las librerías tone pero siempre queda activado dentro de la rutina void loop. No se como hacer que una instrucción se ejecute y salga de la rutina, me podría alguien explicar como hacer, o sugerir quien me pueda colaborar. Pego el codigo para mejor expicacion.

#include <CapSense.h>

const int umbral = 350;

int val =0;
int old_val = 0;
int state = 0;
int Touch = 0;

CapSense   cs_4_2 = CapSense(8,9); 

void setup()                    
{ 
digitalWrite(13, LOW);  
cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);     
Serial.begin(9600);
}

void loop()                    
{      

val = Touch;    
                 
long total1 =  cs_4_2.capSense(100); 

//Serial.println(total1);     // para el monitoreo            
//Serial.println(" ");                      
//delay(500);                               

if (total1 > umbral){      
Touch = 1;    
} else {      
Touch = 0;    
}      

if ((val == HIGH)&& (old_val==LOW)){   
state = 1-state;      

delay (100); //delay para el  debouncing 
}    

old_val = val;     

if (state == 1) {  

//********************************************************************
//deseo que aquí ejecute un tono y salga de la rutina para que
//no se quede activado
//********************************************************************

digitalWrite(13, HIGH);

//********************************************************************
//deseo que aquí ejecute un tono y salga de la rutina para que
//no se quede activado
//********************************************************************

} else {    
digitalWrite(13, LOW);  
} 
  }

El problema es que solo consideras 2 estados encendido y apagado, tendrías que considerar uno o dos estados intermedios (encendiendo/apagando) en los cuales ejecutarias los tonos. Para ello, yo modificaría tu código y utilizaría una máquina de estados:

byte estado = 0;

void loop()                    
{      

  long total1;

  switch(estado)
  {
  case 0:  // Apagado
    total1 =  cs_4_2.capSense(100); 
    if(total1 > umbral)
      estado++;  // Pasamos a encendiendo
    break;

  case 1:  // Encendiendo
    total1 =  cs_4_2.capSense(100); 
    if(total1 < umbral)  // Esperamos a que se "suelte el interruptor"
    {
      EjecutaTono();  // Función en la que se ejecutaría el tono de encendido
      digitalWrite(13, HIGH);
      estado++;
    }
    break;

  case 2:  // Encendido
    total1 =  cs_4_2.capSense(100); 
    if(total1 > umbral)
      estado++;  // Pasamos a apagando
    break;

  case 1:  // Apagando
    total1 =  cs_4_2.capSense(100); 
    if(total1 < umbral)  // Esperamos a que se "suelte el interruptor"
    {
      EjecutaTono();  // Función en la que se ejecutaría el tono de apagado
      digitalWrite(13, LOW);
      estado=0;
    }
    break;

  default:  // Caso por defecto
    estado=0;
  }
}

(Cógelo como idea, está sin probar ;))