 
.. 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.7_py:

4.1.7 Dispositif de Comptage
===============================

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

Ici, nous allons créer un système de compteur affichant des chiffres, composé d'un capteur PIR et d'un affichage à 4 segments. Lorsque le capteur PIR détecte le passage de quelqu'un, le nombre sur l'affichage à 4 segments augmentera de 1. Vous pouvez utiliser ce compteur pour compter le nombre de personnes traversant le passage.

Composants Nécessaires
-------------------------

Pour ce projet, nous avons besoin des composants suivants.

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

.. image:: ../img/list_Counting_Device2.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	
        - 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 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_4_digit`
        - \-
    *   - :ref:`cpn_74hc595`
        - |link_74hc595_buy|
    *   - :ref:`cpn_pir`
        - \-

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

==============  ======== ======== ===
Nom du T-Board  Physique wiringPi BCM
GPIO17          Pin 11   0        17
GPIO27          Pin 13   2        27
GPIO22          Pin 15   3        22
SPIMOSI         Pin 19   12       10
GPIO18          Pin 12   1        18
GPIO23          Pin 16   4        23
GPIO24          Pin 18   5        24
GPIO26          Pin 37   25       26
==============  ======== ======== ===

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

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

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

.. image:: ../img/image235.png


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

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python/

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

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 4.1.7_CountingDevice.py

Après l'exécution du code, lorsque le PIR détecte le passage de quelqu'un,
le chiffre sur l'affichage à 4 segments augmentera de 1.

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 que le module PIR fonctionne mieux, vous devez tourner les deux complètement dans le sens antihoraire.

.. image:: ../img/PIR_TTE.png
    :width: 400
    :align: center

**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``. 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
    import RPi.GPIO as GPIO
    import time

    sensorPin = 26

    SDI = 24
    RCLK = 23
    SRCLK = 18

    placePin = (10, 22, 27, 17)
    number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)

    counter = 0

    def clearDisplay():
        for i in range(8):
            GPIO.output(SDI, 1)
            GPIO.output(SRCLK, GPIO.HIGH)
            GPIO.output(SRCLK, GPIO.LOW)
        GPIO.output(RCLK, GPIO.HIGH)
        GPIO.output(RCLK, GPIO.LOW)    

    def hc595_shift(data): 
        for i in range(8):
            GPIO.output(SDI, 0x80 & (data << i))
            GPIO.output(SRCLK, GPIO.HIGH)
            GPIO.output(SRCLK, GPIO.LOW)
        GPIO.output(RCLK, GPIO.HIGH)
        GPIO.output(RCLK, GPIO.LOW)

    def pickDigit(digit):
        for i in placePin:
            GPIO.output(i,GPIO.LOW)
        GPIO.output(placePin[digit], GPIO.HIGH)

    def display():
        global counter                    
        clearDisplay() 
        pickDigit(0)  
        hc595_shift(number[counter % 10])

        clearDisplay()
        pickDigit(1)
        hc595_shift(number[counter % 100//10])

        clearDisplay()
        pickDigit(2)
        hc595_shift(number[counter % 1000//100])

        clearDisplay()
        pickDigit(3)
        hc595_shift(number[counter % 10000//1000])

    def loop():
        global counter
        currentState = 0
        lastState = 0
        while True:
            display()
            currentState=GPIO.input(sensorPin)
            if (currentState == 0) and (lastState == 1):
                counter +=1
            lastState=currentState

    def setup():
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(SDI, GPIO.OUT)
        GPIO.setup(RCLK, GPIO.OUT)
        GPIO.setup(SRCLK, GPIO.OUT)
        for i in placePin:
            GPIO.setup(i, GPIO.OUT)
        GPIO.setup(sensorPin, GPIO.IN)

    def destroy():   # When "Ctrl+C" is pressed, the function is executed.
        GPIO.cleanup()

    if __name__ == '__main__':  # Program starting from here
        setup()
        try:
            loop()
        except KeyboardInterrupt:
            destroy()

**Explication du code**

Basé sur :ref:`1.1.5_py`, ce projet ajoute un **module PIR** pour transformer le comptage 
automatique en détection de comptage. Lorsque le module PIR détecte le passage de quelqu'un, 
le chiffre sur l'afficheur à 4 segments augmente de 1.

.. code-block:: python

    def display():
        global counter                    
        clearDisplay()
        pickDigit(0)
        hc595_shift(number[counter % 10])

        clearDisplay()
        pickDigit(1)
        hc595_shift(number[counter % 100//10])

        clearDisplay()
        pickDigit(2)
        hc595_shift(number[counter % 1000//100])

        clearDisplay()
        pickDigit(3)
        hc595_shift(number[counter % 10000//1000])

Tout d'abord, activez le quatrième afficheur à segment et écrivez le chiffre des unités.
Ensuite, activez le troisième afficheur à segment et saisissez le chiffre des dizaines.
Après cela, activez respectivement le deuxième et le premier afficheur à segment, et 
écrivez les chiffres des centaines et des milliers. Comme la vitesse de rafraîchissement est très rapide, nous voyons un affichage complet à quatre chiffres.

.. code-block:: python

    def loop():
    global counter
        currentState = 0
        lastState = 0
        while True:
            display()
            currentState=GPIO.input(sensorPin)
            if (currentState == 0) and (lastState == 1):
                counter +=1
            lastState=currentState 

Ceci est la fonction principale : afficher le chiffre sur l'afficheur à 4 segments et lire la 
valeur du PIR. Lorsque le module PIR détecte le passage de quelqu'un, le chiffre sur l'afficheur 
à 4 segments augmente de 1.

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

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