Actividad 5

 

Incluir aviso sonoro en uno de los semáforos

En esta actividad el objetivo es utilizar el zumbador pasivo para generar un aviso sonoro que acompañe el encendido del LED Verde de uno de los Semáforos de Peatones. Vamos a mantener el funcionamiento codificado en la Actividad anterior, es decir, cambiar de estado los Semáforos cuando se solicite con los Pulsadores. Necesitarás:

  • 1 x Zumbador pasivo.

El montaje debe ser como se ve en la imagen a continuación:


 

 

Las conexiones con la placa programable son las siguientes:

  • Zumbador: Pin 11.

Debemos modificar el código para que el zumbador genere un tono periódicamente mientras, por ejemplo, el Semáforo de Peatones que enciende en Verde en el ESTADO 1 del diagrama planteado anteriormente se mantenga encendido, o avisando de que el Semáforo de Peatones 2 va a cambiar a rojo.

Recuerda que para utilizar un Zumbador (en un Pin configurado como salida previamente), debemos emplear la siguiente función para generar tonos o sonidos:

tone(pin, frecuencia, duración);

donde "pin" es el número del Pin donde tenemos conectado el Zumbador, "frecuencia" es la frecuencia del tono generado (a mayor frecuencia obtenemos un sonido más agudo) y "duración" son los milisegundos que deseamos que dure el sonido emitido.
Hasta ahora hemos utilizado la función delay para hacer pausas en nuestros códigos. Sin embargo, estas pausas no siempre son idóneas para nuestro proyecto por los requisitos de funcionamiento que debemos cumplir.
La función millis nos ofrece una manera de realizar tareas o realizar pausas de una manera alternativa, sin detener por completo la ejecución del código. Esta función devuelve el número de milisegundos que la placa programable lleva encendida. Esto puede utilizarse para codificar pausas de una manera diferente, como se muestra a continuación:

unsigned long marcaTemporal = millis();

while((millis() - marcaTemporal) < 1000) {

    // Líneas ejecutables

}
 
Vemos como en el ejemplo utilizamos el bucle while en combinación con la función millis. Este fragmento de código nos permite esperar durante un tiempo de 1000 milisegundos mientras es posible que se lleguen a ejecutar algunas instrucciones. De esta manera, no detenemos el código por completo, sino hacemos una pausa que nos permite seguir haciendo comprobaciones y otras tareas que nos interesen, entre ellas podemos utilizar el propio delay.

int pinLedRojoCoches1 = 10; // Pin del LED Rojo del Módulo de 3 LED 1
int pinLedAmarilloCoches1 = 9; // Pin del LED Amarillo del Módulo de 3 LED 1
int pinLedVerdeCoches1 = 8; // Pin del LED Verde del Módulo de 3 LED 1

int pinLedRojoCoches2 = 5; // Pin del LED Rojo del Módulo de 3 LED 2
int pinLedAmarilloCoches2 = 4; // Pin del LED Amarillo del Módulo de 3 LED 2
int pinLedVerdeCoches2 = 3; // Pin del LED Verde del Módulo de 3 LED 2

int pinLedVerdePeatones1 = 7; // Pin del LED Verde del Módulo de 2 LED 1
int pinLedRojoPeatones1 = 6; // Pin del LED Rojo del Módulo de 2 LED 1

int pinLedRojoPeatones2 = 13; // Pin del LED Rojo del Módulo de 2 LED 2
int pinLedVerdePeatones2 = 12; // Pin del LED Verde del Módulo de 2 LED 2

int pinPulsador1 = A0; // Pin del Pulsador 1 para controlar configuración 1
int pinPulsador2 = A1; // Pin del Pulsador 2 para controlar configuración 2

int pinZumbador = 11; // Pin del Zumbador

void configurarSemaforos(bool configuracion) {

    // Primera configuración de los semáforos (ESTADO 1)
    if(configuracion == false) {

        // Configuramos el estado del primer semáforo
        digitalWrite(pinLedRojoCoches1, HIGH);
        digitalWrite(pinLedAmarilloCoches1, LOW);
        digitalWrite(pinLedVerdeCoches1, LOW);
        digitalWrite(pinLedRojoPeatones1, LOW);
        digitalWrite(pinLedVerdePeatones1, HIGH);

        // Configuramos el estado del segundo semáforo
        digitalWrite(pinLedRojoCoches2, LOW);
        digitalWrite(pinLedAmarilloCoches2, LOW);
        digitalWrite(pinLedVerdeCoches2, HIGH);
        digitalWrite(pinLedRojoPeatones2, HIGH);
        digitalWrite(pinLedVerdePeatones2, LOW);

    } else { // (ESTADO 3)

        // Configuramos el estado del primer semáforo
        digitalWrite(pinLedRojoCoches1, LOW);
        digitalWrite(pinLedAmarilloCoches1, LOW);
        digitalWrite(pinLedVerdeCoches1, HIGH);
        digitalWrite(pinLedRojoPeatones1, HIGH);
        digitalWrite(pinLedVerdePeatones1, LOW);

        // Configuramos el estado del segundo semáforo
        digitalWrite(pinLedRojoCoches2, HIGH);
        digitalWrite(pinLedAmarilloCoches2, LOW);
        digitalWrite(pinLedVerdeCoches2, LOW);
        digitalWrite(pinLedRojoPeatones2, LOW);
        digitalWrite(pinLedVerdePeatones2, HIGH);

    }

}

