.. note::

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

    **Pourquoi nous 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 & 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 concours** : Participez à des concours et promotions 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.4 Capteur PIR
===================

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

Dans ce projet, nous allons fabriquer un dispositif à l'aide de capteurs 
pyroelectriques infrarouges pour le corps humain. Lorsque quelqu'un s'approche, 
la LED s'allumera automatiquement. Sinon, la lumière s'éteindra. Ce capteur de 
mouvement infrarouge est un type de capteur capable de détecter l'infrarouge émis 
par les humains et les animaux.

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

.. image:: img/list_2.2.4_pir.png


Principe
--------

Le capteur PIR détecte la radiation thermique infrarouge émise par des organismes et 
peut être utilisé pour détecter la présence d'êtres vivants qui émettent cette radiation.

Le capteur PIR est divisé en deux emplacements reliés à un amplificateur différentiel. 
Lorsque qu'un objet immobile se trouve devant le capteur, les deux emplacements reçoivent 
la même quantité de radiation, et la sortie est nulle. Lorsqu'un objet en mouvement 
passe devant le capteur, l'un des emplacements reçoit plus de radiation que l'autre, 
provoquant une variation de la sortie en tension. Cette variation est le résultat de 
la détection du mouvement.

.. image:: img/image211.png
    :width: 200



Après le câblage du module, une phase d'initialisation d'une minute commence. Pendant 
cette phase, le module émettra de 0 à 3 impulsions à intervalles réguliers. Ensuite, 
le module passe en mode veille. Veillez à éloigner les sources lumineuses et autres 
interférences de la surface du module pour éviter les erreurs causées par des signaux 
parasites. Il est préférable d'utiliser le module dans un environnement sans trop de vent, 
car cela peut aussi affecter le capteur.

.. image:: img/image212.png
    :width: 400



**Réglage de la distance**


En tournant le bouton du potentiomètre de réglage de la distance dans le sens des aiguilles 
d'une montre, la portée de détection augmente, la portée maximale de détection est d'environ 
0 à 7 mètres. Si vous tournez le bouton dans le sens inverse, la portée de détection diminue, 
avec une portée minimale d'environ 0 à 3 mètres.

**Réglage du délai**


En tournant le bouton du potentiomètre de réglage du délai dans le sens des aiguilles 
d'une montre, vous pouvez augmenter le délai de détection, qui peut atteindre un maximum 
de 300 secondes. Inversement, en le tournant dans le sens inverse, vous pouvez réduire le 
délai avec un minimum de 5 secondes.

Deux modes de déclenchement : (choix du mode via un cavalier).

-  **H : Mode de déclenchement répétitif**, après détection d'une présence humaine, le 
module émet un signal de niveau haut. Pendant la période de délai suivante, si quelqu'un 
entre dans la zone de détection, la sortie restera à un niveau haut.

-  **L : Mode de déclenchement non répétitif**, émet un signal de niveau haut lorsque la 
présence d'une personne est détectée. Après le délai, la sortie revient automatiquement à 
un niveau bas.



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

.. image:: img/image327.png


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

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

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



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

**Étape 2 :** Allez dans le dossier du code.

.. raw:: html

   <run></run>

.. code-block::

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

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

.. raw:: html

   <run></run>

.. code-block::

    gcc 2.2.4_PIR.c -lwiringPi

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

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

Après exécution du code, le PIR détecte les mouvements et fait briller la LED RGB en 
jaune s'il détecte quelqu'un qui passe. Il y a deux potentiomètres sur le module PIR : 
l'un pour régler la sensibilité et l'autre pour ajuster la distance de détection. Pour 
optimiser le fonctionnement du module PIR, tournez-les tous les deux dans le sens inverse 
des aiguilles d'une montre jusqu'à la butée.

.. image:: img/PIR_TTE.png

.. note::

    Si cela ne fonctionne pas après l'exécution, ou si une erreur apparaît: \"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 <softPwm.h>
    #include <stdio.h>
    #define uchar unsigned char

    #define pirPin    0     // le capteur PIR est connecté au GPIO0
    #define redPin    1
    #define greenPin  2
    #define bluePin   3

    void ledInit(void){
        softPwmCreate(redPin,  0, 100);
        softPwmCreate(greenPin,0, 100);
        softPwmCreate(bluePin, 0, 100);
    }
    void ledColorSet(uchar r_val, uchar g_val, uchar b_val){
        softPwmWrite(redPin,   r_val);
        softPwmWrite(greenPin, g_val);
        softPwmWrite(bluePin,  b_val);
    }
    int main(void)
    {
        int pir_val;
        if(wiringPiSetup() == -1){ // Si l'initialisation de wiringPi échoue, affiche un message
            printf("setup wiringPi failed !");
            return 1;
        }
        ledInit();
        pinMode(pirPin, INPUT);
        while(1){
            pir_val = digitalRead(pirPin);
            if(pir_val== 1){ // si la lecture du PIR est de niveau haut
                ledColorSet(0xff,0xff,0x00); // Allume la LED en jaune
            }
            else {
                ledColorSet(0x00,0x00,0xff); // Allume la LED en bleu
            }
        }
        return 0;
    }

**Explication du code**

.. code-block:: c

    void ledInit(void);
    void ledColorSet(uchar r_val, uchar g_val, uchar b_val);

