.. note::

    ¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas.

    **¿Por qué unirse?**

    - **Soporte experto**: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
    - **Aprende y comparte**: Intercambia consejos y tutoriales para mejorar tus habilidades.
    - **Previews exclusivos**: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.
    - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
    - **Promociones y sorteos festivos**: Participa en sorteos y promociones festivas.

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

.. _2.1.5_py:

2.1.5 Interruptor de Inclinación
======================================

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

Este es un interruptor de inclinación de bola con una bola metálica 
en su interior. Se utiliza para detectar inclinaciones de un pequeño ángulo.

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

En este proyecto, necesitamos los siguientes componentes. 

.. image:: ../img/list_2.1.3_tilt_switch.png

Es definitivamente conveniente comprar un kit completo, aquí está el enlace: 

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

    *   - Nombre	
        - ELEMENTOS EN ESTE KIT
        - ENLACE
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

También puedes comprarlos por separado en los enlaces a continuación.

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

    *   - INTRODUCCIÓN AL COMPONENTE
        - ENLACE DE COMPRA

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

Diagrama Esquemático
-------------------------

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


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


Procedimientos Experimentales
-----------------------------------

**Paso 1:** Construir el circuito.

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

**Paso 2:** Cambiar el directorio.

.. raw:: html

   <run></run>

.. code-block:: 

    cd ~/raphael-kit/python/

**Paso 3:** Ejecutar.

.. raw:: html

   <run></run>

.. code-block:: 

    sudo python3 2.1.5_Tilt.py

Coloca el interruptor de inclinación verticalmente y el LED verde se encenderá. 
Si lo inclinas, se imprimirá "¡Inclinación!" en la pantalla y el LED rojo se encenderá. 
Vuelve a colocarlo verticalmente y el LED verde se encenderá de nuevo.

**Código**

.. note::

    Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como ``raphael-kit/python``. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.

.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO

    TiltPin = 17
    Gpin   = 27
    Rpin   = 22

    def setup():
        GPIO.setmode(GPIO.BCM)       # Numerar GPIOs por ubicación física
        GPIO.setup(Gpin, GPIO.OUT)     # Establecer el modo del pin del LED verde como salida
        GPIO.setup(Rpin, GPIO.OUT)     # Establecer el modo del pin del LED rojo como salida
        GPIO.setup(TiltPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)    # Establecer el modo del pin de inclinación como entrada y activar resistencia pull-up
        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)       # Apagar LED verde
        GPIO.output(Rpin, GPIO.HIGH)       # Apagar LED rojo
        GPIO.cleanup()                     # Liberar recursos

    if __name__ == '__main__':     # El programa empieza aquí
        setup()
        try:
            loop()
        except KeyboardInterrupt:  # Cuando se presiona 'Ctrl+C', se ejecutará la función destroy()
            destroy()

**Explicación del Código**

.. code-block:: python

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

Configurar la detección en TiltPin, y la función de 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)

Definir una función Led() para encender o apagar los dos LEDs. Si x=0, el LED rojo se enciende; de lo contrario, el LED verde se encenderá.

.. code-block:: python

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

Crear una función Print() para imprimir los caracteres en la pantalla.

.. code-block:: python

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

Definir una función de callback para la inclinación. 
Obtener el valor leído del interruptor de inclinación, 
luego la función Led() controla el encendido o apagado 
de los dos LEDs dependiendo del valor leído del interruptor 
de inclinación.

Imagen del Fenómeno
----------------------

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