void transicionSemaforos(bool transicion) {

    // Primera configuración de los semáforos (ESTADO 2)
    if(transicion == false) {

        // Configuramos el estado del primer semáforo
        digitalWrite(pinLedRojoCoches1, HIGH);
        digitalWrite(pinLedAmarilloCoches1, LOW);
        digitalWrite(pinLedVerdeCoches1, LOW);
        digitalWrite(pinLedRojoPeatones1, LOW);
        digitalWrite(pinLedVerdePeatones1, HIGH);

        // Configuramos el estado del segundo semáforo
        digitalWrite(pinLedRojoCoches2, LOW);
        digitalWrite(pinLedAmarilloCoches2, HIGH);
        digitalWrite(pinLedVerdeCoches2, LOW);
        digitalWrite(pinLedRojoPeatones2, HIGH);
        digitalWrite(pinLedVerdePeatones2, LOW);

    } else { // (ESTADO 4)

        // Configuramos el estado del primer semáforo
        digitalWrite(pinLedRojoCoches1, LOW);
        digitalWrite(pinLedAmarilloCoches1, HIGH);
        digitalWrite(pinLedVerdeCoches1, LOW);
        digitalWrite(pinLedRojoPeatones1, HIGH);
        digitalWrite(pinLedVerdePeatones1, LOW);

        // Configuramos el estado del segundo semáforo
        digitalWrite(pinLedRojoCoches2, HIGH);
        digitalWrite(pinLedAmarilloCoches2, LOW);
        digitalWrite(pinLedVerdeCoches2, LOW);
        digitalWrite(pinLedRojoPeatones2, LOW);
        digitalWrite(pinLedVerdePeatones2, HIGH);

    }

}

// Variable para conocer el ESTADO en el que se encuentran los semáforos
int estado = 0;

void setup() {

    // Configurar el modo de funcionamiento de los pines de los LEDs
    pinMode(pinLedRojoCoches1, OUTPUT);
    pinMode(pinLedAmarilloCoches1, OUTPUT);
    pinMode(pinLedVerdeCoches1, OUTPUT);

    pinMode(pinLedRojoCoches2, OUTPUT);
    pinMode(pinLedAmarilloCoches2, OUTPUT);
    pinMode(pinLedVerdeCoches2, OUTPUT);

    pinMode(pinLedRojoPeatones1, OUTPUT);
    pinMode(pinLedVerdePeatones1, OUTPUT);

    pinMode(pinLedRojoPeatones2, OUTPUT);
    pinMode(pinLedVerdePeatones2, OUTPUT);

    // Establecer el modo de funcionamiento de los pines de los pulsadores
    pinMode(pinPulsador1, INPUT);
    pinMode(pinPulsador2, INPUT);

    // Establecer el modo de funcionamiento de los pines del zumbador
    pinMode(pinZumbador, OUTPUT);

    // Establecer estado por defecto de los pines de los LEDs en (ESTADO 1)
    digitalWrite(pinLedRojoCoches1, HIGH);
    digitalWrite(pinLedAmarilloCoches1, LOW);
    digitalWrite(pinLedVerdeCoches1, LOW);

    digitalWrite(pinLedRojoCoches2, LOW);
    digitalWrite(pinLedAmarilloCoches2, LOW);
    digitalWrite(pinLedVerdeCoches2, HIGH);

    digitalWrite(pinLedRojoPeatones1, LOW);
    digitalWrite(pinLedVerdePeatones1, HIGH);

    digitalWrite(pinLedRojoPeatones2, HIGH);
    digitalWrite(pinLedVerdePeatones2, LOW);

    estado = 1;

}

void loop() {

    if((digitalRead(pinPulsador1) == HIGH) && (digitalRead(pinPulsador2) == LOW)) {
        if(estado == 3) {

            // Pasamos al estado de transición 2 durante 1 segundo
            transicionSemaforos(true);
            delay(1000);

            // Configuramos los Semáforos en el ESTADO 1
            configurarSemaforos(false);
            estado = 1;

        }
    }

    if((digitalRead(pinPulsador2) == HIGH) && (digitalRead(pinPulsador1) == LOW)) {
        if(estado == 1) {

            // Pasamos al estado de transición 1 durante 2 segundos
            transicionSemaforos(false);

            // Guardamos el momento en que llegamos a este punto para hacer la pausa necesaria
            unsigned long comienzoTransicion = millis();

            // Nos mantenemos ejecutando el tone y un pequeño delay hasta que pasen 2 segundos
            while((millis() - comienzoTransicion) < 2000) {

                // Generamos el tono del zumbador y esperamos medio segundo
                tone(pinZumbador, 2000, 100);
                delay(500);

            }

            // Configuramos los Semáforos en el ESTADO 3
            configurarSemaforos(true);
            estado = 3;

        }
    }

}

91% Completado
Vistas
2 Número de vistas
2 Vistas de miembros
0 Vistas públicas
Acciones
0 Gustos
0 No me gusta
0 Comentarios
Compartir en redes sociales
Compartir enlace
Compartir por correo

Por favor iniciar sesión para compartir esto webpage por correo.