.. note::

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

    **Pourquoi nous rejoindre ?**

    - **Support d'experts** : Résolvez les problèmes après-vente et relevez vos défis techniques grâce à l'aide de notre communauté et de notre équipe.
    - **Apprenez et Partagez** : Échangez des astuces et des tutoriels pour perfectionner vos compétences.
    - **Aperçus exclusifs** : Bénéficiez d'un accès anticipé aux nouvelles annonces de produits et aux avant-premières.
    - **Réductions spéciales** : Profitez de réductions exclusives sur nos nouveaux produits.
    - **Promotions festives et concours** : Participez à des concours et à des promotions lors des fêtes.

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

3.1.7 Feu Tricolore
=======================

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

Dans ce projet, nous allons utiliser des LEDs de trois couleurs pour simuler le 
changement de feux de signalisation, et un afficheur 7 segments à quatre chiffres 
pour afficher le décompte de chaque état du feu.

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

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


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

============ ======== ======== ===
T-Board Name physical 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
GPIO25       Pin 22   6        25
SPICE0       Pin 24   10       8
SPICE1       Pin 26   11       7
============ ======== ======== ===

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


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

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

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


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

.. raw:: html

   <run></run>

.. code-block:: 

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

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

.. raw:: html

   <run></run>

.. code-block:: 

    gcc 3.1.7_TrafficLight.c -lwiringPi

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

.. raw:: html

   <run></run>

.. code-block:: 

    sudo ./a.out

Lorsque le programme est lancé, les LEDs simuleront le changement de couleurs des 
feux tricolores. Tout d'abord, la LED rouge s'allume pendant **60s**, puis la LED 
verte s'allume pendant **30s**, suivie de la LED jaune pendant **5s**. Ensuite, la 
LED rouge s'allume à nouveau pour **60s**. Cette série d'actions sera répétée en boucle.

.. 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 consulter :ref:`C code is not working?`.


**Explication du Code**

.. code-block:: c

    #define     SDI     5 
    #define     RCLK    4  
    #define     SRCLK    1   

    const int placePin[] = {12, 3, 2, 0};
    unsigned char number[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

    void pickDigit(int digit);
    void hc595_shift(int8_t data);
    void clearDisplay();
    void display();

Ces fonctions servent à afficher les numéros sur un afficheur 7 segments à quatre 
chiffres. Reportez-vous à la section :ref:`1.1.5 Afficheur 7 segments à 4 chiffres` 
pour plus de détails. Ici, les codes permettent d'afficher le décompte du temps du 
feu tricolore.

.. code-block:: c

    const int ledPin[]={6,10,11};  

    int colorState = 0;

    void lightup()
    {
        for(int i=0;i<3;i++){
            digitalWrite(ledPin[i],HIGH);
        }
        digitalWrite(ledPin[colorState],LOW);    
    }

Ces lignes contrôlent l'allumage et l'extinction des LEDs.

.. code-block:: c

    int greenLight = 30;
    int yellowLight = 5;
    int redLight = 60;
    int colorState = 0;
    char *lightColor[]={"Red","Green","Yellow"};
    int counter = 60;

    void timer(int  timer1){       // Fonction de minuteur
        if(timer1 == SIGALRM){   
            counter --;         
            alarm(1); 
            if(counter == 0){
                if(colorState == 0) counter = greenLight;
                if(colorState == 1) counter = yellowLight;
                if(colorState == 2) counter = redLight;
                colorState = (colorState+1)%3; 
            }
            printf("counter : %d \t light color: %s \n",counter,lightColor[colorState]);
        }
    }

Ce code active ou désactive le minuteur. Reportez-vous à la section
 :ref:`1.1.5 4-Digit 7-Segment Display` pour plus de détails. Lorsque 
 le compteur atteint zéro, `colorState` change, ce qui permet de changer 
 la LED et d'attribuer une nouvelle valeur au minuteur.

.. code-block:: c

    void loop()
    {
        while(1){
        display();
        lightup(); 
        }
    }

    int main(void)
    {
        //…
        signal(SIGALRM,timer);  
        alarm(1); 
        loop();
        return 0;
    }

Le minuteur est démarré dans la fonction **main()**. Dans la fonction **loop()**, 
une boucle `while(1)` est utilisée pour appeler les fonctions de l'afficheur 7 
segments et des LEDs.

