Uncle Den's Uncle Den's

TP2 Création d'un feu tricolore

Février 2017 Mooc France Université Numérique FUN.


montage

Les consignes:

Le TP consiste à réaliser un feu tricolore accompagné d'un feu "piéton" bicolore (rouge et vert). Le montage devra avoir un bouton pour piétons qui viendra passer le feu au orange puis au rouge tout en passant le feu piéton au vert.

Fonctionnement normal :

Feu tricolore : même consigne que la semaine dernière
- Une LED orange (branchée sur la broche 11) allumée pendant 1 seconde (c'est la première LED à s'allumer)
- Puis une LED rouge (branchée sur la broche 12) allumée pendant 3 secondes
- Enfin, une LED verte (branchée sur la broche 10) allumée pendant 3 secondes (et si on n'appuie pas sur le bouton, on repasse à orange)

Feu bicolore (piéton)
- Le feu piéton est constamment rouge (rouge→broche 9 et vert→ broche 8) tant que le bouton (broche 2) n'est pas appuyé

Si le bouton est maintenu appuyé pendant que le feu voiture est au vert, alors le feu tricolore passe au orange allumé pendant 1 seconde puis rouge pendant 5 secondes durant lesquelles le feu vert piéton passe au vert

Après ces 5 secondes, le feu piéton repasse au rouge et le fonctionnement normal reprend

Comme on est sympas, on vous donne le montage à réaliser au-dessus.


1er montage:

Ce montage n'utilise pas de fonctions FOR, WHILE, ni MILLIS. Lorsqu'on appuie sur le bouton, on est obligé d'attendre la fin des 3 secondes pendant lesquelles le feu reste vert.

Voici le résultat  en vidéo:



/* Initialisation des constantes,
   ces valeurs ne pourront pas être
   modifiées dans la suite du programme
*/
//Coté voiture
const int rouge = 12;   //La led rouge sera connectée à la PIN 12
const int jaune = 11;   //La led jaune sera connectée à la PIN 11
const int verte = 10;   //La led verte sera connectée à la PIN 10
//Coté piéton:
const int rougepieton = 9;   //La led rouge sera connectée à la PIN 9
const int vertepieton = 8;   //La led verte sera connectée à la PIN 8
// Vérification de l'état du bouton
const int bouton = 2;      // Le bouton poussoir est connecté à la PIN 2


// Initialisation de variables qui pourront être modifiées par la suite

int boutonappuye=0; // indicateur qui vaut 1 quand le bouton a été appuyé, et 0 si le bouton n'a pas été appuyé

void setup() {
  //Les 5 PIN voiture et pieton sont des sorties: OUTPUT
  pinMode(rouge, OUTPUT);  
  pinMode(jaune, OUTPUT);
  pinMode(verte, OUTPUT);    
  pinMode(rougepieton, OUTPUT);  
  pinMode(vertepieton, OUTPUT);  
  //La PIN bouton est une entrée INPUT
  pinMode(bouton, INPUT);   
}

void loop() {
  /* C'est la boucle qui commence (LOOP).
   Il faut initialiser toutes les sorties.
  JAUNE est allumée, ROUGE et VERTE sont éteintes
  Pour le pieton, la led rouge est allumée, et la verte éteinte
  */
   
   digitalWrite(jaune, HIGH);
   digitalWrite(rouge, LOW);// ne pas oublier d'initialiser le rouge
   digitalWrite(verte, LOW);
   digitalWrite(rougepieton, HIGH);
   digitalWrite(vertepieton, LOW);
   delay(1000); //pause dans cet état pendant 1 seconde

// Le feu passe au rouge et pour les pietons le feu passe au vert
 
   digitalWrite(jaune, LOW);
   digitalWrite(rouge, HIGH);
   digitalWrite(rougepieton, LOW);
   digitalWrite(vertepieton, HIGH);

/* La durée totale est de 3 secondes si le bouton n'a pas été appuyé, sinon, c'est 5 secondes
*  Il faut donc attendre d'abord 3 secondes dans cet état
*  attendre eventuellement encore 2 secondes supplémentaires si le bouton appuyé
*  c'est ainsi que sont construites les lignes suivantes
*/
  delay(3000);          //pause dans cet état pendant 3 secondes
 
  if (boutonappuye==1){
    delay(2000);        // Si le bouton a été appuyé alors attend encore 2 secondes
    boutonappuye=0;     // réinitialise boutonappuye
  }

// Le feu (voiture) passe au vert tandis que le feu pieton passe au rouge (en n'oubliant pas d'eteindre les autres qui sont allumés)
   digitalWrite(rougepieton, HIGH);
   digitalWrite(vertepieton, LOW);
   digitalWrite(rouge, LOW);
   digitalWrite(verte, HIGH);

   delay(3000); // on attend 3 secondes
   if (digitalRead(bouton) == HIGH) {    // si bouton appuyé, alors on l'enregistre en changeant la valeur de boutonappuye. Ca servira à allonger le temps du feu rouge
      boutonappuye=1;
   }
// Ca reboucle (LOOP), et le feu va passer à l'état JAUNE
}


2ème montage:

Ce montage utilise les fonctions FOR, WHILE, ni MILLIS. Ces fonctions permettent de faire clignoter la led (FOR), de gérer l'interuption d'attente de la fin du feu vert (WHILE), et de limiter le temps d'attente de ce même feu vert (MILLIS)

Voici le résultat  en vidéo:



/* Initialisation des constantes,
   ces valeurs ne pourront pas être
   modifiées dans la suite du programme
*/
//Coté voiture
const int rouge = 12;   //La led rouge sera connectée à la PIN 12
const int jaune = 11;   //La led jaune sera connectée à la PIN 11
const int verte = 10;   //La led verte sera connectée à la PIN 10
//Coté piéton:
const int rougepieton = 9;   //La led rouge sera connectée à la PIN 9
const int vertepieton = 8;   //La led verte sera connectée à la PIN 8
// Vérification de l'état du bouton
const int bouton = 2;      // Le bouton poussoir est connecté à la PIN 2


// Initialisation de variables qui pourront être modifiées par la suite

unsigned long temps; // TEMPS est le moment où la led verte coté voiture se met à l'état allumée
unsigned long duree; // DUREE est la durée depuis que la led verte voiture est passée à l'état allumée
int boutonappuye=0; // indicateur qui vaut 1 quand le bouton a été appuyé, et 0 si le bouton n'a pas été appuyé
int passe=0; // permet de quitter la boucle de la led verte coté voiture, soit parce que le temps est écoulé (3s), soit parce que le bouton a été appuyé.
int buttonState = 0;  // lecture de l'état du bouton... vérifier si buttonState==HIGH est équivalent à buttonState==1 ?

void setup() {
  //Les 5 PIN voiture et pieton sont des sorties: OUTPUT
  pinMode(rouge, OUTPUT); 
  pinMode(jaune, OUTPUT);
  pinMode(verte, OUTPUT);   
  pinMode(rougepieton, OUTPUT); 
  pinMode(vertepieton, OUTPUT); 
  //La PIN bouton est une entrée INPUT
  pinMode(bouton, INPUT);  
}

void loop() {
  /* C'est la boucle qui commence (LOOP).
   Il faut initialiser toutes les sorties.
  JAUNE est allumée, ROUGE et VERTE sont éteintes
  Pour le pieton, la led rouge est allumée, et la verte éteinte
  */
  
   digitalWrite(jaune, HIGH);
   digitalWrite(rouge, LOW);// ne pas oublier d'initialiser le rouge
   digitalWrite(verte, LOW);
   digitalWrite(rougepieton, HIGH);
   digitalWrite(vertepieton, LOW);
   delay(1000); //pause dans cet état pendant 1 seconde

// Le feu passe au rouge et pour les pietons le feu passe au vert
 
   digitalWrite(jaune, LOW);
   digitalWrite(rouge, HIGH);
   digitalWrite(rougepieton, LOW);
   digitalWrite(vertepieton, HIGH);

/* La durée totale est de 3 secondes sir le bouton n'a pas été appuyé, sinon, c'est 5 secondes
*  Je fais clignoter systématiquement pendant 1 seconde le feu vert pieton avant le passage au vert du feu voiture.
*  Il faut donc attendre d'abord 2 secondes dans cet état
*  attendre eventuellement encore 2 secondes supplémentaires si le bouton appuyé
*  et une seconde supplémentaire à clignoter
*  c'est ainsi que sont construites les lignes suivantes
*/
  delay(2000);          //pause dans cet état pendant 2 secondes
 
  if (boutonappuye==1){ // le DELAY précédent pourrait être associé à ce IF (et remplacerait le IF) par la simple écriture: delay(2000+2000*(boutonappuye==1))
    delay(2000);        // Si le bouton a été appuyé alors attend encore 2 secondes
    boutonappuye=0;     // réinitialise à boutonappuye
  }

  /* ici on fait clignoter
   *  on fait 5 fois la même action à l'aide de la boucle FOR
   *  dans cette boucle on éteint vertepieton pendant 100ms, puis on la rallume pendant la même durée.
   *  Tout ça 5 fois, ce qui fait un effet de clignottement qui dure au total 1 seconde 
   */
   for (int i=0; i < 5; i++){ 
      digitalWrite(vertepieton, LOW);
      delay(100);
      digitalWrite(vertepieton, HIGH);
      delay(100);
   }


// Le feu (voiture) passe au vert tandis que le feu pieton passe au rouge (en n'oubliant pas d'eteindre les autres qui sont allumés)
   digitalWrite(rougepieton, HIGH);
   digitalWrite(vertepieton, LOW);
   digitalWrite(rouge, LOW);
   digitalWrite(verte, HIGH);

/* A partir de ce moment il faut s'assurer qu'on ne depasse pas les 3 secondes de feu vert allumé
 *  on relève l'heure à l'aide de l'instruction MILLIS() que l'on place dans la variable TEMPS
 *  le temps passant MILLIS va évoluer tandis que TEMPS restera constante
 *  La différence MILLIS()-TEMPS est la durée durant laquelle le feu vert est allumé. Cette durée ne doit pas exceder les 3s.
 * 
 *  PASSE est initialiséà 0, et vaudra 1 si les 3 secondes sont atteintes, ou si le bouton a été appuyé
 *  TANT QUE (c'est la boucle WHILE) PASSE vaut 0, on attend et on controel le temps passé et si le bouton a été appuyé.
 *  Si PASSE passe à 1, on quitte la boucle et le feu va pouvoir passer à l'état JAUNE.
 */
   temps=millis();
   passe=0;
   while (passe==0){
      buttonState = digitalRead(bouton); // Lit l'état du bouton poussoir
      if (buttonState == HIGH) {    // si bouton appuyé, alors passe, mais la durée du temps "rouge voiture" sera allongé
        boutonappuye=1;
        passe=1;
      }
      if ((millis()-temps)>3000) { // si temps écoulé (3s), passe au feu jaune   
        passe=1;
      }
   }
// Ca reboucle (LOOP), et le feu va passer à l'état JAUNE
}




Voir mes Aquarelles - Mon site sur les aquarelles

Blog sur mes aquarelles