Ces fonctions sont utilisées pour définir la couleur de la LED RGB. Veuillez vous 
référer à la section :ref:`1.1.2 RGB LED` pour plus de détails.

.. code-block:: c

    int main(void)
    {
        int pir_val;
        //……
        pinMode(pirPin, INPUT);
        while(1){
            pir_val = digitalRead(pirPin);
            if(pir_val== 1){ // si la lecture du PIR est de niveau haut
                ledColorSet(0xff,0xff,0x00); // Allume la LED en jaune
            }
            else {
                ledColorSet(0x00,0x00,0xff); // Allume la LED en bleu
            }
        }
        return 0;
    }

Lorsque le capteur PIR détecte un spectre infrarouge humain, la LED RGB s'allume en jaune ; sinon, elle s'allume en bleu.

Pour les utilisateurs de Python
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Étape 2 :** Allez dans le 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.4_PIR.py

Après l'exécution du code, le capteur PIR détecte les mouvements et fait briller 
la LED RGB en jaune lorsqu'il détecte quelqu'un. Il y a deux potentiomètres sur le 
module PIR : l'un pour ajuster la sensibilité et l'autre pour régler la distance de 
détection. Pour un meilleur fonctionnement du module PIR, tournez-les tous les deux 
dans le sens inverse des aiguilles d'une montre jusqu'à la fin.

.. image:: img/PIR_TTE.png

**Code**
.. note::

    Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez vous rendre dans le répertoire source du code, tel que ``davinci-kit-for-raspberry-pi/python``.
    
.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import time

    rgbPins = {'Red':18, 'Green':27, 'Blue':22}
    pirPin = 17    # le pir est connecté à la broche 17

    def setup():
        global p_R, p_G, p_B
        GPIO.setmode(GPIO.BCM)    # Configuration du mode GPIO en numérotation BCM
        GPIO.setup(pirPin, GPIO.IN)    # Configuration de pirPin en entrée
        # Configuration des broches LED en sortie et initialisation à un niveau haut (3,3v)
        for i in rgbPins:
            GPIO.setup(rgbPins[i], GPIO.OUT, initial=GPIO.HIGH)

        # Configuration de la PWM pour chaque LED avec une fréquence de 2 kHz
        p_R = GPIO.PWM(rgbPins['Red'], 2000)
        p_G = GPIO.PWM(rgbPins['Green'], 2000)
        p_B = GPIO.PWM(rgbPins['Blue'], 2000)

        # Initialisation des PWM à 0
        p_R.start(0)
        p_G.start(0)
        p_B.start(0)

    # Définition d'une fonction MAP pour convertir les valeurs de 0~255 à 0~100
    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

    # Définition d'une fonction pour régler les couleurs
    def setColor(color):
    # Configure la luminance des trois LEDs en fonction de la valeur de couleur
        # Extraction des valeurs RVB de la variable 'color'
        R_val = (color & 0xFF0000) >> 16
        G_val = (color & 0x00FF00) >> 8
        B_val = (color & 0x0000FF)
        # Conversion des valeurs de 0~255 à 0~100
        R_val = MAP(R_val, 0, 255, 0, 100)
        G_val = MAP(G_val, 0, 255, 0, 100)
        B_val = MAP(B_val, 0, 255, 0, 100)
        
        # Modification du cycle de fonctionnement de la PWM en fonction de la luminance calculée
        p_R.ChangeDutyCycle(R_val)
        p_G.ChangeDutyCycle(G_val)
        p_B.ChangeDutyCycle(B_val)

    def loop():
        while True:
            pir_val = GPIO.input(pirPin)
            if pir_val == GPIO.HIGH:
                setColor(0xFFFF00)  # Couleur jaune si mouvement détecté
            else :
                setColor(0x0000FF)  # Couleur bleue sinon

    def destroy():
        p_R.stop()
        p_G.stop()
        p_B.stop()
        GPIO.cleanup()  # Libération des ressources

    if __name__ == '__main__':  # Programme principal
        setup()
        try:
            loop()
        except KeyboardInterrupt:  # Exécution de la fonction destroy en cas d'interruption
            destroy()

**Explication du code**

.. code-block:: python

    rgbPins = {'Red':18, 'Green':27, 'Blue':22}

    def setup():
        global p_R, p_G, p_B
        GPIO.setmode(GPIO.BCM)
        # …
        for i in rgbPins:
            GPIO.setup(rgbPins[i], GPIO.OUT, initial=GPIO.HIGH)
        p_R = GPIO.PWM(rgbPins['Red'], 2000)
        p_G = GPIO.PWM(rgbPins['Green'], 2000)
        p_B = GPIO.PWM(rgbPins['Blue'], 2000)
        p_R.start(0)
        p_G.start(0)
        p_B.start(0)

    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

    def setColor(color):
    ...

Ces lignes de code sont utilisées pour régler la couleur de la LED RVB, veuillez consulter :ref:`1.1.2 LED RVB` pour plus de détails.

.. code-block:: python

    def loop():
        while True:
            pir_val = GPIO.input(pirPin)
            if pir_val==GPIO.HIGH:
                setColor(0xFFFF00)
            else :
                setColor(0x0000FF)

Lorsque le PIR détecte le spectre infrarouge d'un humain, la LED RVB émet une lumière jaune ; sinon, elle émet une lumière bleue.

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

.. image:: img/image215.jpeg