.. note::

    Hola, ¡bienvenido 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 con otros entusiastas.

    **¿Por qué unirse?**

    - **Soporte experto**: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
    - **Aprender y compartir**: Intercambia consejos y tutoriales para mejorar tus habilidades.
    - **Previews exclusivos**: Accede anticipadamente a anuncios de nuevos productos y adelantos exclusivos.
    - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
    - **Promociones festivas y sorteos**: Participa en sorteos y promociones especiales.

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

.. _1.1.5_py:

1.1.5 Pantalla de 7 Segmentos de 4 Dígitos
==============================================

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

A continuación, sigue conmigo para intentar controlar la pantalla de 7 segmentos de 4 dígitos.

Componentes necesarios
---------------------------------

En este proyecto, necesitamos los siguientes componentes. 

.. image:: ../img/list_4_digit.png

Es definitivamente conveniente comprar un kit completo, aquí está el enlace: 

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Nombre	
        - ITEMS IN THIS KIT
        - LINK
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

También puedes comprarlos por separado en los enlaces a continuación.

.. list-table::
    :widths: 30 20
    :header-rows: 1

    *   - INTRODUCCIÓN AL COMPONENTE
        - ENLACE DE COMPRA

    *   - :ref:`cpn_gpio_extension_board`
        - |link_gpio_board_buy|
    *   - :ref:`cpn_breadboard`
        - |link_breadboard_buy|
    *   - :ref:`cpn_wires`
        - |link_wires_buy|
    *   - :ref:`cpn_resistor`
        - |link_resistor_buy|
    *   - :ref:`cpn_4_digit`
        - \-
    *   - :ref:`cpn_74hc595`
        - |link_74hc595_buy|

Diagrama Esquemático
--------------------------

============== ====== ======== ===
Nombre T-Board Físico 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
============== ======= ======== ===

.. image:: ../img/schmatic_4_digit.png


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

**Paso 1**: Monta el circuito.

.. image:: ../img/image80.png

**Paso 2:** Ve a la carpeta del código.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python/

**Paso 3:** Ejecuta el archivo.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.1.5_4-Digit.py

Después de ejecutar el código, el programa realiza un conteo, aumentando en 1 cada segundo, y la pantalla de 4 dígitos muestra el conteo.

**Código**

.. note::

    Puedes **Modificar/Resetear/Copiar/Ejecutar/Detener** el código a continuación. Pero antes, necesitas ir a la ruta del código fuente como ``raphael-kit/python``. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.

.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import time
    import threading

    SDI = 24
    RCLK = 23
    SRCLK = 18

    placePin = (10, 22, 27, 17)
    number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)

    counter = 0
    timer1 = 0

    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():  
        global counter
        global timer1
        timer1 = threading.Timer(1.0, timer) 
        timer1.start()  
        counter += 1
        print("%d" % counter)

    def loop():
        global counter                    
        while True:
            clearDisplay() 
            pickDigit(0)  
            hc595_shift(number[counter % 10])

            clearDisplay()
            pickDigit(1)
            hc595_shift(number[counter % 100//10])

            clearDisplay()
            pickDigit(2)
            hc595_shift(number[counter % 1000//100])

            clearDisplay()
            pickDigit(3)
            hc595_shift(number[counter % 10000//1000])

    def setup():
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(SDI, GPIO.OUT)
        GPIO.setup(RCLK, GPIO.OUT)
        GPIO.setup(SRCLK, GPIO.OUT)
        for i in placePin:
            GPIO.setup(i, GPIO.OUT)
        global timer1
        timer1 = threading.Timer(1.0, timer)  
        timer1.start()       

    def destroy():   # When "Ctrl+C" is pressed, the function is executed.
        global timer1
        GPIO.cleanup()
        timer1.cancel()  # cancel the timer

    if __name__ == '__main__':  
        setup()
        try:
            loop()
        except KeyboardInterrupt:
            destroy()

**Explicación del Código**

.. code-block:: python

    placePin = (10, 22, 27, 17)

Estos cuatro pines controlan los pines de ánodo común de las pantallas de 7 segmentos de cuatro dígitos.

.. code-block:: python

    number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)

Un arreglo de códigos de segmento del 0 al 9 en hexadecimal (ánodo común).

.. code-block:: python

    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) 

Escribe "1" ocho veces en SDI, para que los ocho LEDs en la pantalla de 7 segmentos se apaguen y así borrar el contenido mostrado.

.. code-block:: python

    def pickDigit(digit):
        for i in placePin:
            GPIO.output(i,GPIO.LOW)
        GPIO.output(placePin[digit], GPIO.HIGH)

Selecciona la posición del valor. Solo una posición debe estar habilitada cada vez. La posición habilitada se establecerá en alto.

.. code-block:: python

    def loop():
        global counter                    
        while True:
            clearDisplay() 
            pickDigit(0)  
            hc595_shift(number[counter % 10])

            clearDisplay()
            pickDigit(1)
            hc595_shift(number[counter % 100//10])

            clearDisplay()
            pickDigit(2)
            hc595_shift(number[counter % 1000//100])

            clearDisplay()
            pickDigit(3)
            hc595_shift(number[counter % 10000//1000])

La función se utiliza para establecer el número mostrado en la pantalla de 7 segmentos de 4 dígitos.

Primero, activa el cuarto segmento de la pantalla y escribe el número de una cifra. Luego, activa el tercer segmento de la pantalla y escribe la cifra de las decenas; después, activa el segundo y el primer segmento de la pantalla respectivamente, y escribe las cifras de las centenas y los millares respectivamente. Debido a que la velocidad de actualización es muy rápida, vemos una pantalla completa de cuatro dígitos.

.. code-block:: python

    timer1 = threading.Timer(1.0, timer)  
    timer1.start()  

El módulo threading es el módulo de subprocesos común en Python, y Timer es la subclase de este.
El prototipo del código es:

.. code-block:: python

    class threading.Timer(interval, function, args=[], kwargs={})

Después del intervalo, se ejecutará la función. Aquí, el intervalo es 1.0, y la función es timer().
start() significa que el Timer comenzará en este punto.

.. code-block:: python

    def timer():  
        global counter
        global timer1
        timer1 = threading.Timer(1.0, timer) 
        timer1.start()  
        counter += 1
        print("%d" % counter)

Después de que el Timer llega a 1.0s, se llama a la función Timer; se suma 1 al contador, y se usa nuevamente el Timer para ejecutarse repetidamente cada segundo.

Imagen del Fenómeno
-----------------------

.. image:: ../img/image81.jpeg