.. 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 i problemi post-vendita e le 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 speciali.
    - **Sconti esclusivi**: Approfitta di sconti riservati 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!

.. _2.1.5_py:

2.1.5 Interruttore a Inclinazione
=========================================

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

Questo è un interruttore a inclinazione con una sfera metallica all'interno. 
Viene utilizzato per rilevare inclinazioni di piccolo angolo.

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

In questo progetto, abbiamo bisogno dei seguenti componenti.

.. image:: ../img/list_2.1.3_tilt_switch.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_resistor`
        - |link_resistor_buy|
    *   - :ref:`cpn_led`
        - |link_led_buy|
    *   - :ref:`cpn_tilt_switch`
        - \-

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

.. image:: ../img/image307.png


.. image:: ../img/image308.png


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

**Passo 1:** Costruisci il circuito.

.. image:: ../img/image169.png

**Passo 2:** Cambia directory.

.. raw:: html

   <run></run>

.. code-block:: 

    cd ~/raphael-kit/python/

**Passo 3:** Esegui.

.. raw:: html

   <run></run>

.. code-block:: 

    sudo python3 2.1.5_Tilt.py

Posiziona l'interruttore a inclinazione in verticale e il LED verde si accenderà. 
Se lo inclini, verrà stampato "Inclinato!" sullo schermo e il LED rosso si accenderà. 
Rimettilo in verticale e il LED verde si riaccenderà.

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

    import RPi.GPIO as GPIO

    TiltPin = 17
    Gpin   = 27
    Rpin   = 22

    def setup():
        GPIO.setmode(GPIO.BCM)       # Numerazione GPIO in base alla posizione fisica
        GPIO.setup(Gpin, GPIO.OUT)     # Imposta il Pin LED Verde come output
        GPIO.setup(Rpin, GPIO.OUT)     # Imposta il Pin LED Rosso come output
        GPIO.setup(TiltPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)    # Imposta BtnPin come input, con pull-up a livello alto (3.3V)
        GPIO.add_event_detect(TiltPin, GPIO.BOTH, callback=detect, bouncetime=200)

    def Led(x):
        if x == 0:
            GPIO.output(Rpin, 1)
            GPIO.output(Gpin, 0)
        if x == 1:
            GPIO.output(Rpin, 0)
            GPIO.output(Gpin, 1)

    def Print(x):
        if x == 0:
            print ('    *************')
            print ('    *   Tilt!   *')
            print ('    *************')

    def detect(chn):
        Led(GPIO.input(TiltPin))
        Print(GPIO.input(TiltPin))

    def loop():
        while True:
            pass

    def destroy():
        GPIO.output(Gpin, GPIO.HIGH)       # Spegni il LED Verde
        GPIO.output(Rpin, GPIO.HIGH)       # Spegni il LED Rosso
        GPIO.cleanup()                     # Rilascia le risorse

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

**Spiegazione del Codice**

.. code-block:: python

    GPIO.add_event_detect(TiltPin, GPIO.BOTH, callback=detect, bouncetime=200)

Imposta un rilevamento su TiltPin, con funzione di callback "detect".

.. code-block:: python

    def Led(x):
        if x == 0:
            GPIO.output(Rpin, 1)
            GPIO.output(Gpin, 0)
        if x == 1:
            GPIO.output(Rpin, 0)
            GPIO.output(Gpin, 1)

Definisci una funzione Led() per accendere o spegnere i due LED. Se x=0, si accende il LED rosso; altrimenti, si accende il LED verde.

.. code-block:: python

    def Print(x):
        if x == 0:
            print ('    *************')
            print ('    *   Tilt!   *')
            print ('    *************')

Crea una funzione Print() per stampare i caratteri sopra sullo schermo.

.. code-block:: python

    def detect(chn):
        Led(GPIO.input(TiltPin))
        Print(GPIO.input(TiltPin))

Definisci una funzione di callback per l'interruttore a inclinazione. Ottieni il valore 
letto dall'interruttore a inclinazione, e poi la funzione Led() controlla l'accensione o 
lo spegnimento dei due LED, in base al valore letto.

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

.. image:: ../img/image170.jpeg


