.. 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 la 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.

.. _1.3.4_py_pi5:

1.3.4 Relé
=============

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

En este proyecto, aprenderemos a utilizar un relé, uno de los componentes 
más comunes en los sistemas de control automático. Cuando la tensión, corriente, 
temperatura, presión, etc., alcanza, supera o está por debajo de un valor 
predeterminado, el relé conecta o interrumpe el circuito para controlar y proteger 
el equipo.

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

En este proyecto, necesitamos los siguientes componentes. 

.. image:: ../python_pi5/img/1.3.4_relay_list.png

.. raw:: html

   <br/>

Diagrama de Conexiones
--------------------------

.. image:: ../python_pi5/img/1.3.4_relay_schematic.png


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

**Paso 1:** Construye el circuito.

.. image:: ../python_pi5/img/1.3.4_relay_circuit.png

**Paso 2:** Abre el archivo de código.

.. 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 1.3.4_Relay.py

Al ejecutar el código, el LED se encenderá. Además, podrás escuchar un 
tic-tac producido por la apertura del contacto normalmente cerrado y el 
cierre del contacto normalmente abierto.

.. 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 OutputDevice  # Importa la clase para controlar pines GPIO
   from time import sleep  # Importa la función sleep para añadir retardo

   # Inicializa el relé conectado al pin GPIO 17
   relay = OutputDevice(17)

   try:
       # Bucle para alternar continuamente el estado del relé cada segundo
       while True:
           print('Relay open...')  # Informa que el relé está activado
           relay.on()  # Enciende el relé (suponiendo configuración activa baja)
           sleep(1)   # Mantén el relé encendido durante 1 segundo

           print('...Relay close')  # Informa que el relé está desactivado
           relay.off()  # Apaga el relé
           sleep(1)   # Mantén el relé apagado durante 1 segundo

   except KeyboardInterrupt:
       # Maneja una interrupción de teclado (Ctrl+C) para salir del bucle
       relay.off()  # Asegura que el relé esté apagado antes de salir
       pass


**Explicación del Código**

#. Se importan ``OutputDevice`` de ``gpiozero`` para el control de pines GPIO y ``sleep`` de ``time`` para añadir retardos.

   .. code-block:: python

       #!/usr/bin/env python3
       from gpiozero import OutputDevice  # Importa la clase para controlar pines GPIO
       from time import sleep  # Importa la función sleep para añadir retardo

#. Inicializa un objeto ``OutputDevice`` para el relé conectado al pin GPIO 17. 

   .. code-block:: python

       # Inicializa el relé conectado al pin GPIO 17
       relay = OutputDevice(17)

#. Dentro del bloque ``try``, un bucle ``while True`` alterna continuamente el estado del relé. El relé se enciende y apaga con un retardo de 1 segundo entre cada estado, acompañado de mensajes en la consola.

   .. code-block:: python

       try:
           # Bucle para alternar continuamente el estado del relé cada segundo
           while True:
               print('Relay open...')  # Informa que el relé está activado
               relay.on()  # Enciende el relé (suponiendo configuración activa baja)
               sleep(1)   # Mantén el relé encendido durante 1 segundo

               print('...Relay close')  # Informa que el relé está desactivado
               relay.off()  # Apaga el relé
               sleep(1)   # Mantén el relé apagado durante 1 segundo

#. Captura una interrupción de teclado (como Ctrl+C) para permitir una finalización del script de forma segura. El relé se apaga antes de salir del script.

   .. code-block:: python
      
      except KeyboardInterrupt:
      # Maneja una interrupción de teclado (Ctrl+C) para salir del bucle
      relay.off()  # Asegura que el relé esté apagado antes de salir
      pass

