.. note:: ¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Profundiza en el uso de Raspberry Pi, Arduino y ESP32 junto a otros entusiastas. **¿Por qué unirte?** - **Soporte de Expertos**: Resuelve 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**: Obtén acceso anticipado a anuncios de nuevos productos y adelantos. - **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes. - **Promociones Festivas y Sorteos**: Participa en sorteos y promociones especiales durante las festividades. 👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo. 3.1.7 Semáforo ====================== Introducción ---------------- En este proyecto, utilizaremos luces LED de tres colores para simular el cambio de un semáforo. Además, usaremos una pantalla 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 Esquema ---------------------- ============ ======== ======== === 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 Procedimiento Experimental ---------------------------- **Paso 1:** Construye el circuito. .. image:: img/image254.png :width: 800 **Para Usuarios de C** ^^^^^^^^^^^^^^^^^^^^^^^^^^ **Paso 2:** Cambia al directorio. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/3.1.7/ **Paso 3:** Compila. .. raw:: html .. code-block:: gcc 3.1.7_TrafficLight.c -lwiringPi **Paso 4:** Ejecuta. .. raw:: html .. code-block:: sudo ./a.out Al ejecutar el código, los LEDs simularán el cambio de colores de un semáforo. Primero, se enciende el LED rojo durante 60 segundos, luego el LED verde se enciende durante 30 segundos, y finalmente el LED amarillo se enciende durante 5 segundos. Después, el ciclo vuelve a iniciar con el LED rojo encendido por 60 segundos. Esta secuencia se repetirá continuamente. .. note:: Si no funciona después de ejecutar el programa, o aparece un mensaje de error: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`. **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(); Estas líneas de código permiten realizar la función de visualización de números en una pantalla de 7 segmentos de 4 dígitos. Consulta :ref:`1.1.5_4digit` para más detalles. Aquí, el código muestra la cuenta regresiva del tiempo del 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); } Estas líneas controlan el encendido y apagado de 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]); } } Estas líneas controlan el temporizador. Consulta :ref:`1.1.5_4digit` para más detalles. Cuando el temporizador llega a cero, se cambia el color de `colorState`, activando el LED correspondiente y reasignando un nuevo valor al temporizador. .. 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 usa un ciclo **while(1)** y se llaman las funciones de visualización de la pantalla de 7 segmentos y el control de los LEDs. **Para Usuarios de Python** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Paso 2:** Cambiar de directorio. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python/ **Paso 3:** Ejecutar. .. raw:: html .. code-block:: sudo python3 3.1.7_TrafficLight.py A medida que el código se ejecuta, los LEDs simularán el cambio de colores de un semáforo. Primero, el LED rojo se ilumina durante 60 segundos, luego el LED verde durante 30 segundos; después, el LED amarillo durante 5 segundos. Tras esto, el LED rojo se enciende nuevamente por 60 segundos. Así, esta serie de acciones se ejecutará en un bucle. Mientras tanto, la pantalla de 7 segmentos de 4 dígitos muestra el tiempo de cuenta regresiva de forma continua. **Código** .. note:: Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes, debes dirigirte a la ruta del código fuente como ``davinci-kit-for-raspberry-pi/python``. .. raw:: html .. code-block:: python import RPi.GPIO as GPIO import time import threading # Definir los pines conectados al 74HC595 SDI = 24 # entrada de datos en serie (DS) RCLK = 23 # entrada de reloj de memoria (STCP) SRCLK = 18 # entrada de reloj del registro de desplazamiento (SHCP) number = (0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90) placePin = (10,22,27,17) ledPin =(25,8,7) greenLight = 30 yellowLight = 5 redLight = 60 lightColor=("Red","Green","Yellow") colorState=0 counter = 60 timer1 = 0 def setup(): GPIO.setmode(GPIO.BCM) GPIO.setup(SDI, GPIO.OUT) GPIO.setup(RCLK, GPIO.OUT) GPIO.setup(SRCLK, GPIO.OUT) for pin in placePin: GPIO.setup(pin,GPIO.OUT) for pin in ledPin: GPIO.setup(pin,GPIO.OUT) global timer1 timer1 = threading.Timer(1.0,timer) timer1.start() def clearDisplay(): for i in range(8): GPIO.output(SDI, 1) GPIO.output(SRCLK, GPIO.HIGH) GPIO.output(SRCLK, GPIO.LOW) GPIO.output(RCLK, GPIO.HIGH) GPIO.output(RCLK, GPIO.LOW) def hc595_shift(data): for i in range(8): GPIO.output(SDI, 0x80 & (data << i)) GPIO.output(SRCLK, GPIO.HIGH) GPIO.output(SRCLK, GPIO.LOW) GPIO.output(RCLK, GPIO.HIGH) GPIO.output(RCLK, GPIO.LOW) def pickDigit(digit): for i in placePin: GPIO.output(i,GPIO.LOW) GPIO.output(placePin[digit], GPIO.HIGH) def timer(): # función de temporizador global counter global colorState global timer1 timer1 = threading.Timer(1.0,timer) timer1.start() counter-=1 if (counter is 0): if(colorState is 0): counter= greenLight if(colorState is 1): counter=yellowLight if (colorState is 2): counter=redLight colorState=(colorState+1)%3 print ("counter : %d color: %s "%(counter,lightColor[colorState])) def lightup(): global colorState for i in range(0,3): GPIO.output(ledPin[i], GPIO.HIGH) GPIO.output(ledPin[colorState], GPIO.LOW) def display(): global counter a = counter % 10000//1000 + counter % 1000//100 b = counter % 10000//1000 + counter % 1000//100 + counter % 100//10 c = counter % 10000//1000 + counter % 1000//100 + counter % 100//10 + counter % 10 if (counter % 10000//1000 == 0): clearDisplay() else: clearDisplay() pickDigit(3) hc595_shift(number[counter % 10000//1000]) if (a == 0): clearDisplay() else: clearDisplay() pickDigit(2) hc595_shift(number[counter % 1000//100]) if (b == 0): clearDisplay() else: clearDisplay() pickDigit(1) hc595_shift(number[counter % 100//10]) if(c == 0): clearDisplay() else: clearDisplay() pickDigit(0) hc595_shift(number[counter % 10]) def loop(): while True: display() lightup() def destroy(): # Cuando se presiona "Ctrl+C", la función se ejecuta. global timer1 GPIO.cleanup() timer1.cancel() # cancelar el temporizador if __name__ == '__main__': # El programa comienza aquí setup() try: loop() except KeyboardInterrupt: destroy() **Explicación del Código** .. code-block:: python SDI = 24 # entrada de datos en serie (DS) RCLK = 23 # entrada de reloj de memoria (STCP) SRCLK = 18 # entrada de reloj del registro de desplazamiento (SHCP) number = (0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90) placePin = (10,22,27,17) def clearDisplay(): def hc595_shift(data): def pickDigit(digit): def display(): Estos códigos se utilizan para implementar la función de visualización numérica de una pantalla de 7 segmentos de 4 dígitos. Consulte :ref:`1.1.5_4digit` en el documento para obtener más detalles. Aquí, usamos el código para mostrar la cuenta regresiva del semáforo. .. code-block:: python ledPin =(25,8,7) colorState=0 def lightup(): global colorState for i in range(0,3): GPIO.output(ledPin[i], GPIO.HIGH) GPIO.output(ledPin[colorState], GPIO.LOW) Estos códigos se usan para encender y apagar el LED. .. code-block:: python greenLight = 30 yellowLight = 5 redLight = 60 lightColor=("Red","Green","Yellow") colorState=0 counter = 60 timer1 = 0 def timer(): # función de temporizador global counter global colorState global timer1 timer1 = threading.Timer(1.0,timer) timer1.start() counter-=1 if (counter is 0): if(colorState is 0): counter= greenLight if(colorState is 1): counter=yellowLight if (colorState is 2): counter=redLight colorState=(colorState+1)%3 print ("counter : %d color: %s "%(counter,lightColor[colorState])) Los códigos se usan para controlar el temporizador. Consulte :ref:`1.1.5_4digit` para obtener más detalles. Aquí, cuando el temporizador llega a cero, `colorState` cambiará para alternar el LED, y el temporizador se asignará a un nuevo valor. .. code-block:: python def setup(): # ... global timer1 timer1 = threading.Timer(1.0,timer) timer1.start() def loop(): while True: display() lightup() def destroy(): # Cuando se presiona "Ctrl+C", se ejecuta la función. global timer1 GPIO.cleanup() timer1.cancel() # cancelar el temporizador if __name__ == '__main__': # El programa comienza aquí setup() try: loop() except KeyboardInterrupt: destroy() En la función setup(), se inicia el temporizador. En la función loop(), se utiliza un bucle ``while True`` para llamar repetidamente a las funciones relacionadas con la pantalla de 7 segmentos de 4 dígitos y el LED. Imagen del Resultado ------------------------- .. image:: img/IMG_8319.jpg :width: 800 :align: center