.. note::

    Bonjour et bienvenue dans la communauté SunFounder pour les passionnés de Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez au cœur de Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.

    **Pourquoi rejoindre ?**

    - **Support d'experts** : Résolvez vos problèmes après-vente et vos défis techniques grâce à l'aide de notre communauté et de notre équipe.
    - **Apprendre & Partager** : Échangez des astuces et des tutoriels pour perfectionner vos compétences.
    - **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus exclusifs.
    - **Réductions spéciales** : Profitez de réductions exclusives sur nos nouveaux produits.
    - **Promotions festives et concours** : Participez à des concours et à des promotions spéciales pendant les fêtes.

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

3.1.5 Indicateur de batterie
===============================

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

Dans ce cours, nous allons fabriquer un dispositif indicateur de batterie qui peut 
afficher visuellement le niveau de charge sur un bargraphe LED.

Composants
-------------

.. image:: img/list_Battery_Indicator.png
    :align: center

Schéma de câblage
---------------------

============ ======== ======== ===
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:: img/Schematic_three_one5.png
   :align: center

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

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

.. image:: img/image248.png
   :width: 800
   :align: center

**Pour les utilisateurs du langage C**
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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

.. raw:: html

   <run></run>

.. code-block:: 

    cd ~/davinci-kit-for-raspberry-pi/c/3.1.5/

**Étape 3 :** Compilez le code.

.. raw:: html

   <run></run>

.. code-block:: 

    gcc 3.1.5_BatteryIndicator.c -lwiringPi

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

.. raw:: html

   <run></run>

.. code-block:: 

    sudo ./a.out

Après l'exécution du programme, connectez séparément la 3ème broche de l'ADC0834 et 
le GND à des fils de sortie, puis reliez-les aux deux pôles d'une batterie. Vous 
verrez que les LED correspondantes sur le bargraphe LED s'allument pour indiquer le 
niveau de charge (plage de mesure : 0-5V).

.. note::

    Si cela ne fonctionne pas après l'exécution ou si un message d'erreur apparaît : \"wiringPi.h: Aucun fichier ou dossier de ce type », veuillez vous référer à :ref:`C code is not working?`.

**Explication du code**

.. code-block:: c

    void LedBarGraph(int value){
        for(int i=0;i<10;i++){
            digitalWrite(pins[i],HIGH);
        }
        for(int i=0;i<value;i++){
            digitalWrite(pins[i],LOW);
        }
    }

Cette fonction permet de contrôler l'allumage ou l'extinction des 10 LED du bargraphe LED. 
Nous commençons par envoyer un signal de niveau haut aux 10 LED pour les éteindre, puis 
nous décidons combien de LED seront allumées en fonction de la valeur analogique reçue.

.. code-block:: c

    int main(void)
    {
        uchar analogVal;
        if(wiringPiSetup() == -1){ // Si l'initialisation de WiringPi échoue, afficher un message à l'écran
            printf("setup wiringPi failed !");
            return 1;
        }
        pinMode(ADC_CS,  OUTPUT);
        pinMode(ADC_CLK, OUTPUT);
        for(int i=0;i<10;i++){       // Définir les broches des LED en mode sortie
            pinMode(pins[i], OUTPUT);
            digitalWrite(pins[i],HIGH);
        }
        while(1){
            analogVal = get_ADC_Result(0);
            LedBarGraph(analogVal/25);
            delay(100);
        }
        return 0;
    }

`analogVal` produit des valeurs (**0-255**) selon la variation de la tension (**0-5V**), 
par exemple, si une tension de 3V est détectée sur une batterie, la valeur correspondante
 **152** s'affiche sur le voltmètre.

Les **10** LED du bargraphe sont utilisées pour afficher les valeurs de `analogVal`. 
255/10=25, donc chaque augmentation de **25** de la valeur analogique allume une LED 
supplémentaire, par exemple, si `analogVal=150` (environ 3V), 6 LED s'allument.

**Pour les utilisateurs du langage Python**
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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

.. raw:: html

   <run></run>

.. code-block::

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

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

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 3.1.5_BatteryIndicator.py

Après l'exécution du programme, connectez séparément la 3ème broche de l'ADC0834 et 
le GND à des fils de sortie, puis reliez-les aux deux pôles d'une batterie. Vous 
verrez que les LED correspondantes sur le bargraphe LED s'allument pour indiquer 
le niveau de charge (plage de mesure : 0-5V).

**Code**

.. note::

    Vous pouvez **modifier/réinitialiser/copier/exécuter/arrêter** le code ci-dessous. Mais avant cela, vous devez vous rendre sur le chemin du code source comme ``davinci-kit-for-raspberry-pi/python``.
    
.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import ADC0834
    import time

    ledPins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26]

    def setup():
        GPIO.setmode(GPIO.BCM)
        ADC0834.setup()
        for i in ledPins:
            GPIO.setup(i, GPIO.OUT)
            GPIO.output(i, GPIO.HIGH)

    def LedBarGraph(value):
        for i in ledPins:
            GPIO.output(i,GPIO.HIGH)
        for i in range(value):
            GPIO.output(ledPins[i],GPIO.LOW)

    def destroy():
        GPIO.cleanup()

    def loop():
        while True:
            analogVal = ADC0834.getResult()
            LedBarGraph(int(analogVal/25))

    if __name__ == '__main__':
        setup()
        try:
            loop()
        except KeyboardInterrupt: # Quand 'Ctrl+C' est pressé, la fonction destroy() sera exécutée.
            destroy()

**Explication du code**

.. code-block:: python

    def LedBarGraph(value):
        for i in ledPins:
            GPIO.output(i,GPIO.HIGH)
        for i in range(value):
            GPIO.output(ledPins[i],GPIO.LOW)

Cette fonction permet de contrôler l'allumage ou l'extinction des **10** LED du 
bargraphe LED. Nous commençons par envoyer un signal de niveau haut aux **10** 
LED pour les éteindre, puis nous décidons combien de LED seront allumées en fonction 
de la valeur analogique reçue.

.. code-block:: python

    def loop():
        while True:
            analogVal = ADC0834.getResult()
            LedBarGraph(int(analogVal/25))

`analogVal` produit des valeurs (**0-255**) selon la variation de la tension (**0-5V**), 
par exemple, si une tension de 3V est détectée sur une batterie, la valeur correspondante 
**152** s'affiche sur le voltmètre.

Les **10** LED du bargraphe sont utilisées pour afficher les valeurs de `analogVal`. 
255/10=25, donc chaque augmentation de **25** de la valeur analogique allume une LED 
supplémentaire, par exemple, si `analogVal=150` (environ 3V), 6 LED s'allument.


Image du phénomène
-----------------------

.. image:: img/image249.jpeg
   :align: center
