.. note::

    ¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.

    **¿Por qué unirse?**

    - **Soporte Experto**: Resuelve problemas postventa y desafíos técnicos con ayuda de nuestra comunidad y equipo.
    - **Aprende y Comparte**: Intercambia consejos y tutoriales para mejorar tus habilidades.
    - **Avances Exclusivos**: Accede anticipadamente a anuncios de nuevos productos y adelantos exclusivos.
    - **Descuentos Especiales**: Aprovecha descuentos exclusivos en nuestros productos más recientes.
    - **Promociones Festivas y Sorteos**: Participa en sorteos y promociones especiales.

    👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo.

.. _2.1.3_py_pi5:

2.1.3 Interruptor de Inclinación
===================================

Introducción
---------------

Este es un interruptor de inclinación de bola con una bola de metal en su interior. 
Se utiliza para detectar inclinaciones en ángulos pequeños.

Componentes Necesarios
-------------------------

En este proyecto, necesitamos los siguientes componentes. 

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

.. raw:: html

   <br/>

Diagrama de Conexión
-----------------------

.. image:: ../python_pi5/img/2.1.3_tilt_switch_schematic_1.png


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


Procedimientos del Experimento
---------------------------------

**Paso 1:** Monta el circuito.

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

**Paso 2:** Cambia al directorio.

.. raw:: html

   <run></run>

.. code-block:: 

    cd ~/davinci-kit-for-raspberry-pi/python-pi5

**Paso 3:** Ejecuta el código.

.. raw:: html

   <run></run>

.. code-block:: 

    sudo python3 2.1.3_Tilt.py

Coloca el sensor de inclinación en posición vertical, y el LED verde se 
encenderá. Si lo inclinas, aparecerá "Tilt!" en la pantalla y el LED rojo 
se encenderá. Al volver a ponerlo en posición vertical, el LED verde se encenderá de nuevo.

.. warning::

    Si aparece el mensaje de error ``RuntimeError: Cannot determine SOC peripheral base address``, consulta :ref:`faq_soc` 

**Código**

.. note::

    Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Antes de eso, asegúrate de estar en la ruta del código fuente, como ``davinci-kit-for-raspberry-pi/python-pi5``. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.


.. raw:: html

    <run></run>

.. code-block:: python

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

   # Inicializa el sensor de inclinación y los LEDs usando GPIO Zero
   TiltPin = Button(17, pull_up=False)  # Sensor de inclinación conectado al pin GPIO 17, con resistencia de pull-up desactivada
   green_led = LED(27)  # LED verde conectado al pin GPIO 27
   red_led = LED(22)    # LED rojo conectado 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 si el sensor está inclinado
           print('    *************')
           print('    *   Tilt!   *')
           print('    *************')
           red_led.on()   # Enciende el LED rojo
           green_led.off()  # Apaga el LED verde
       else:  # Si el sensor no está inclinado
           red_led.off()  # Apaga el LED rojo
           green_led.on()  # Enciende el LED verde

   try:
       while True:
           # Verifica continuamente el estado del sensor de inclinación y actualiza los LEDs
           TiltPin.when_pressed = detect
           TiltPin.when_released = detect

   except KeyboardInterrupt:
       # Maneja una interrupción de teclado (Ctrl+C) para salir del bucle de manera ordenada
       pass


**Explicación del Código**

#. Esta línea configura el script para ejecutarse con Python 3 e importa ``LED`` y ``Button`` desde ``gpiozero`` para controlar los dispositivos GPIO.

   .. code-block:: python

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

#. Inicializa el sensor de inclinación conectado al pin GPIO 17 (con resistencia de pull-up desactivada) y dos LEDs conectados a los pines GPIO 27 y 22.

   .. code-block:: python

       # Inicializa el sensor de inclinación y los LEDs usando GPIO Zero
       TiltPin = Button(17, pull_up=False)  # Sensor de inclinación conectado al pin GPIO 17, con resistencia de pull-up desactivada
       green_led = LED(27)  # LED verde conectado al pin GPIO 27
       red_led = LED(22)   # LED rojo conectado al pin GPIO 22

#. Define la función ``detect``, que verifica el estado del sensor de inclinación. Si está inclinado, enciende el LED rojo y apaga el LED verde. Si no está inclinado, hace lo 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 si el sensor está inclinado
               print('    *************')
               print('    *   Tilt!   *')
               print('    *************')
               red_led.on()   # Enciende el LED rojo
               green_led.off()  # Apaga el LED verde
           else:  # Si el sensor no está inclinado
               red_led.off()  # Apaga el LED rojo
               green_led.on()  # Enciende el LED verde

#. El bucle principal asigna la función ``detect`` tanto a los eventos ``when_pressed`` como ``when_released`` del sensor de inclinación. El bloque ``try-except`` maneja una interrupción de teclado para una terminación ordenada.

   .. code-block:: python

       try:
           while True:
               # Verifica continuamente el estado del sensor de inclinación y actualiza los LEDs
               TiltPin.when_pressed = detect
               TiltPin.when_released = detect

       except KeyboardInterrupt:
           # Maneja una interrupción de teclado (Ctrl+C) para salir del bucle de manera ordenada
           pass

