Ejecutar un código una vez con entrada HIGH

Hola! Soy Fede, estuve buscando previamente en el foro la forma de detener un bucle while y encontre "break" lo cual funciono, pero no es lo que esperaba.
Lo que intento hacer es que una lavadora encienda un par de bombas por unos segundos y luego se detenga, pero la lavadora tiene una tapa que cuando se cierra se acciona un pulsador que queda siempre en modo "HIGH" por lo que nunca para de lavar, se repite el proceso.
Disculpen mi ignorancia pero recien comienzo con esto, que posibilidades hay de detener el codigo sin que se repita mientras el pulsador este en "HIGH"
PD: Con respecto a "delay", conozco los contras pero no estoy empapado con millis asique ya que es solo temporizar el funcionamiento de las bombas use delay.
Adjunto el codigo

int pulsador; 
const int pinBuzzer = 13 ;
// const int lavadO = 4; //d2
// const int enjuaguE = 5; //d1

void setup() { 

pinMode(2,INPUT);      // botón de entrada, conectado por defecto a GND 
pinMode(4, OUTPUT); //bomba lavado
pinMode(5, OUTPUT); //bomba enjuague
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);   
    toque(); 
} 

void loop() {} 

void toque() { 
  
 
    while (pulsador == LOW) { 

        if (digitalRead(2) == LOW) {     // pulsado el botón 

             tone(pinBuzzer, 3700);
             delay(300);
              noTone(pinBuzzer);
            delay(1000);
            
            digitalWrite(4, LOW);
            digitalWrite(5, LOW);
            delay(5000);
            digitalWrite(4, HIGH);
            digitalWrite(5, HIGH);

            
            tone(pinBuzzer, 3700);
            delay(400);
            noTone(pinBuzzer);
            delay(400);
            tone(pinBuzzer, 3700);
            delay(400);
            noTone(pinBuzzer);
          
             pulsador = LOW; 
             
        } 
   
    } 
}

Muchas Gracias y disculpen si el tema esta repetido.

Por defecto la variable pulsador está en 0 (que se interpreta como LOW) y nunca cambia el valor, por eso nunca sale del while().

No llego a entender bien cual es tu idea, pero creo que lo que necesitas es algo así

int pulsador; 
const int pinBuzzer = 13 ;
// const int lavadO = 4; //d2
// const int enjuaguE = 5; //d1

void setup() { 

pinMode(2,INPUT);      // botón de entrada, conectado por defecto a GND 
pinMode(4, OUTPUT); //bomba lavado
pinMode(5, OUTPUT); //bomba enjuague
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);   
    toque(); 
} 

void loop() {} 

void toque() { 
  
 
    while (pulsador == LOW) { 

        pulsador = digitalRead(2);

        if (pulsador == LOW) {     // pulsado el botón 

            tone(pinBuzzer, 3700);
            delay(300);
            noTone(pinBuzzer);
            delay(1000);
            
            digitalWrite(4, LOW);
            digitalWrite(5, LOW);
            delay(5000);
            digitalWrite(4, HIGH);
            digitalWrite(5, HIGH);

            
            tone(pinBuzzer, 3700);
            delay(400);
            noTone(pinBuzzer);
            delay(400);
            tone(pinBuzzer, 3700);
            delay(400);
            noTone(pinBuzzer);
          
//             pulsador = LOW;   
// es redundante porque ya está en LOW
             
        } 
   
    } 
}

PD: Edita el título de tu post, tiene que ser descriptivo del problema y nunca incluir la palabra "Ayuda", ver Normas del foro. Saludos

Gatul muchas gracias por responder, modifique el título, gracias por la aclaración.

Con respecto al código, probé eso que me sugeris pero sigue en la misma situación ya que el INPUT sigue activo, la tapa de la lavadora es la que da la orden, por lo que al terminar el lavado..vuelve a repetirse el proceso porque la tapa sigue enviando la señal y el bucle se vuelve a repetir.
Me explico?
Muchas gracias

Entonces vamos por partes así te entiendo mejor.

Si el pulsador de la tapa está en el pin 2 (eso es lo que yo interpreté) y la secuencia en la rutina toque() sólo se tiene que ejecutar 1 sola vez el error es justamente el lazo while() porque haces repetir la secuencia mientras la tapa está cerrada y el pulsador en LOW.

Lo lógico sería eliminar el lazo ya que solo se tendría que ejecutar 1 vez.

Eso si es que te estoy interpretando bien, reitero.

Edito: No, no estaba interpretando bien.
El pin 2 se pone en HIGH con la tapa cerrada, entonces tu secuencia solo se ejecuta con la tapa abierta.
Por favor pon el resto del código porque ese fragmento que has puesto no alcanza para ver el problema.

