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 [Ici] 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

../_images/list_Traffic_Light1.png

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

../_images/Schematic_three_one71.png

Procédures expérimentales

Étape 1 : Construisez le circuit.

../_images/image2541.png

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

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

Étape 3 : Compilez le code.

gcc 3.1.7_TrafficLight.c -lwiringPi

Étape 4 : Exécutez le fichier.

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 Le code C ne fonctionne pas ?.

Explication du Code

#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 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.

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.

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

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.

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.