.. note::

    Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

    **Perché unirti a noi?**

    - **Supporto esperto**: Risolvi problemi post-vendita e sfide tecniche con l'aiuto della nostra comunità e del nostro team.
    - **Impara e condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze.
    - **Anteprime esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime esclusive.
    - **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
    - **Promozioni festive e concorsi**: Partecipa a concorsi e promozioni durante le festività.

    👉 Sei pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!

.. _1.1.6_py:

1.1.6 Matrice a Punti LED
===============================

Introduzione
--------------------

Come suggerisce il nome, una matrice a punti LED è una matrice composta da LED.
L'accensione e lo spegnimento dei LED formano diversi caratteri e modelli.

Componenti Necessari
------------------------------

In questo progetto, abbiamo bisogno dei seguenti componenti. 

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

È sicuramente comodo acquistare un kit completo, ecco il link: 

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

    *   - Nome	
        - ARTICOLI IN QUESTO KIT
        - LINK
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

Puoi anche acquistarli separatamente dai link qui sotto.

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

    *   - INTRODUZIONE AI COMPONENTI
        - LINK PER L'ACQUISTO

    *   - :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|

Schema Elettrico
-----------------------

============ ======== ======== ====
T-Board Name physical wiringPi BCM
SPIMOSI      Pin 19   12       MOSI
SPICE0       pin 24   10       CE0
SPISCLK      Pin 23   14       SCLK
============ ======== ======== ====

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

Procedure Sperimentali
----------------------------

**Passo 1:** Costruisci il circuito. 

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

**Passo 2**: Attivare SPI prima di iniziare l'esperimento, vedere :ref:`spi_configuration` per i dettagli.

**Passo 3**: Installare il modulo :ref:`Luma.LED_Matrix`.

**Passo 4:** Cambia directory.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python/


Passo 5: Eseguire lo script Python ``1.1.6_LedMatrix.py`` utilizzando l'interprete Python dell'ambiente virtuale ``my_env``.

.. raw:: html

   <run></run>

.. code-block::

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


Dopo aver eseguito il codice, la Matrice LED mostrerà un rettangolo per due secondi, poi la lettera 'A' per due secondi, e infine scorrerà per visualizzare il testo "Hello, Nice to meet you!".

**Codice**

.. note::

    Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui sotto. Ma prima devi accedere al percorso del codice come ``raphael-kit/python``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto.


.. 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()

**Spiegazione del Codice**

.. 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

Importa le librerie rilevanti, tra cui ``luma.core``, una libreria compatibile con Pillow per Python 3 che fornisce un canvas e altre funzionalità di disegno per display piccoli su Raspberry Pi e altri computer a scheda singola.
Puoi visitare `https://luma-core.readthedocs.io/en/latest/intro.html <https://luma-core.readthedocs.io/en/latest/intro.html>`_ per saperne di più.


.. code-block:: python

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

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

.. note::

    Se vuoi modificare la direzione di visualizzazione della Matrice LED, puoi farlo modificando il valore di rotate, dove 0 significa nessuna rotazione, 1 significa rotazione di 90° in senso orario, 2 significa rotazione di 180° e 3 significa rotazione di 270° in senso orario.

.. code-block:: python

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

Visualizza un rettangolo vuoto nell'area dei bordi della Matrice LED e modifica il valore di ``fill`` in ``white`` per visualizzare un rettangolo pieno.


.. code-block:: python

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

Una "A" viene visualizzata alle coordinate (0, 0) della Matrice LED, dove ``CP437_FONT`` è un font adatto per schermi a matrice di punti 8x8.

.. code-block:: python

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

Non è possibile visualizzare una linea di testo su una singola matrice LED 8x8. Dobbiamo utilizzare il metodo ``luma.core.virtual.viewport`` per far scorrere il testo attraverso la finestra virtuale.

.. 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()`` implementa "Hello, Nice to meet you!" come testo scorrevole sulla Matrice LED.

Prima, passiamo virtual come argomento alla funzione ``canvas()``, così possiamo usare la finestra virtuale come finestra di visualizzazione corrente. Poi la funzione ``text()`` visualizza "Hello, Nice to meet you!" sulla Matrice LED.

Utilizzando la funzione for loop, spostiamo la finestra virtuale nella direzione X in modo da poter vedere il testo "Hello, Nice to meet you!" scorrere.


Immagine del Fenomeno
--------------------------

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