.. note::

    ¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Únete a otros entusiastas y explora más a fondo Raspberry Pi, Arduino y ESP32.

    **¿Por qué unirse?**

    - **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.
    - **Vistas previas exclusivas**: Obtén acceso anticipado a anuncios de nuevos productos y adelantos.
    - **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_btr_indicator:

3.1.5 Indicador de Batería
=============================

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

En este proyecto, crearemos un dispositivo de indicador de batería que 
muestra visualmente el nivel de batería en el Bargraph LED.

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

En este proyecto, necesitamos los siguientes componentes.

.. image:: ../python_pi5/img/4.1.11_battery_indicator_list.png
    :align: center

.. 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:`gpio_extension_board`
..         - |link_gpio_board_buy|
..     *   - :ref:`breadboard`
..         - |link_breadboard_buy|
..     *   - :ref:`wires`
..         - |link_wires_buy|
..     *   - :ref:`resistor`
..         - |link_resistor_buy|
..     *   - :ref:`bar_graph`
..         - \-
..     *   - :ref:`adc0834`
..         - \-

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

============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17       Pin 11   0        17
GPIO18       Pin 12   1        18
GPIO27       Pin 13   2        27
GPIO25       Pin 22   6        25
GPIO12       Pin 32   26       12
GPIO16       Pin 36   27       16
GPIO20       Pin 38   28       20
GPIO21       Pin 40   29       21
GPIO5        Pin 29   21       5
GPIO6        Pin 31   22       6
GPIO13       Pin 33   23       13
GPIO19       Pin 35   24       19
GPIO26       Pin 37   25       26
============ ======== ======== ===

.. image:: ../python_pi5/img/4.1.11_battery_indicator_schematic.png
   :align: center

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

**Paso 1:** Construir el circuito.

.. image:: ../python_pi5/img/4.1.11_battery_indicator_circuit.png

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

.. raw:: html

   <run></run>

.. code-block::

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

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

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 3.1.5_BatteryIndicator.py

Después de ejecutar el programa, conecta un cable desde el tercer pin 
del ADC0834 y otro desde el GND, y dirígelos a los dos polos de una batería. 
Verás que el LED correspondiente en el Bargraph LED se ilumina para mostrar 
el nivel de carga (rango de medición: 0-5V).

.. warning::

    Si aparece el 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 ``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 LED
   import ADC0834
   import time

   # Lista de pines GPIO a los que están conectados los LEDs
   ledPins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26]
   # Inicializa objetos LED para cada pin en la lista
   leds = [LED(pin) for pin in ledPins]

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

   def LedBarGraph(value):
       # Apaga todos los LEDs
       for i in range(10):
           leds[i].off()
       # Enciende LEDs hasta el valor especificado
       for i in range(value):
           leds[i].on()

   try:
       # Bucle principal para actualizar continuamente el gráfico de barras de LEDs
       while True:
           # Lee el valor analógico del ADC0834
           analogVal = ADC0834.getResult()
           # Convierte el valor analógico al nivel del gráfico de barras LED
           LedBarGraph(int(analogVal/25))
   except KeyboardInterrupt: 
       # Apaga todos los LEDs cuando se interrumpe el programa
       for i in range(10):
           leds[i].off()



**Explicación del Código**

#. Esta sección importa las bibliotecas necesarias. ``gpiozero`` es para controlar los LEDs, ``ADC0834`` para la interfaz con el módulo ADC y ``time`` para operaciones relacionadas con el tiempo.

   .. code-block:: python

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

#. Define los pines GPIO a los que están conectados los LEDs e inicializa una matriz de objetos LED para cada pin, lo que permite un control fácil de cada LED en la matriz.

   .. code-block:: python

       # Lista de pines GPIO a los que están conectados los LEDs
       ledPins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26]
       # Inicializa objetos LED para cada pin en la lista
       leds = [LED(pin) for pin in ledPins]

#. Inicializa el módulo ADC0834 para la conversión de analógico a digital.

   .. code-block:: python

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

#. Esta función apaga todos los LEDs y luego enciende un número de LEDs basado en el valor de entrada, creando efectivamente una representación gráfica de barras.

   .. code-block:: python

       def LedBarGraph(value):
           # Apaga todos los LEDs
           for i in range(10):
               leds[i].off()
           # Enciende LEDs hasta el valor especificado
           for i in range(value):
               leds[i].on()

#. Lee continuamente el valor analógico del ADC0834 y actualiza el gráfico de barras de LEDs según este valor. El valor analógico se reduce a un rango de 0-10 para los 10 LEDs.

   .. code-block:: python

       try:
           # Bucle principal para actualizar continuamente el gráfico de barras LED
           while True:
               # Lee el valor analógico del ADC0834
               analogVal = ADC0834.getResult()
               # Convierte el valor analógico al nivel del gráfico de barras LED
               LedBarGraph(int(analogVal/25))

#. Asegura que todos los LEDs se apaguen cuando se interrumpe el programa (por ejemplo, al presionar Ctrl+C).

   .. code-block:: python

       except KeyboardInterrupt: 
           # Apaga todos los LEDs cuando se interrumpe el programa
           for i in range(10):
               leds[i].off()