El código que adjunte es todo, me queda agregar tiempos de lavado pero no va al caso.
Es así, cuando la tapa baja, un reed switch cierra el circuito (está invertido..low es high).
Recien hice la prueba, me quedo así:

  int pulsador; 
  const int pinBuzzer = 13 ;
  // const int lavadO = 4; //d2
  // const int enjuaguE = 5; //d1
  
  void setup() { 
  
  pinMode(2,INPUT);      // botón de entrada, conectado por defecto a GND 
  pinMode(4, OUTPUT); //bomba lavado
  pinMode(5, OUTPUT); //bomba enjuague
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);   
     // toque(); 
  } 
  
  void loop() { 
  
//  void toque() { 
    
      
    //  while (pulsador == LOW) { 
         
          if (digitalRead(2) == LOW) {     // pulsado el botón 

              tone(pinBuzzer, 3700);
              delay(300);
              noTone(pinBuzzer);
              delay(1000);
              
              digitalWrite(4, LOW);
              digitalWrite(5, LOW);
              delay(5000);
              digitalWrite(4, HIGH);
              digitalWrite(5, HIGH);
  
              
              tone(pinBuzzer, 3700);
              delay(400);
              noTone(pinBuzzer);
              delay(400);
              tone(pinBuzzer, 3700);
              delay(400);
              noTone(pinBuzzer);
              delay(500);
              
                         
        // pulsador = LOW; 
                
        //  } 
 
     } 
  }

Pero hace lo mismo, termina la secuencia y como la tapa sigue cerrada, vuelve a repetirse (porque estan en loop, lo hice estando en void toque y tampoco funciono, no me detecta nada)
Para que esto no suceda la persona que lava debe de abrir la tapa apenas termina el ciclo para que no se repita, que es lo que quiero evitar.

Pero ahora lo pusiste en el loop() antes lo llamabas desde setup(), además te había hecho un cambio en la lectura del pulsador (igual es lo de menos)

Una manera poco elegante es agregar al final

while (digitalRead(2) == LOW);

Así queda esperando hasta que abran la puerta.

Lo que no entiendo es, ¿si el reed switch manda HIGH por qué hace el lavado cuando está en LOW?

Voy a probar con el while al final, si, probé desde el setup pero no hace nada..inmutable.

No sé porque está invertido, si envío la orden digitalWrite HIGH queda apagada la salida..si envío digitalWrite LOW, enciende...no se porque..será porque uso Wemos mini?
Gracias por la dedicación.

Funciono perfecto con While, tuve que agregarle un par de cosas para que realmente se quedara dentro del mismo, de todas maneras me parece que hay un poco de ruido electrico por las cargas inductivas del motor porque la entrada no siempre es constante, voy a hacerle debounce y a ponerle un par de filtros.
A modo de anecdota, nunca pude usar arduino uno por ejemplo para controlar motores grandes (con rele y contactor) el ruido electrico al encender llegaba a la fuente de alimentacion por ende se descontrolaba todo! Pero en el caso de wemos nunca un problema, inclusive usando control por wifi y demas.

Gatul muchas gracias por tu ayuda, me has solucionado un literal dolor de cabeza.

Dejo el codigo por si alguien le sirve.

int pulsador; 
const int pinBuzzer = 13 ;
// const int lavadO = 4; //d2
// const int enjuaguE = 5; //d1

void setup() { 

pinMode(2,INPUT);      // botón de entrada, conectado por defecto a GND 
pinMode(4, OUTPUT); //bomba lavado
pinMode(5, OUTPUT); //bomba enjuague
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);   
    toque(); 
} 

void loop() {} 

 void toque() { 
  
 
    while (pulsador == LOW) { 

        if (digitalRead(2) == LOW) {     // pulsado el botón 

            tone(pinBuzzer, 3700);
            delay(300);
            noTone(pinBuzzer);
            delay(1000);
            
            digitalWrite(4, LOW);
            digitalWrite(5, LOW);
            delay(5000);
            digitalWrite(4, HIGH);
            digitalWrite(5, HIGH);

            
            tone(pinBuzzer, 3700);
            delay(400);
            noTone(pinBuzzer);
            delay(400);
            tone(pinBuzzer, 3700);
            delay(400);
            noTone(pinBuzzer);
            
 while (digitalRead(2) == LOW) {
            tone(pinBuzzer, 3700);
            delay(800);
            noTone(pinBuzzer);
            delay(800);
  }
       
          
             
        } 
     
    } 
}

Solucionado!

Yo creo que no esta solucionado por varias razones que ahora no visualizas.
Lo mejor es que sigas en este hilo haciendo tus consultas porque es obvio que tendras muchas mas.
El principal problema que tienes es que usas delay() y ahora te funciona bien pero luego verás que no será el caso.
Te recomiendo leas en Documentación => Indice de temas Tutoriales => millis() y tambien lee máquina de estados.
Indice de temas Tutoriales
Para ir comprendiendo como debes trabajar.
Te va a provocar otro dolor de cabeza entenderlo pero a la larga veras que será muy bueno.