Duda sobre while (fácil)

Esta es una versión que espero funcione donde uso dos máquinas de estado y millis().
También defino todas las contastantes con etiquetas para una fácil lectura e interpretación.
Aunque como bien dice @anon90500195 el ejercicio tolera el uso de delay() les aconsejo olvidarlo porque les dará mas problemas que soluciones.
Usar millis() y máquinas de estado es mas complicado al comienzo pero cuando hacen el click mental luego suerge fácil.
En Documentación y tutoriales se explica que es una máquina de estados y tmb como usar millis(). Vayan y leanlo para luego entender esto.
Espero funcione.

#define VERDE     5
#define AMBAR     6
#define ROJO      7
#define PULSADOR  8
#define ZUMBADOR  4

int estado_pulsador, estado_pulsadorAnt = 0;
int inicioAccion = 0, inicioZumbador = 0;
unsigned long inicioDelay, inicioZumbaDelay;

void zumbador() {
  switch (inicioZumbador) {
    case 0: digitalWrite(ZUMBADOR, HIGH);
            inicioZumbador = 1;
            inicioZumbaDelay = millis();
            break;
    case 1: if (millis() - inicioZumbaDelay > 1000UL) {
                digitalWrite(ZUMBADOR, LOW);
                inicioZumbador = 2; 
            }
            break;
    case 2: if (millis() - inicioZumbaDelay > 1000UL) {
                inicioZumbador = 0; 
            }
            break;
  }
}
void setup() {
  pinMode(VERDE, OUTPUT); // marcar como salida el led verde
  pinMode(AMBAR, OUTPUT); // marcar como salida el led ámbar
  pinMode(ROJO, OUTPUT); // marcar como salida el led rojo
  pinMode(PULSADOR, INPUT); // marcar como entrada el pulsador
  pinMode(ZUMBADOR, OUTPUT); // marcar como salida el zumbador
}
void loop() {
  digitalWrite (VERDE, HIGH);
  int estado_pulsador = digitalRead (PULSADOR); // declaramos una variable con el estado del pulsador
  if (estado_pulsador && !estado_pulsadorAnt) {  // si el pulsador es pulsado, realiza la siguiente acción
      inicioAccion = 0;
  }
  switch (inicioAccion) {
    case 0: digitalWrite(VERDE, LOW);   //  se apaga el led verde para los coches
            digitalWrite(AMBAR, HIGH);  // empieza el amarillo, avisando de que cambiará a rojo
            inicioAccion = 1;
            inicioDelay = millis();
            break;
    case 1: if (millis() - inicioDelay > 3000UL) {
                digitalWrite(AMBAR, LOW);
               digitalWrite(ROJO, HIGH);   // se enciende el rojo
                inicioDelay = millis();
                inicioZumbador = 0;
                inicioAccion = 2;
            }
            break;
    case 2: if (millis() - inicioDelay > 30000UL) {
                digitalWrite(ROJO, LOW);   // se apaga el led ROJO
                digitalWrite(ZUMBADOR, LOW); // me aseguro que el zumbador quede apagado.
                inicioAccion = 3;   // no repito mas hasta que se presione de nuevo el pulsador
            }
            else {  // aca hago la acción del zumbador
                  zumbador();
            }
            break;
    case 3: // se queda aca sin hacer mas nada la máquina de estados.
            break;
  }     
}

Moderador:
Qué raro esto: dos temas similares al mismo tiempo.
[Semáforo con botón peatonal (para pasar)](Semaforo con boton peatonal para pasar)