.. 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.
    - **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 nuevos.
    - **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 mismo!

.. _2.2.1_py_pi5:

2.2.1 Fotorresistor
======================

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

El fotorresistor es un componente comúnmente utilizado para medir la intensidad de la 
luz ambiental. Ayuda al controlador a reconocer el día y la noche y realizar funciones 
de control de luz, como una lámpara nocturna. Este proyecto es muy similar al del potenciómetro, 
y podrías pensar que cambia el voltaje para detectar la luz.


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

En este proyecto, necesitamos los siguientes componentes.

.. image:: ../python_pi5/img/2.2.1_photoresistor_list.png

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

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

    *   - Nombre	
        - ARTÍCULOS 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 DEL 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_adc0834`
        - \-
    *   - :ref:`cpn_photoresistor`
        - |link_photoresistor_buy|

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

.. image:: ../python_pi5/img/2.2.1_photoresistor_schematic_1.png


.. image:: ../python_pi5/img/2.2.1_photoresistor_schematic_2.png


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

**Paso 1:** Montar el circuito.

.. image:: ../python_pi5/img/2.2.1_photoresistor_circuit.png

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

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python-pi5

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

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 2.2.1_Photoresistor_zero.py

Cuando el código se esté ejecutando, la intensidad del LED cambiará según la intensidad de luz detectada por el fotorresistor.

.. warning::

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

**Código**

.. note::

    Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes de eso, debes ir a la ruta del código fuente como ``raphael-kit/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 PWMLED
   import ADC0834
   import time

   # Inicializar un LED PWM en el pin GPIO 22
   led = PWMLED(22)

   # Configurar el módulo ADC0834
   ADC0834.setup()

   # Definir una función para mapear valores de un rango a otro
   def MAP(x, in_min, in_max, out_min, out_max):
       return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

   # Bucle principal para leer el valor del ADC y controlar el brillo del LED
   def loop():
       while True:
           # Leer valor analógico del ADC
           analogVal = ADC0834.getResult()
           print('value = %d' % analogVal)

           # Mapear el valor del ADC a un valor PWM y establecer el brillo del LED
           led.value = float(analogVal/255)

           # Esperar 0.2 segundos
           time.sleep(0.2)

   # Ejecutar el bucle principal y manejar KeyboardInterrupt para un apagado ordenado
   try:
       loop()
   except KeyboardInterrupt: 
       # Apagar el LED antes de salir
       led.value = 0


**Explicación del Código**

#. Este segmento importa la clase PWMLED de la biblioteca gpiozero, necesaria para controlar LEDs PWM. También incluye el módulo ADC0834 para la interfaz con el convertidor analógico-digital, y el módulo time para ejecutar funciones basadas en el tiempo, como sleep.

   .. code-block:: python

       #!/usr/bin/env python3
       from gpiozero import PWMLED
       import ADC0834
       import time

#. Inicializa un LED PWM conectado al pin GPIO 22 y configura el módulo ADC0834, preparándolo para su uso en el proyecto.

   .. code-block:: python

       # Inicializar un LED PWM en el pin GPIO 22
       led = PWMLED(22)

       # Configurar el módulo ADC0834
       ADC0834.setup()

#. Define una función para mapear un valor de entrada de un rango a otro. Esta función es crucial para traducir las lecturas del ADC en un rango adecuado para el control PWM.

   .. code-block:: python

       # Definir una función para mapear valores de un rango a otro
       def MAP(x, in_min, in_max, out_min, out_max):
           return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

#. Esta sección contiene un bucle que lee continuamente el valor analógico del ADC0834, lo mapea a un valor PWM correspondiente y ajusta el brillo del LED. Se incluye una breve pausa (`time.sleep(0.2)`) para hacer visibles los cambios y evitar sobrecargar la CPU.

   .. code-block:: python

       # Bucle principal para leer el valor del ADC y controlar el brillo del LED
       def loop():
           while True:
               # Leer valor analógico del ADC
               analogVal = ADC0834.getResult()
               print('value = %d' % analogVal)

               # Mapear el valor del ADC a un valor PWM y ajustar el brillo del LED
               led.value = float(analogVal/255)

               # Esperar 0.2 segundos
               time.sleep(0.2)

#. Ejecuta la función loop e incluye el manejo de errores para un apagado ordenado en caso de una interrupción de teclado. Asegura que el LED se apague cuando se detenga el programa.

   .. code-block:: python

       # Ejecutar el bucle principal y manejar KeyboardInterrupt para un apagado ordenado
       try:
           loop()
       except KeyboardInterrupt: 
           # Apagar el LED antes de salir
           led.value = 0

