.. note::

    ¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Únete a otros apasionados y profundiza en el uso de Raspberry Pi, Arduino y ESP32.

    **¿Por qué unirte?**

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

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

.. _py_pi5_pir:

2.2.4 PIR
=========

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

En este proyecto, crearemos un dispositivo utilizando sensores piroeléctricos 
infrarrojos para detectar la proximidad de personas. Cuando alguien se acerque, 
el LED se encenderá automáticamente. Si no hay movimiento cercano, la luz se 
apagará. Este sensor de movimiento infrarrojo detecta la radiación infrarroja 
emitida por humanos y animales.

Componentes necesarios
-------------------------

En este proyecto, necesitamos los siguientes componentes.

.. image:: ../python_pi5/img/2.2.4_pir_list.png

.. raw:: html

   <br/>

Diagrama esquemático
-----------------------

.. image:: ../python_pi5/img/2.2.4_pir_schematic.png


Procedimientos experimentales
-------------------------------

**Paso 1:** Construye el circuito.

.. image:: ../python_pi5/img/2.2.4_pir_circuit.png

**Paso 2:** Ve a la carpeta del código.

.. raw:: html

   <run></run>

.. code-block::

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

**Paso 3:** Ejecuta el archivo ejecutable.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 2.2.4_PIR.py

Después de ejecutar el código, el PIR detectará el entorno y hará que el LED RGB se ilumine en amarillo si detecta a alguien pasando.

El módulo PIR tiene dos potenciómetros: uno para ajustar la sensibilidad y otro para ajustar la distancia de detección. Para un mejor rendimiento, gira ambos potenciómetros en sentido contrario a las agujas del reloj hasta el final.

.. image:: ../python_pi5/img/2.2.4_PIR_TTE.png
    :width: 400
    :align: center

.. warning::

    Si aparece un 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. Pero antes, debes ir a 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 RGBLED, MotionSensor
   from time import sleep

   # Inicializar LED RGB y sensor de movimiento PIR utilizando la biblioteca GPIO Zero
   led = RGBLED(red=18, green=27, blue=22)  # LED RGB conectado a los pines GPIO 18 (Rojo), 27 (Verde), 22 (Azul)
   pir = MotionSensor(17)  # Sensor PIR conectado al pin GPIO 17

   try:
       # Monitorear continuamente el movimiento y actualizar el color del LED
       while True:
           if pir.motion_detected:  # Verificar si el sensor PIR detecta movimiento
               led.color = (1, 1, 0)  # Configurar el color del LED a amarillo (Rojo + Verde)
           else:
               led.color = (0, 0, 1)  # Configurar el color del LED a azul (solo Azul)
           sleep(0.1)  # Pequeño retardo para reducir la carga de la CPU

   except KeyboardInterrupt:
       # Manejar KeyboardInterrupt (Ctrl+C) para salir del bucle de manera segura
       pass


**Explicación del código**

#. Importa la clase ``RGBLED`` para controlar un LED RGB y la clase ``MotionSensor`` para detectar movimiento desde la biblioteca GPIO Zero. También importa la función ``sleep`` para crear pausas.

   .. code-block:: python

       #!/usr/bin/env python3
       from gpiozero import RGBLED, MotionSensor
       from time import sleep

#. Inicializa un LED RGB con los componentes rojo, verde y azul conectados a los pines GPIO 18, 27 y 22, respectivamente. También inicializa un sensor PIR en el pin GPIO 17.

   .. code-block:: python

       # Inicializar LED RGB y sensor de movimiento PIR utilizando la biblioteca GPIO Zero
       led = RGBLED(red=18, green=27, blue=22)  # LED RGB conectado a los pines GPIO 18 (Rojo), 27 (Verde), 22 (Azul)
       pir = MotionSensor(17)  # Sensor PIR conectado al pin GPIO 17

#. El programa entra en un bucle infinito, revisando continuamente el movimiento con el sensor PIR. Si se detecta movimiento, el LED se ilumina en amarillo (mezcla de rojo y verde). Si no se detecta movimiento, el LED se enciende en azul. Una pequeña pausa de 0.1 segundos reduce la carga de la CPU.

   .. code-block:: python

       try:
           # Monitorear continuamente el movimiento y actualizar el color del LED
           while True:
               if pir.motion_detected:  # Verificar si el sensor PIR detecta movimiento
                   led.color = (1, 1, 0)  # Configurar el color del LED a amarillo (Rojo + Verde)
               else:
                   led.color = (0, 0, 1)  # Configurar el color del LED a azul (solo Azul)
               sleep(0.1)  # Pequeño retardo para reducir la carga de la CPU

       except KeyboardInterrupt:
           # Manejar KeyboardInterrupt (Ctrl+C) para salir del bucle de manera segura
           pass
