 
.. 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 !

.. _2.1.7_py_pi5:

2.1.7 Potentiomètre
=======================

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

La fonction ADC peut être utilisée pour convertir des signaux analogiques en signaux numériques, 
et dans cette expérience, nous utilisons l'ADC0834 pour obtenir cette fonctionnalité. Ici, 
nous réalisons ce processus en utilisant un potentiomètre. Le potentiomètre modifie la quantité 
physique — la tension, qui est convertie par la fonction ADC.


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

Dans ce projet, nous avons besoin des composants suivants.

.. image:: ../python_pi5/img/2.1.7_potentiometer_list.png

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

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

    *   - Nom	
        - ARTICLES 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 DU COMPOSANT
        - 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_led`
        - |link_led_buy|
    *   - :ref:`cpn_potentiometer`
        - |link_potentiometer_buy|
    *   - :ref:`cpn_adc0834`
        - \-

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

.. image:: ../python_pi5/img/2.1.7_potentiometer_second_1.png


.. image:: ../python_pi5/img/2.1.7_potentiometer_second_2.png

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

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

.. image:: ../python_pi5/img/2.1.7_Potentiometer_circuit.png


.. note::
    Veuillez placer la puce en vous référant à la position correspondante représentée 
    dans l'image. Notez que les encoches sur la puce doivent être à gauche lorsqu'elle 
    est placée.

**Étape 2 :** Ouvrez le fichier de code.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python-pi5

**Étape 3 :** Exécutez.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 2.1.7_Potentiometer_zero.py

Après l'exécution du code, tournez le bouton du potentiomètre, l'intensité de la 
LED changera en conséquence.

.. 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 vous rendre 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 PWMLED
   import ADC0834
   import time

   # Initialize a PWM LED on GPIO pin 22
   led = PWMLED(22)

   # Set up the ADC0834 module
   ADC0834.setup()

   def MAP(x, in_min, in_max, out_min, out_max):
       """
       Map a value from one range to another.
       :param x: The value to be mapped.
       :param in_min: The lower bound of the value's current range.
       :param in_max: The upper bound of the value's current range.
       :param out_min: The lower bound of the value's target range.
       :param out_max: The upper bound of the value's target range.
       :return: The mapped value.
       """
       return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

   try:
       while True:
           # Get the current reading from the ADC0834 module
           res = ADC0834.getResult()
           print('res = %d' % res)

           # Map the ADC value to a range suitable for setting LED brightness
           R_val = MAP(res, 0, 255, 0, 100)

           # Set the LED brightness
           led.value = float(R_val / 100)

           # Wait for 0.2 seconds before reading again
           time.sleep(0.2)

   # Graceful exit when 'Ctrl+C' is pressed
   except KeyboardInterrupt: 
       led.value = 0  # Turn off the LED


**Explication du code**

#. ``gpiozero`` pour le contrôle de la LED PWM, ``ADC0834`` pour la conversion analogique-numérique, et ``time`` pour implémenter des délais.

   .. code-block:: python

       #!/usr/bin/env python3

       from gpiozero import PWMLED
       import ADC0834
       import time

#. Initialisez un objet PWMLED connecté à la broche GPIO 22 et configurez le convertisseur ADC0834.

   .. code-block:: python

       # Initialize a PWM LED on GPIO pin 22
       led = PWMLED(22)

       # Set up the ADC0834 module
       ADC0834.setup()

#. Définir une fonction nommée ``MAP`` pour convertir une plage de valeurs en une autre, utile pour mapper les valeurs ADC aux niveaux de luminosité appropriés de la LED.

   .. code-block:: python

       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

#. Lire en continu la valeur de l'ADC dans une boucle, en mapant la lecture de l'ADC (0-255) à un niveau de luminosité (0-100) pour la LED. Ajuster la luminosité de la LED en fonction de cette valeur mappée. Implémenter un délai de 0,2 seconde pour une meilleure lisibilité et stabilité.

   .. code-block:: python

       try:
           while True:
               # Get the current reading from the ADC0834 module
               res = ADC0834.getResult()
               print('res = %d' % res)

               # Map the ADC value to a range suitable for setting LED brightness
               R_val = MAP(res, 0, 255, 0, 100)

               # Set the LED brightness
               led.value = float(R_val / 100)

               # Wait for 0.2 seconds before reading again
               time.sleep(0.2)

       # Graceful exit when 'Ctrl+C' is pressed
       except KeyboardInterrupt: 
           led.value = 0  # Turn off the LED