.. 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
======================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
Dependiendo de la versión de su kit, identifique si tiene **ADC0834** o **MCP3008** y continúe con la sección correspondiente.
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_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
.. code-block::
cd ~/raphael-kit/python-pi5
**Paso 3:** Ejecutar el archivo ejecutable.
.. raw:: html
.. 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
.. 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