.. note::

    Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.

    **Pourquoi rejoindre ?**

    - **Support d'experts** : Résolvez les problèmes après-vente et les défis techniques avec l'aide de notre communauté et de notre équipe.
    - **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
    - **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus.
    - **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents.
    - **Promotions festives et cadeaux** : Participez à des cadeaux et des promotions de vacances.

    👉 Prêt à explorer et à créer avec nous ? Cliquez [|link_sf_facebook|] et rejoignez-nous aujourd'hui !

.. _1.1.4_py_pi5:

1.1.4 Afficheur 7 segments
===============================

Introduction
-------------------

Essayons de piloter un afficheur 7 segments pour afficher les chiffres de 0 à 9 et les lettres de A à F.

Composants nécessaires
--------------------------------

Dans ce projet, nous avons besoin des composants suivants.

.. image:: ../python_pi5/img/1.1.4_7_segment_list.png

Il est très pratique d'acheter un kit complet, voici le lien :

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

    *   - Nom
        - ARTICLES DANS CE KIT
        - LIEN
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

Vous pouvez également les acheter séparément via les liens ci-dessous.

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

    *   - INTRODUCTION AUX COMPOSANTS
        - LIEN D'ACHAT

    *   - :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_7_segment`
        - |link_7segment_buy|
    *   - :ref:`cpn_74hc595`
        - |link_74hc595_buy|


Schéma de montage
-----------------------

Connectez la broche ST_CP du 74HC595 au GPIO18 du Raspberry Pi, SH_CP au GPIO27, DS au GPIO17, 
les ports de sortie parallèle aux 8 segments de l'afficheur LED.

Entrez les données dans la broche DS vers le registre à décalage lorsque SH_CP (l'entrée d'horloge du registre à décalage) est à la montée, 
et vers le registre de mémoire lorsque ST_CP (l'entrée d'horloge de la mémoire) est à la montée.

Vous pouvez alors contrôler les états de SH_CP et ST_CP via les GPIOs du Raspberry Pi pour transformer 
l'entrée de données série en sortie de données parallèle afin de sauvegarder les GPIOs du Raspberry Pi 
et piloter l'afficheur.

============ ======== ===
Nom T-Board  Physique BCM
GPIO17       Pin 11   17
GPIO18       Pin 12   18
GPIO27       Pin 13   27
============ ======== ===

.. image:: ../python_pi5/img/1.1.4_7_segment_schematic.png


Procédures expérimentales
------------------------------

**Étape 1 :** Construire le circuit.

.. image:: ../python_pi5/img/1.1.4_7-Segment_circuit.png

**Étape 2 :** Accéder au dossier du code.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python-pi5

**Étape 3 :** Exécuter.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.1.4_7-Segment_zero.py

Après l'exécution du code, vous verrez l'afficheur 7 segments afficher 0-9, A-F.

.. warning::

    Si vous recevez le message d'erreur ``RuntimeError: Cannot determine SOC peripheral base address``, veuillez consulter :ref:`faq_soc`

**Code**

.. note::
    Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez accéder au chemin source du code comme ``raphael-kit/python-pi5``. Après avoir modifié le code, vous pouvez l'exécuter directement pour voir l'effet. Après avoir confirmé qu'il n'y a pas de problèmes, vous pouvez utiliser le bouton Copier pour copier le code modifié, puis ouvrir le code source dans Terminal via la commande ``nano`` et le coller.

.. raw:: html

    <run></run>

.. code-block:: python

   #!/usr/bin/env python3
   from gpiozero import OutputDevice
   from time import sleep

   # GPIO pins connected to 74HC595 shift register
   SDI = OutputDevice(17)   # Serial Data Input
   RCLK = OutputDevice(18)  # Memory Clock Input (Register Clock)
   SRCLK = OutputDevice(27) # Shift Register Clock

   # Hexadecimal digit codes for a common cathode 7-segment display
   segCode = [
       0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
       0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
   ]

   def hc595_shift(data):
       # Shift 8 bits of data into the 74HC595
       for bit in range(8):
           # Set SDI high or low based on data bit
           SDI.value = 0x80 & (data << bit)
           # Trigger shift register clock
           SRCLK.on()
           sleep(0.001)
           SRCLK.off()
       # Latch data to output by triggering memory clock
       RCLK.on()
       sleep(0.001)
       RCLK.off()

   def display_all_on():
       # Function to turn all segments on (for common cathode 7-segment display)
       all_on_code = 0x3f
       hc595_shift(all_on_code)
       print("Displaying all segments on")

   try:
       while True:
           # Display each hexadecimal digit on 7-segment display
           for code in segCode:
               hc595_shift(code)  # Shift the code into 74HC595
               # Print the displayed segment code
               print(f"Displaying segCode[{segCode.index(code)}]: 0x{code:02X}")
               sleep(0.5)  # Pause between displaying each digit

   except KeyboardInterrupt:
       # Gracefully handle script interruption (e.g., Ctrl+C)
       pass


**Explication du Code**

#. Ce snippet importe les classes nécessaires pour le projet. ``OutputDevice`` de ``gpiozero`` est utilisé pour contrôler les composants matériels connectés aux broches GPIO, et ``sleep`` de ``time`` est utilisé pour ajouter des délais.

   .. code-block:: python

       #!/usr/bin/env python3
       from gpiozero import OutputDevice
       from time import sleep

#. SDI, RCLK, et SRCLK correspondent aux broches d'entrée de données série, d'entrée d'horloge de mémoire (horloge de registre) et d'horloge de registre à décalage du 74HC595.

   .. code-block:: python

       # GPIO pins connected to 74HC595 shift register
       SDI = OutputDevice(17)   # Serial Data Input
       RCLK = OutputDevice(18)  # Memory Clock Input (Register Clock)
       SRCLK = OutputDevice(27) # Shift Register Clock


#. ``segCode`` est un tableau contenant les codes hexadécimaux pour chaque chiffre à afficher sur l'afficheur 7 segments.

   .. code-block:: python

       # Hexadecimal digit codes for a common cathode 7-segment display
       segCode = [
           0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
           0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
       ]

#. Cette fonction décale 8 bits de données dans le 74HC595. Elle saisit chaque bit en série dans ``SDI``, bascule ``SRCLK`` pour décaler le bit et utilise ``RCLK`` pour verrouiller les données à la sortie.

   .. code-block:: python

       def hc595_shift(data):
           # Shift 8 bits of data into the 74HC595
           for bit in range(8):
               # Set SDI high or low based on data bit
               SDI.value = 0x80 & (data << bit)
               # Trigger shift register clock
               SRCLK.on()
               sleep(0.001)
               SRCLK.off()
           # Latch data to output by triggering memory clock
           RCLK.on()
           sleep(0.001)
           RCLK.off()

#. Cette fonction allume tous les segments de l'afficheur en envoyant un code spécifique à ``hc595_shift``.

   .. code-block:: python

       def display_all_on():
           # Function to turn all segments on (for common cathode 7-segment display)
           all_on_code = 0x3f
           hc595_shift(all_on_code)
           print("Displaying all segments on")

#. Dans la boucle principale, chaque code dans ``segCode`` est envoyé à l'afficheur en séquence, avec un délai entre chaque affichage.

   .. code-block:: python

       try:
           while True:
               # Display each hexadecimal digit on 7-segment display
               for code in segCode:
                   hc595_shift(code)  # Shift the code into 74HC595
                   # Print the displayed segment code
                   print(f"Displaying segCode[{segCode.index(code)}]: 0x{code:02X}")
                   sleep(0.5)  # Pause between displaying each digit

#. Cette partie du code gère gracieusement l'interruption du script (comme Ctrl+C).

   .. code-block:: python

       except KeyboardInterrupt:
           # Gracefully handle script interruption (e.g., Ctrl+C)
           pass

