.. 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
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.7/
**Étape 3 :** Compilez le code.
.. raw:: html
.. code-block::
gcc 3.1.7_TrafficLight.c -lwiringPi
**Étape 4 :** Exécutez le fichier.
.. raw:: html
.. 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:`faq_c_nowork`.
**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_4digit_c_pi5`
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_4digit` 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.