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)