Como "esperar" un tiempo antes de dar un valor a una variable??

Hola buen día.... tengo un detalle, tengo un tablero de control y ahora necesito que un boton pueda cambiar el comportamiento.

Controla dos ventiladores indivualmente, un compresor.

Digamos que uso un solo boton para manter esto lo mas simple posible entonces, en mi loop principal tengo alggo asi;

void loop() 
{

//--------- Changue behavior according the button press
      if(button > 6) button = 0;
      
      switch(button) 
          {
          case 0: defaultProgram();  break;
          case 1: allOff();         break;// turn off all the refrigerattion
          case 2: defrost();        break;
          case 3: fan1On();         break;
          case 4: fan2On();         break;
          case 5: compOn();         break; 
          }

}

Entonces digamos que hago que el boton solo cambie o incremente de variable al dejarlo oprimido por... digamos 200ms (medio largo para que no haya errores).

Y lo que necesito hacer es;

presiono boton
espero 200ms
la variable botton se incrementa en 1
Esperar digamos 3 segundos
Dar el valor a el swtich case

La idea de hacerlo asi es para que si yo quiero hacer algo en especifico
como encender un ventilador o algo asi, no tenga que encender o apagar
todo lo demas...

Muchas gracias.
-Alex

Usa millis(). Si ya lo has hecho, cual es la duda?

Yo haría otra cosa para un menú de un solo botón:

Do{
Esperar a que pulse
A= millis()
Esperar a que suelte el botón
B=millis
C=B-A
¿C < 200?{
Entonces incrementa button
}
}mientras C <200

Switch (button)
{
… Aquí las acciones
}

Espero que se entienda esta especie de pseudocodigo

Lo mas lindo es que hay un código de AlexLPD que hace exactamente lo que esta preguntado.