.. note::

    Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci il mondo di Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

    **Perché unirti a noi?**

    - **Supporto Tecnico 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**: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.
    - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
    - **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni durante le festività.

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

.. _2.1.5_py_pi5:

2.1.5 Interruttore di Inclinazione
==================================

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

Questo è un interruttore a sfera inclinabile con una pallina metallica 
all'interno. Viene utilizzato per rilevare piccole inclinazioni angolari.

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

Per questo progetto, avremo bisogno dei seguenti componenti.

.. image:: ../python_pi5/img/2.1.5_tilt_switch_list.png

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

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

    *   - Nome	
        - COMPONENTI NEL KIT
        - LINK
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

Puoi anche acquistarli separatamente dai link sottostanti.

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

    *   - INTRODUZIONE AI COMPONENTI
        - LINK D'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:: ../python_pi5/img/2.1.5_tilt_switch_schematic_1.png


.. image:: ../python_pi5/img/2.1.5_tilt_switch_schematic_2.png


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

**Passo 1:** Costruisci il circuito.

.. image:: ../python_pi5/img/2.1.5_tilt_switch_circuit.png

**Passo 2:** Accedi alla cartella del codice.

.. raw:: html

   <run></run>

.. code-block:: 

    cd ~/raphael-kit/python-pi5

**Passo 3:** Esegui.

.. raw:: html

   <run></run>

.. code-block:: 

    sudo python3 2.1.5_Tilt_zero.py

Posiziona l'interruttore inclinabile in verticale e il LED verde si accenderà. Se lo 
inclini, verrà stampato "Tilt!" sullo schermo e il LED rosso si accenderà. Riposizionalo 
verticalmente e il LED verde si riaccenderà.

.. warning::

    Se viene visualizzato l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, fare riferimento a :ref:`faq_soc`. 

**Code**

.. note::

    Puoi **Modificare/Resettare/Copiare/Eseguire/Fermare** il codice qui sotto. Ma prima, devi accedere alla directory del codice come ``raphael-kit/python-pi5``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto.


.. raw:: html

    <run></run>

.. code-block:: python

   #!/usr/bin/env python3
   from gpiozero import LED, Button

   # Inizializza il sensore di inclinazione e i LED usando GPIO Zero
   TiltPin = Button(17, pull_up=False)  # Sensore di inclinazione collegato al pin GPIO 17, resistenza pull-up disabilitata
   green_led = LED(27)  # LED verde collegato al pin GPIO 27
   red_led = LED(22)   # LED rosso collegato al pin GPIO 22

   def detect():
       """
       Detect the tilt sensor state and control the LEDs.
       Turns on the red LED and turns off the green LED when tilted.
       Turns off the red LED and turns on the green LED when not tilted.
       """
       if TiltPin.is_pressed:  # Verifica se il sensore è inclinato
           print('    *************')
           print('    *   Tilt!   *')
           print('    *************')
           red_led.on()   # Accendi LED rosso
           green_led.off()  # Spegni LED verde
       else:  # Se il sensore non è inclinato
           red_led.off()  # Spegni LED rosso
           green_led.on()  # Accendi LED verde

   try:
       while True:
           # Controlla continuamente lo stato del sensore di inclinazione e aggiorna i LED
           TiltPin.when_pressed = detect
           TiltPin.when_released = detect

   except KeyboardInterrupt:
       # Gestisci un'interruzione da tastiera (Ctrl+C) per uscire dal ciclo in modo pulito
       pass


**Spiegazione del Codice**

#. Questa linea imposta lo script per essere eseguito con Python 3 e importa ``LED`` e ``Button`` da ``gpiozero`` per controllare i dispositivi GPIO.

   .. code-block:: python

       #!/usr/bin/env python3
       from gpiozero import LED, Button

#. Inizializza il sensore di inclinazione collegato al pin GPIO 17 (con resistenza pull-up disabilitata) e due LED collegati ai pin GPIO 27 e 22.

   .. code-block:: python

       # Inizializza il sensore di inclinazione e i LED usando GPIO Zero
       TiltPin = Button(17, pull_up=False)  # Sensore di inclinazione collegato al pin GPIO 17, resistenza pull-up disabilitata
       green_led = LED(27)  # LED verde collegato al pin GPIO 27
       red_led = LED(22)   # LED rosso collegato al pin GPIO 22

#. Definisce la funzione ``detect``, che controlla lo stato del sensore di inclinazione. Se inclinato, accende il LED rosso e spegne il LED verde. Se non inclinato, fa il contrario.

   .. code-block:: python

       def detect():
           """
           Detect the tilt sensor state and control the LEDs.
           Turns on the red LED and turns off the green LED when tilted.
           Turns off the red LED and turns on the green LED when not tilted.
           """
           if TiltPin.is_pressed:  # Verifica se il sensore è inclinato
               print('    *************')
               print('    *   Tilt!   *')
               print('    *************')
               red_led.on()   # Accendi LED rosso
               green_led.off()  # Spegni LED verde
           else:  # Se il sensore non è inclinato
               red_led.off()  # Spegni LED rosso
               green_led.on()  # Accendi LED verde

#. Il ciclo principale assegna la funzione ``detect`` sia agli eventi ``when_pressed`` che ``when_released`` del sensore di inclinazione. Il blocco ``try-except`` gestisce un'interruzione da tastiera per una chiusura pulita.

   .. code-block:: python

       try:
           while True:
               # Controlla continuamente lo stato del sensore di inclinazione e aggiorna i LED
               TiltPin.when_pressed = detect
               TiltPin.when_released = detect

       except KeyboardInterrupt:
           # Gestisci un'interruzione da tastiera (Ctrl+C) per uscire dal ciclo in modo pulito
           pass

