.. note::

    ¡Hola! Bienvenidos a la comunidad de entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto con otros apasionados.

    **¿Por qué unirse?**

    - **Soporte de Expertos**: Soluciona problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
    - **Aprende y Comparte**: Intercambia consejos y tutoriales para mejorar tus habilidades.
    - **Avances Exclusivos**: Accede anticipadamente a anuncios de nuevos productos y adelantos.
    - **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
    - **Promociones y Sorteos Festivos**: Participa en sorteos y promociones especiales en días festivos.

    👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy.

3.1.7 Semáforo
=================

Introducción
-------------

En este proyecto, usaremos luces LED de tres colores para simular el cambio 
de luces en un semáforo, y un display de 7 segmentos de cuatro dígitos para 
mostrar la cuenta regresiva de cada estado del semáforo.

Componentes
--------------

.. image:: img/list_Traffic_Light.png
    :align: center

Diagrama de Circuito
-----------------------

============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17       Pin 11   0        17
GPIO27       Pin 13   2        27
GPIO22       Pin 15   3        22
SPIMOSI      Pin 19   12       10
GPIO18       Pin 12   1        18
GPIO23       Pin 16   4        23
GPIO24       Pin 18   5        24
GPIO25       Pin 22   6        25
SPICE0       Pin 24   10       8
SPICE1       Pin 26   11       7
============ ======== ======== ===

.. image:: img/Schematic_three_one7.png
   :align: center

Procedimientos Experimentales
--------------------------------

**Paso 1:** Construye el circuito.

.. image:: img/image254.png
   :width: 800


**Paso 2:** Cambia al directorio.

.. raw:: html

   <run></run>

.. code-block:: 

    cd ~/davinci-kit-for-raspberry-pi/c/3.1.7/

**Paso 3:** Compila.

.. raw:: html

   <run></run>

.. code-block:: 

    gcc 3.1.7_TrafficLight.c -lwiringPi

**Paso 4:** Ejecuta.

.. raw:: html

   <run></run>

.. code-block:: 

    sudo ./a.out

Cuando se ejecuta el código, los LEDs simulan el cambio de color de un semáforo. 
Primero, el LED rojo se enciende durante 60s, luego el LED verde se enciende 
durante 30s; después, el LED amarillo se enciende durante 5s. Al finalizar, 
el LED rojo se enciende nuevamente por 60s, y esta secuencia se repetirá.

.. note::

    Si no funciona después de ejecutar el código, o aparece el mensaje de error: \"wiringPi.h: No such file or directory", consulta :ref:`C code is not working?`.


**Explicación del Código**

.. code-block:: c

    #define     SDI     5 
    #define     RCLK    4  
    #define     SRCLK    1   

    const int placePin[] = {12, 3, 2, 0};
    unsigned char number[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

    void pickDigit(int digit);
    void hc595_shift(int8_t data);
    void clearDisplay();
    void display();

Estos códigos permiten la función de visualización de números en un display de 7 segmentos 
de 4 dígitos. Consulta :ref:`1.1.5 4-Digit 7-Segment Display` para más detalles. Aquí, 
usamos el código para mostrar la cuenta regresiva del tiempo en el semáforo.

.. code-block:: c

    const int ledPin[]={6,10,11};  

    int colorState = 0;

    void lightup()
    {
        for(int i=0;i<3;i++){
            digitalWrite(ledPin[i],HIGH);
        }
        digitalWrite(ledPin[colorState],LOW);    
    }

Este código enciende y apaga los LEDs.

.. code-block:: c

    int greenLight = 30;
    int yellowLight = 5;
    int redLight = 60;
    int colorState = 0;
    char *lightColor[]={"Red","Green","Yellow"};
    int counter = 60;

    void timer(int  timer1){       //Función de temporizador
        if(timer1 == SIGALRM){   
            counter --;         
            alarm(1); 
            if(counter == 0){
                if(colorState == 0) counter = greenLight;
                if(colorState == 1) counter = yellowLight;
                if(colorState == 2) counter = redLight;
                colorState = (colorState+1)%3; 
            }
            printf("counter : %d \t light color: %s \n",counter,lightColor[colorState]);
        }
    }

Este código enciende y apaga el temporizador. Consulta 
:ref:`1.1.5 4-Digit 7-Segment Display` para más detalles. 
Aquí, cuando el temporizador llega a cero, el valor de 
colorState se cambia para encender otro LED y el temporizador 
se reinicia con un nuevo valor.

.. code-block:: c

    void loop()
    {
        while(1){
        display();
        lightup(); 
        }
    }

    int main(void)
    {
        //…
        signal(SIGALRM,timer);  
        alarm(1); 
        loop();
        return 0;
    }

El temporizador se inicia en la función main(). En la función loop(), 
se utiliza un ciclo **while(1)** para llamar a las funciones del display 
de 7 segmentos y de control de los LEDs.

