Feu tricolore

Ce projet vise à implémenter la logique contrôllant les feux tricolores d'un carrefour.

INTERMÉDIAIRE

La situation simulée est celle d'une intersection entre une voie principale et une rue qui part sur un côté. Deux feux gèrent la voie principale, et le dernier la petite rue. En temps normal, les deux feux de la voie principale sont au vert, celui de la rue au rouge. Lorsque l'on appuie sur le bouton, les feux centraux passent au rouge, et celui de la rue passe au vert, pendant quelques secondes.

Fiche de présentation du projet

Matériel

Circuit

Sch%C3%A9ma_bb

Code

#define FEU_1_ROUGE 13
#define FEU_1_JAUNE 12
#define FEU_1_VERT 11
#define BOUTON 10
#define FEU_2_ROUGE 9
#define FEU_2_JAUNE 8
#define FEU_2_VERT 7
#define FEU_3_ROUGE 6
#define FEU_3_JAUNE 5
#define FEU_3_VERT 4

#define ROUGE 0
#define JAUNE 1
#define VERT 2

#define DELAIS_COULEUR 2000
#define DELAIS_PASSAGE 20000

int ancien_etat = HIGH;

void allumer(int feu, int couleur)
{
    switch (feu)
    {
    case 1:
        switch (couleur)
        {
        case ROUGE:
            digitalWrite(FEU_1_ROUGE, HIGH);
            digitalWrite(FEU_1_JAUNE, LOW);
            digitalWrite(FEU_1_VERT, LOW);
            break;
        case JAUNE:
            digitalWrite(FEU_1_ROUGE, LOW);
            digitalWrite(FEU_1_JAUNE, HIGH);
            digitalWrite(FEU_1_VERT, LOW);
            break;
        case VERT:
            digitalWrite(FEU_1_ROUGE, LOW);
            digitalWrite(FEU_1_JAUNE, LOW);
            digitalWrite(FEU_1_VERT, HIGH);
            break;
        }
        break;
    case 2:
        switch (couleur)
        {
        case ROUGE:
            digitalWrite(FEU_2_ROUGE, HIGH);
            digitalWrite(FEU_2_JAUNE, LOW);
            digitalWrite(FEU_2_VERT, LOW);
            break;
        case JAUNE:
            digitalWrite(FEU_2_ROUGE, LOW);
            digitalWrite(FEU_2_JAUNE, HIGH);
            digitalWrite(FEU_2_VERT, LOW);
            break;
        case VERT:
            digitalWrite(FEU_2_ROUGE, LOW);
            digitalWrite(FEU_2_JAUNE, LOW);
            digitalWrite(FEU_2_VERT, HIGH);
            break;
        }
        break;
    case 3:
        switch (couleur)
        {
        case ROUGE:
            digitalWrite(FEU_3_ROUGE, HIGH);
            digitalWrite(FEU_3_JAUNE, LOW);
            digitalWrite(FEU_3_VERT, LOW);
            break;
        case JAUNE:
            digitalWrite(FEU_3_ROUGE, LOW);
            digitalWrite(FEU_3_JAUNE, HIGH);
            digitalWrite(FEU_3_VERT, LOW);
            break;
        case VERT:
            digitalWrite(FEU_3_ROUGE, LOW);
            digitalWrite(FEU_3_JAUNE, LOW);
            digitalWrite(FEU_3_VERT, HIGH);
            break;
        }
        break;
    }
}

void setup()
{
    pinMode(FEU_1_ROUGE, OUTPUT);
    pinMode(FEU_1_JAUNE, OUTPUT);
    pinMode(FEU_1_VERT, OUTPUT);
    pinMode(FEU_2_ROUGE, OUTPUT);
    pinMode(FEU_2_JAUNE, OUTPUT);
    pinMode(FEU_2_VERT, OUTPUT);
    pinMode(FEU_3_ROUGE, OUTPUT);
    pinMode(FEU_3_JAUNE, OUTPUT);
    pinMode(FEU_3_VERT, OUTPUT);
    pinMode(BOUTON, INPUT_PULLUP);
    allumer(1, VERT);
    allumer(2, ROUGE);
    allumer(3, VERT);
}

void loop()
{
    int etat = digitalRead(BOUTON);
    if (etat == LOW && etat != ancien_etat) {
        allumer(1, JAUNE);
        allumer(3, JAUNE);
        delay(DELAIS_COULEUR);
        allumer(1, ROUGE);
        allumer(3, ROUGE);
        delay(DELAIS_COULEUR);
        allumer(2, VERT);
        delay(DELAIS_PASSAGE);
        allumer(2, JAUNE);
        delay(DELAIS_COULEUR);
        allumer(2, ROUGE);
        delay(DELAIS_COULEUR);
        allumer(1, VERT);
        allumer(3, VERT);
    }
    ancien_etat = etat;
}

Article précédent Article suivant