If se queda en bucle y no me detecta entrada(boton )

Hola pido ayuda para tratar de entender el por qué mi código no obedece a la entrada(botón) y ejecuta el código quedándose en bucle.

const int buzzer = 3;
const int boton = 4;
int estbt = 0;

void setup()
{
Serial.begin(9600);
pinMode(boton, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
}
void loop()
 {
estbt = digitalRead(boton);
if(estbt == HIGH){
  Serial.println("detecto");
  estbt =0;
  delay(100);
  if(estbt == LOW)
  {
     Serial.println("pulsado");
     delay(3000);
     tone(buzzer, 550, 550);
     Serial.println("reseteando");
    }
}
}

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Moderador:
Por favor, lee las Normas del foro
Si posteas en el foro en inglés usa idioma inglés para expresarte.
Si escribes en español debes usar el foro Arduino en español.

Revisa si funciona

const int buzzer  = 3;
const int boton   = 4;
const int led        =  5;

bool estbt, estbtAnt = 1;
int estado, estadoAnt = 0;
unsigned long t;

void setup() {
  Serial.begin(9600);
  pinMode(boton, INPUT_PULLUP);
  pinMode(buzzer, OUTPUT);
  Serial.println("Iniciando.");
}

void loop()  {
  
  estbt = digitalRead(boton);
  if (estbt && !estbtAnt){
      Serial.println("Pulsado");
      estado = !estado;
      if (estado)
          t = millis();
      delay(10);
  }
  //if (estbt != estbtAnt ) {
  //    Serial.println(estbt?"Activo":"Apagado");
  //}  
  estbtAnt = estbt;

  if (estado) {
      if (millis() - t > 3000UL) {
        tone(buzzer, 550, 550);
        Serial.println("Apagando");
        estado = 0;  
      }
  }
  if (estado != estadoAnt ) {
      Serial.println(estado?"Activo":"Apagado");
      digitalWrite(led, estado);
  }
  estadoAnt = estado;
}

@Surbyte si me funciona el código gracias, como puedo aprender a usar las técnicas que usaste para que no entrara en bucle y gracias nuevamente.

Esto que hice funciona siempre y cuando no haya rebote (en realidad simpre lo hay) o es tal que no afecta el control que acabo de mostrarte.
No expliqué nada porque quería que lo probaras y si funciona, ahora si te lo explico.
Lo que hice fue mira el cambio de flancos.
Observa esta instrucción

estbt = digitalRead(boton);
  if (estbt && !estbtAnt){

es lo mismo que

estbt = digitalRead(boton);
  if (estbt == HIGH && estbtAnt == LOW){

Aca lo que busco es que el estado del pulsador pase de LOW valor anterior almacenado en estbtAnt a HIGH cuando lees el estado actual con estbt.
Entonces cada vez que el pulsador pasa de LOW a HIGH, tu cambias una variable que llamé
estado entre 0 y 1
Siempre con !estado le estoy negando el estado que tiene almacenado.
Si tiene 0 => !0 = 1 si tiene 1 => !1 = 0
es lo mismo que decir Niego a 0 = 1 o Niego a 1 = 0 pero en terminos de algebra de booles se escribe NOT 0 = 1 o NOT 1 = 0.
Solo para que quede bien claro.
El truco entonces es que por cada variable con la que lees un botón agregas otra variable con el valor ultimo que tuvo y la llamo Anterior o Ant.
Y la actualizo luego de hacer las consultas o al final del loop. Por orden yo lo hago cuando termino todos los if o condicionales que use la variable anterior.
Y se acabó.

Pero hay algo mas.
No uso delay y mira como lo escribo. Delay detiene todo código y si le pones algo como delay(3000) se quedará de brazós cruzados el arduino por 3 segundos.
Asi que millis() se encarga de eso.
Qué es milllis()? Ve a documentación y lee al respecto hay excelentes tutoriales de lo que he hecho ahi.
Pero basicamente no he detenido el flujo del loop, el mismo sigue funcionando y atento a TODO lo que hagas. Pulsaciones, cambios, etc.
Ves que si uso un delay(10) porque en la simulación no me funcionaba bien.
Prueba si puedes prescindir de el.

@Surbyte como puedo evitar el rebote del botón una ves lo presione?

Usando una rutina antirebote como Bounce2.h
También está en el IDE (administador de librerías con ese nombre).