.. note::

    Bonjour, bienvenue dans la communauté Facebook des passionnés de SunFounder Raspberry Pi & Arduino & ESP32 ! 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 derniers produits.
    - **Promotions festives et cadeaux** : Participez à des tirages au sort 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 !

2.2.1 Photoresistor
====================

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

La photoresistance est un composant couramment utilisé pour mesurer l'intensité 
lumineuse ambiante dans la vie quotidienne. Elle aide le contrôleur à reconnaître 
le jour et la nuit et à réaliser des fonctions de contrôle de la lumière, comme les 
lampes nocturnes. Ce projet est très similaire au potentiomètre, mais au lieu de 
changer la tension, il permet de détecter la lumière.

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

.. image:: img/list_2.2.1_photoresistor.png


Principe
------------

Une photoresistance, ou cellule photoélectrique, est une résistance variable contrôlée 
par la lumière. La résistance d'une photoresistance diminue à mesure que l'intensité 
lumineuse incidente augmente ; en d'autres termes, elle présente une photoconductivité. 
Une photoresistance peut être utilisée dans des circuits détecteurs sensibles à la lumière, 
ainsi que dans des circuits de commutation activés par la lumière ou l'obscurité.

.. image:: img/image196.png
    :width: 200
    :align: center


Schéma de principe
----------------------

.. image:: img/image321.png


.. image:: img/image322.png


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

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

.. image:: img/image198.png
    :width: 800



Pour les utilisateurs de langage C
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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

.. raw:: html

   <run></run>

.. code-block::

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

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

.. raw:: html

   <run></run>

.. code-block::

    gcc 2.2.1_Photoresistor.c -lwiringPi

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

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

Le programme se lance et la luminosité de la LED variera en fonction de 
l'intensité de la lumière détectée par la photoresistance.

.. note::

    Si cela ne fonctionne pas après l'exécution, ou s'il y a un message 
    d'erreur indiquant : \"wiringPi.h: Aucun fichier ou répertoire de ce 
    type\", veuillez vous référer à :ref:`C code is not working?`.
**Code**

.. code-block:: c

    #include <wiringPi.h>
    #include <stdio.h>
    #include <softPwm.h>

    typedef unsigned char uchar;
    typedef unsigned int uint;

    #define     ADC_CS    0
    #define     ADC_CLK   1
    #define     ADC_DIO   2
    #define     LedPin    3

    uchar get_ADC_Result(uint channel)
    {
        uchar i;
        uchar dat1=0, dat2=0;
        int sel = channel > 1 & 1;
        int odd = channel & 1;

        digitalWrite(ADC_CLK, 1);
        delayMicroseconds(2);
        digitalWrite(ADC_CLK, 0);
        delayMicroseconds(2);

        pinMode(ADC_DIO, OUTPUT);
        digitalWrite(ADC_CS, 0);
        // Start bit
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        // Mode entrée unique
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        // Impair
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,odd);  delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        // Sélection
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,sel);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);

        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);

        for(i=0;i<8;i++)
        {
            digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
            digitalWrite(ADC_CLK,0);    delayMicroseconds(2);

            pinMode(ADC_DIO, INPUT);
            dat1=dat1<<1 | digitalRead(ADC_DIO);
        }

        for(i=0;i<8;i++)
        {
            dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
            digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
            digitalWrite(ADC_CLK,0);    delayMicroseconds(2);
        }

        digitalWrite(ADC_CS,1);
        pinMode(ADC_DIO, OUTPUT);
        return(dat1==dat2) ? dat1 : 0;
    }

    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;
        }
        softPwmCreate(LedPin,  0, 100);
        pinMode(ADC_CS,  OUTPUT);
        pinMode(ADC_CLK, OUTPUT);

        while(1){
            analogVal = get_ADC_Result(0);
            printf("Current analogVal : %d\n", analogVal);
            delay(100);
            softPwmWrite(LedPin, analogVal);
            delay(100);
        }
        return 0;
    }

**Explication du code**

Les codes ici sont les mêmes que dans la section 2.1.4 Potentiomètre. Si vous avez d'autres questions, veuillez consulter l'explication du code dans **2.1.4 Potentiomètre.c** pour plus de détails.

Pour les utilisateurs de 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 2.2.1_Photoresistor.py

Le programme s'exécute et la luminosité de la LED variera en fonction de 
l'intensité lumineuse détectée par la photoresistance.

**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 source du code comme ``davinci-kit-for-raspberry-pi/python``.
    
.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import ADC0834
    import time

    LedPin = 22

    def setup():
        global led_val
        # Configurer les modes GPIO en numérotation BCM
        GPIO.setmode(GPIO.BCM)
        # Définir le mode de LedPin en sortie avec un niveau initial à High (3.3v)
        GPIO.setup(LedPin, GPIO.OUT, initial=GPIO.HIGH)
        ADC0834.setup()
        # Configurer LedPin en canal PWM avec une fréquence de 2 KHz
        led_val = GPIO.PWM(LedPin, 2000)

        # Initialiser avec une valeur de 0
        led_val.start(0)

    def destroy():
        # Arrêter tous les canaux PWM
        led_val.stop()
        # Libérer les ressources
        GPIO.cleanup()

    def loop():
        while True:
            analogVal = ADC0834.getResult()
            print ('analog value = %d' % analogVal)
            led_val.ChangeDutyCycle(analogVal*100/255)
            time.sleep(0.2)

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

**Explication du code**

.. code-block:: python

    def loop():
        while True:
            analogVal = ADC0834.getResult()
            print ('analog value = %d' % analogVal)
            led_val.ChangeDutyCycle(analogVal*100/255)
            time.sleep(0.2)

Lire la valeur analogique de CH0 d'ADC0834. Par défaut, la fonction getResult() est 
utilisée pour lire la valeur de CH0. Si vous souhaitez lire d'autres canaux, veuillez 
entrer 1, 2 ou 3 dans les parenthèses de la fonction getResult(). Ensuite, il suffit 
d'afficher la valeur avec la fonction print. Comme l'élément de changement est le cycle 
de service de LedPin, la formule de calcul analogVal*100/255 est nécessaire pour convertir 
analogVal en pourcentage. Enfin, la fonction ChangeDutyCycle() est appelée pour écrire ce 
pourcentage dans LedPin.


Photo du phénomène
------------------------

.. image:: img/image199.jpeg
