.. note::

    Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci l'esplorazione del Raspberry Pi, Arduino ed ESP32 con altri appassionati.

    **Perché unirti a noi?**

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

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

.. _2.2.7_py:

2.2.7 PIR
============

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

In questo progetto, realizzeremo un dispositivo utilizzando i sensori piroelettrici 
a infrarossi per il rilevamento del corpo umano. Quando qualcuno si avvicina al LED, 
questo si accenderà automaticamente. In caso contrario, la luce si spegnerà. Questo 
sensore di movimento a infrarossi è un tipo di sensore che può rilevare l'infrarosso 
emesso da esseri umani e animali.

Componenti necessari
------------------------------

In questo progetto avremo bisogno dei seguenti componenti.

.. image:: ../img/list_2.2.4_pir2.png

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

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

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

Puoi anche acquistarli separatamente dai link sottostanti.

.. 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_resistor`
        - |link_resistor_buy|
    *   - :ref:`cpn_rgb_led`
        - |link_rgb_led_buy|
    *   - :ref:`cpn_pir`
        - \-


Schema elettrico
-----------------------

.. image:: ../img/image327.png


Procedura sperimentale
-------------------------

**Passo 1:** Costruisci il circuito.

.. image:: ../img/image214.png

**Passo 2:** Vai nella cartella del codice.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python/

**Passo 3:** Esegui il file eseguibile.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 2.2.7_PIR.py

Dopo l'esecuzione del codice, il PIR rileva l'ambiente circostante e fa illuminare il LED RGB di giallo se rileva qualcuno nelle vicinanze.

Sul modulo PIR ci sono due potenziometri: uno per regolare la sensibilità e l'altro per regolare la distanza di rilevamento. Per far funzionare meglio il modulo PIR, devi ruotarli entrambi in senso antiorario fino alla fine.

.. image:: ../img/PIR_TTE.png
    :width: 400
    :align: center

**Codice**

.. note::

    Puoi **Modificare/Resettare/Copiare/Eseguire/Fermare** il codice qui sotto. Ma prima di farlo, devi andare nel percorso del codice sorgente, come ``raphael-kit/python``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto.


.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import time

    rgbPins = {'Red':18, 'Green':27, 'Blue':22}
    pirPin = 17    # il pir è collegato al pin 17

    def setup():
        global p_R, p_G, p_B
        GPIO.setmode(GPIO.BCM)      # Imposta le modalità GPIO su BCM Numbering
        GPIO.setup(pirPin, GPIO.IN)    # Imposta pirPin come input
        # Imposta tutti i LedPin in modalità output e livello iniziale alto (3,3 V)
        for i in rgbPins:
            GPIO.setup(rgbPins[i], GPIO.OUT, initial=GPIO.HIGH)

        # Imposta tutti i led come canali pwm e frequenza a 2KHz
        p_R = GPIO.PWM(rgbPins['Red'], 2000)
        p_G = GPIO.PWM(rgbPins['Green'], 2000)
        p_B = GPIO.PWM(rgbPins['Blue'], 2000)

        # Imposta tutti i valori iniziali a 0
        p_R.start(0)
        p_G.start(0)
        p_B.start(0)

    # Definisci una funzione MAP per mappare i valori, ad esempio da 0~255 a 0~100
    def MAP(x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

    # Definisci una funzione per impostare i colori 
    def setColor(color):
    # configura la luminosità dei tre LED con il valore del colore inserito. 
        # Suddividi i colori dalla variabile 'color'
        R_val = (color & 0xFF0000) >> 16
        G_val = (color & 0x00FF00) >> 8
        B_val = (color & 0x0000FF) >> 0
        # Mappa il valore del colore da 0~255 a 0~100
        R_val = MAP(R_val, 0, 255, 0, 100)
        G_val = MAP(G_val, 0, 255, 0, 100)
        B_val = MAP(B_val, 0, 255, 0, 100)
        
        # Assegna il valore del ciclo di lavoro mappato al corrispondente canale PWM per cambiare la luminosità. 
        p_R.ChangeDutyCycle(R_val)
        p_G.ChangeDutyCycle(G_val)
        p_B.ChangeDutyCycle(B_val)
        #print ("messaggio_colore: R_val = %s, G_val = %s, B_val = %s"%(R_val, G_val, B_val))

    def loop():
        while True:
            pir_val = GPIO.input(pirPin)
            if pir_val==GPIO.HIGH:
                setColor(0xFFFF00)
            else :
                setColor(0x0000FF)

    def destroy():
        p_R.stop()
        p_G.stop()
        p_B.stop()
        GPIO.cleanup()                     # Rilascia le risorse

    if __name__ == '__main__':     # Il programma inizia qui
        setup()
        try:
            loop()
        except KeyboardInterrupt:  # Quando si preme 'Ctrl+C', viene eseguito il programma figlio destroy().
            destroy()

**Spiegazione del Codice**

.. code-block:: python

    rgbPins = {'Red':18, 'Green':27, 'Blue':22}

    def setup():
        global p_R, p_G, p_B
        GPIO.setmode(GPIO.BCM)  
        # …… 
        for i in rgbPins:
            GPIO.setup(rgbPins[i], GPIO.OUT, initial=GPIO.HIGH)
        p_R = GPIO.PWM(rgbPins['Red'], 2000)
        p_G = GPIO.PWM(rgbPins['Green'], 2000)
        p_B = GPIO.PWM(rgbPins['Blue'], 2000)
        p_R.start(0)
        p_G.start(0)
        p_B.start(0)

    def MAP(x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

    def setColor(color):
    ...

Questi codici vengono utilizzati per impostare il colore del LED RGB, 
per ulteriori dettagli consulta :ref:`1.1.2_py`.

.. code-block:: python

    def loop():
        while True:
            pir_val = GPIO.input(pirPin)
            if pir_val==GPIO.HIGH:
                setColor(0xFFFF00)
            else :
                setColor(0x0000FF)

Quando il PIR rileva lo spettro infrarosso umano, il LED RGB emette luce gialla; altrimenti, emette luce blu.

Immagine del fenomeno
-------------------------

.. image:: ../img/image215.jpeg
