 
.. 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.6_py:

1.1.6 Matrice de Points LED
==============================

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

Comme son nom l'indique, une matrice de points LED est une matrice composée de LEDs.
L'allumage et l'extinction des LEDs forment différents caractères
et motifs.

Composants Nécessaires
----------------------------

Pour ce projet, nous avons besoin des composants suivants :

.. image:: ../img/list_dot.png

Il est certainement pratique d'acheter un kit complet, voici le lien :

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

    *   - Nom
        - ÉLÉMENTS DANS CE KIT
        - LIEN
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

Vous pouvez également les acheter séparément à partir des liens ci-dessous.

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

    *   - INTRODUCTION DU COMPOSANT
        - 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_dot_matrix`
        - |link_led_matrix_buy|

Schéma de Câblage
--------------------

============ ======== ======== =====
Nom T-Board  Physique wiringPi BCM
SPIMOSI      Pin 19   12       MOSI
SPICE0       Pin 24   10       CE0
SPISCLK      Pin 23   14       SCLK
============ ======== ======== =====

.. image:: ../img/schematic_dot.png

Procédures Expérimentales
------------------------------

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

.. image:: ../img/1.1.6fritzing.png

**Étape 2 :** Activez le SPI avant de commencer l'expérience, consultez :ref:`spi_configuration` pour plus de détails. 

**Étape 3 :** Installer le module :ref:`Luma.LED_Matrix`.

**Étape 4 :** Changer de répertoire.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit//python-pi5

**Étape 5 :** Exécuter le script Python ``1.1.6_LedMatrix.py`` en utilisant l'interpréteur Python de l'environnement virtuel ``my_env``.

.. raw:: html

   <run></run>

.. code-block::

    sudo ~/my_env/bin/python3 1.1.6_LedMatrix.py


Après l'exécution du code, la matrice LED affichera un rectangle pendant deux secondes, puis la lettre 'A' pendant deux secondes, et enfin défilera pour afficher le texte "Hello, Nice to meet you!"

**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 du code source comme ``raphael-kit/python``. Après avoir modifié le code, vous pouvez l'exécuter directement pour voir l'effet.


.. raw:: html

    <run></run>

.. code-block:: python

   from luma.core.interface.serial import spi, noop
   from luma.core.render import canvas
   from luma.core.virtual import viewport
   from luma.led_matrix.device import max7219
   from luma.core.legacy import text
   from luma.core.legacy.font import proportional, CP437_FONT, LCD_FONT
   import time

   serial = spi(port=0, device=0, gpio=noop())
   device = max7219(serial, rotate=1)
   virtual = viewport(device, width=200, height=400)

   def displayRectangle():
      with canvas(device) as draw:
         draw.rectangle(device.bounding_box, outline="white", fill="black")

   def displayLetter():
      with canvas(device) as draw:
         text(draw, (0, 0), "A", fill="white", font=proportional(CP437_FONT))

   def scrollToDisplayText():
      with canvas(virtual) as draw:
         text(draw, (0, 0), "Hello, Nice to meet you!", fill="white", font=proportional(CP437_FONT))

      for offset in range(150):
         virtual.set_position((offset,0))
         time.sleep(0.1)

   def main():
      while True:
         displayRectangle()
         time.sleep(2)
         displayLetter()
         time.sleep(2)
         scrollToDisplayText()

   def destroy():
      pass

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

**Explication du Code**

.. code-block:: python

    from luma.core.interface.serial import spi, noop
    from luma.core.render import canvas
    from luma.core.virtual import viewport
    from luma.led_matrix.device import max7219
    from luma.core.legacy import text
    from luma.core.legacy.font import proportional, CP437_FONT, LCD_FONT
    import time

Importer les bibliothèques pertinentes, dont ``luma.core`` est une bibliothèque de composants qui fournit un canvas compatible Pillow pour Python 3, ainsi que d'autres primitives de dessin et fonctionnalités de rendu de texte prenant en charge les petits écrans sur Raspberry Pi et autres ordinateurs monocartes.
Vous pouvez visiter `https://luma-core.readthedocs.io/en/latest/intro.html <https://luma-core.readthedocs.io/en/latest/intro.html>`_ pour en savoir plus.


.. code-block:: python

    serial = spi(port=0, device=0, gpio=noop())
    device = max7219(serial, rotate=1)

Initialiser la classe ``luma.led_matrix.device.max7219``.

.. note::

    Si vous souhaitez modifier la direction d'affichage de la matrice LED, vous pouvez le faire en modifiant la valeur de rotate, où 0 signifie aucune rotation, 1 signifie rotation de 90° dans le sens des aiguilles d'une montre, 2 signifie rotation de 180°, et 3 signifie rotation de 270° dans le sens des aiguilles d'une montre.

.. code-block:: python

    def displayRectangle():
        with canvas(device) as draw:
            draw.rectangle(device.bounding_box, outline="white", fill="black")

Afficher un rectangle creux dans la zone de bord de la matrice LED et modifier la valeur de ``fill`` en ``white`` pour afficher un rectangle plein.


.. code-block:: python

    def displayLetter():
        with canvas(device) as draw:
            text(draw, (0, 0), "A", fill="white", font=proportional(CP437_FONT))

Un "A" est affiché sur la coordonnée (0, 0) de la matrice LED, où ``CP437_FONT`` est une police adaptée aux écrans de matrice à points 8*8.

.. code-block:: python

    virtual = viewport(device, width=200, height=400)

Il n'y a pas moyen d'afficher une ligne de texte sur une seule matrice LED 8x8. Nous devons utiliser la méthode ``luma.core.virtual.viewport`` pour que le texte puisse défiler à travers la fenêtre virtuelle.

.. code-block:: python

    def scrollToDisplayText():
        with canvas(virtual) as draw:
            text(draw, (0, 0), "Hello, Nice to meet you!", fill="white", font=proportional(CP437_FONT))

        for offset in range(150):
            virtual.set_position((offset,0))
            time.sleep(0.1)

``scrollToDisplayText()`` implémente "Hello, Nice to meet you!" comme texte défilant sur la matrice LED.

D'abord, nous passons virtual comme argument à la fonction ``canvas()`` afin que nous puissions utiliser la fenêtre virtuelle comme fenêtre d'affichage actuelle. Ensuite, la fonction ``text()`` affiche "Hello, Nice to meet you!" sur la matrice LED.

En utilisant la fonction de boucle for, nous déplaçons la fenêtre virtuelle dans la direction X afin que nous puissions voir le texte "Hello, Nice to meet you!" défiler.


Image du Phénomène
-----------------------

.. image:: ../img/1.1.6led_dot_matrix.JPG
