 
.. note::

    Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.

    **Pourquoi rejoindre ?**

    - **Support d'experts** : Résolvez les problèmes après-vente et les défis techniques avec l'aide de notre communauté et de notre équipe.
    - **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
    - **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus.
    - **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents.
    - **Promotions festives et cadeaux** : Participez à des cadeaux et des promotions de vacances.

    👉 Prêt à explorer et à créer avec nous ? Cliquez [|link_sf_facebook|] et rejoignez-nous aujourd'hui !

.. _4.1.11_py_pi5:

4.1.8 Indicateur de Batterie
===================================

Introduction
--------------

Dans ce projet, nous allons créer un dispositif d'indication de batterie qui 
peut afficher visuellement le niveau de la batterie sur le Bargraph LED.

Composants nécessaires
------------------------------

Pour ce projet, nous avons besoin des composants suivants.

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

Il est certainement pratique d'acheter un kit complet, voici le lien : 

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

    *   - Nom	
        - ÉLÉMENTS DANS CE KIT
        - LIEN
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

Vous pouvez également les acheter séparément via les liens ci-dessous.

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

    *   - INTRODUCTION AUX COMPOSANTS
        - LIEN D'ACHAT

    *   - :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_bar_graph`
        - \-
    *   - :ref:`cpn_adc0834`
        - \-

Schéma
-------------------

============ ======== ======== ===
Nom T-Board  Physique 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

Procédures expérimentales
------------------------------

**Étape 1 :** Construire le circuit.

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

**Étape 2 :** Accédez au dossier du code.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python-pi5

**Étape 3 :** Exécutez le fichier exécutable.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 4.1.11_BatteryIndicator_zero.py

Après le démarrage du programme, connectez séparément un fil de sortie au 3ème 
pin de l'ADC0834 et à la masse, puis connectez-les aux deux pôles d'une batterie. 
Vous verrez la LED correspondante sur le Bargraph LED s'allumer pour afficher le 
niveau de charge (plage de mesure : 0-5V).

.. warning::

    Si vous recevez le message d'erreur ``RuntimeError: Cannot determine SOC peripheral base address``, veuillez consulter :ref:`faq_soc`

**Code**

.. note::
    Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez accéder au chemin du code source comme ``raphael-kit/python-pi5``. Après avoir modifié le code, vous pouvez l'exécuter directement pour voir l'effet.

.. raw:: html

    <run></run>

.. code-block:: python

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

   # List of GPIO pins to which LEDs are connected
   ledPins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26]
   # Initialize LED objects for each pin in the list
   leds = [LED(pin) for pin in ledPins]

   # Setup ADC0834 module
   ADC0834.setup()

   def LedBarGraph(value):
       # Turn off all LEDs
       for i in range(10):
           leds[i].off()
       # Turn on LEDs up to the specified value
       for i in range(value):
           leds[i].on()

   try:
       # Main loop to continuously update LED bar graph
       while True:
           # Read analog value from ADC0834
           analogVal = ADC0834.getResult()
           # Convert analog value to LED bar graph level
           LedBarGraph(int(analogVal/25))
   except KeyboardInterrupt: 
       # Turn off all LEDs when program is interrupted
       for i in range(10):
           leds[i].off()



**Explication du Code**

#. Cette section importe les bibliothèques nécessaires. ``gpiozero`` est utilisée pour contrôler les LED, ``ADC0834`` pour interfacer avec le module ADC, et ``time`` pour les opérations liées au temps.

   .. code-block:: python

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

#. Définit les broches GPIO auxquelles les LED sont connectées et initialise un tableau d'objets LED pour chaque broche. Cela permet de contrôler facilement chaque LED du tableau.

   .. code-block:: python

       # List of GPIO pins to which LEDs are connected
       ledPins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26]
       # Initialize LED objects for each pin in the list
       leds = [LED(pin) for pin in ledPins]

#. Initialise le module ADC0834 pour la conversion analogique-numérique.

   .. code-block:: python

       # Setup ADC0834 module
       ADC0834.setup()

#. Cette fonction éteint toutes les LED puis allume un certain nombre de LED en fonction de la valeur d'entrée, créant ainsi une représentation en barres graphiques.

   .. code-block:: python

       def LedBarGraph(value):
           # Turn off all LEDs
           for i in range(10):
               leds[i].off()
           # Turn on LEDs up to the specified value
           for i in range(value):
               leds[i].on()

#. Lit continuellement la valeur analogique de l'ADC0834 et met à jour le bargraphe LED en fonction de cette valeur. La valeur analogique est réduite à une plage de 0-10 pour les 10 LED.

   .. code-block:: python

       try:
           # Main loop to continuously update LED bar graph
           while True:
               # Read analog value from ADC0834
               analogVal = ADC0834.getResult()
               # Convert analog value to LED bar graph level
               LedBarGraph(int(analogVal/25))

#. S'assure que toutes les LED sont éteintes lorsque le programme est interrompu (par exemple, en appuyant sur Ctrl+C).

   .. code-block:: python

       except KeyboardInterrupt: 
           # Turn off all LEDs when program is interrupted
           for i in range(10):
               leds[i].off()