Encendido/apagado de un LED con palmas y control ultrasonidos.

Previamentes ya escribi sobre el control de ultrasonidos, pero al implementar el codigo con el que se me ayudo al que ya tenia de encendido/apagado de un LED con palmas y cuando quiero apagarlo con otras 3 palmas, no puedo.

Creo que tiene algo que ver con algo de "time" o algo asi porque no me da tiempo a hacer las 3 palmadas de la rutina. Tambien podria ser por la linea " duracion = pulseIn(echoPin, HIGH) ; " peor no estoy seguro de ello.

He mirado el conexionado y funciona perfectamente y el pin no esta fundido.

Mi codigo es el siguiente :

//Parte de distancia
          #define trigPin 13
          #define echoPin 12
          //#define led 3
          long duracion, distancia, distanciaAnterior;
          int Limite = 25 ;  // Medida en vacío del sensor
          int intensidad;
          bool unaVez = true, unaVez2 = true;

//Parte de palmas
          const int pinLED = 5; 
          const int pinMicrophone = 9;
          bool state1 = false;
          bool state2 = false;
          bool state3 = false;
          bool stateLED = false;
          bool soundDetected = false;
          unsigned long tem;

          //Parte nueva
          bool BitMedicion;
          
void setup(){
    //Parte de palmas
          pinMode(pinLED, OUTPUT);
          pinMode(pinMicrophone, INPUT);
          Serial.begin(9600);
    //Parte de medicion
          pinMode(trigPin, OUTPUT);
          pinMode(echoPin, INPUT);
          pinMode(pinLED, OUTPUT);

          BitMedicion = LOW;
}

void loop(){
//Serial.print("Estado LED = ");
//Serial.println(digitalRead(pinLED));
soundDetected = digitalRead(pinMicrophone);
if ((soundDetected==true) && (state1==false) && (state2==false) && (state3==false)) {
state1 = true;
Serial.println("Estado1 true");
tem = millis();
delay (200);
} else if ((soundDetected == true) && (state1==true) && (state2==false) && (state3==false) ) {
state2 = true; 
Serial.println("Estado2 true");
delay (200);
} else if ((soundDetected == true) && (state1==true) && (state2==true) && (state3==false) ) {
state3 = true; 
Serial.println("Estado3 true");
delay (200);  

}
if ((state1==true) && (state2==true) && (state3==true)){
  
stateLED = !stateLED;
digitalWrite(pinLED , stateLED);
BitMedicion = stateLED ;
Serial.println("Tres estados detectados");
Serial.print("Estado LED = ");
Serial.println(stateLED);
state1 = false; 
state2 = false;
state3 = false; 

}

if (((millis()-tem) >= 500) && (state1==true) && (state2==false || state3==false)){ // Reseteamos estados al pasar 500 ms
Serial.println("Reset Time");
Serial.println((millis()-tem));
state1 = false; 
state2 = false;
state3 = false;  
}

if(BitMedicion == HIGH) //Aqui ejecutamos el codigo de regulacion
{

//PARTE DE MEDICION 

//CALCULAMOS LA DISTANCIA
    digitalWrite(trigPin, LOW);        // Nos aseguramos de que el trigger está desactivado
    delayMicroseconds(2);              // Para asegurarnos de que el trigger esta LOW
    digitalWrite(trigPin, HIGH);       // Activamos el pulso de salida
    delayMicroseconds(10);             // Esperamos 10µs. El pulso sigue active este tiempo
    digitalWrite(trigPin, LOW);        // Cortamos el pulso y a esperar el echo
    duracion = pulseIn(echoPin, HIGH) ;       
    distancia = duracion / 2 / 29.1  ;
    if ( distancia != distanciaAnterior )
    {
      Serial.println(String(distancia) + " cm.") ;
    }
    distanciaAnterior = distancia;

  //DENTRO DEL LIMITE
    if ( distancia <= Limite )
    {
      intensidad = 255 / Limite * distancia;
     
      analogWrite ( pinLED , intensidad) ;
      if ( unaVez == true )
      {
        Serial.println("Esta dentro de rango");
        unaVez = false;
      }
      unaVez2 = true;
    }

  //FUERA DEL LIMITE
    else
    {
      if (unaVez2 == true )
      {
        Serial.println("Esta fuera del rango");
        unaVez2 = false;
      }
      unaVez = true;
    }
   
  delay (50) ; // Para limitar el número de mediciones


  
  }






}

He llegado a la conclusion de que es cosa del codigo porque el conexionado esta bien y comprobado.

Mi problema basicamente es que al entrar en el estado de encendido despues de 3 palmas luego no puedo apagarlo al volver a palmar porque me aceptaba 2 de los 3 estados solo.

Muchas gracias de antemano.

Desconozco el sensor de sonido que estas usando pero veo varias cosas que no convencen.

  if (((millis() - tem) >= 500) && (state1 == true) && (state2 == false || state3 == false)) { // Reseteamos estados al pasar 500 ms
    Serial.println("Reset Time");
    Serial.println((millis() - tem));
    state1 = false;
    state2 = false;
    state3 = false;
  }

Este timer solo resetea si estas en estado 1, es decir, solo cuando has recibido una palmada. En algún punto, detecta que hay una palma y entonces
el estado no se reinicia. ¿En algún momento ves un "reset time" por el puerto serie?.

¿Por qué no utilizas el sensor de sonido como si fuera un botón? detectado los
cambios de nivel de LOW a HIGH.

¿No seria más fácil usar un contador? Por ejemplo, "palmadas", cada vez que hay una palmada lo incrementas en uno...

int prevSonido=0, sonido=0;
int palmadas=0;
unsigned long tem;

void loop() {
  sonido = digitalRead(pinMicrofono);
  if ( prevSonido==LOW && sonido==HIGH ) {
    palmadas++;
    if ( palmadas==3 ) {
     // Cambiar bit estado.
 palmadas=0;
    }
  }
  delay(200) // No me gusta este debounce, pero bueno...
  // Reiniciar las palmadas pasado un tiempo.
  if ( millis()-tem >= 500 && palmadas!=0 ) {
    palmadas=0;
  }