TP2 Création d'un feu
tricolore
Février 2017 Mooc France Université Numérique FUN. |
/* 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 } |
/* 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 } |