Sommaire |
Le but du projet est de construire un compte à rebours, libre d'en trouver un usage, il en existe beaucoup ;)
Le compte à rebours est composé d'un afficheur 7 segments, ce qui veut dire qu'il peut mesurer une durée maximale de 9 secondes.
On utilise trois boutons poussoirs pour gérer trois évènements différents. De haut en bas : Le premier bouton permet de modifier le digit en l'incrémentant de 1 à chaque pression. Il revient à zéro après le chiffre 9.
Le deuxième bouton permet de lancer le décompte, une led rouge clignote et il y a un signal sonore pendant le décompte.
Le troisième bouton permet de faire un reset, c'est à dire de remettre à zéro le compte à rebours.
Nous avons rencontré quelques difficultés pour faire marcher et comprendre le fonctionnement des boutons poussoirs, il faut bien faire attention à ne pas oublier les résistances. Il ne faut aussi pas oublier les résistances pour l'afficheur 7 segments, car elles régulent le courant et évite une surchauffe et l'endommagement de l'afficheur.
/* On assigne chaque LED à une broche de l'arduino */ #include <Wire.h> const int A = 2; const int B = 3; const int C = 4; const int D = 5; const int E = 6; const int F = 7; const int G = 8; const int buzz = 9; const int bouton1 = 12; // pour changer le digit const int bouton2 = 11; // pour lancer // const int bouton3 =10; // pour le reset const int led3 = 13; /* ici on créé des variables qui vont nous servir pour les évènements */ int launch; int truc; int change_digit1; int digit; int resetter; int chiffre_actuel; void setup() { //définition des broches en sortie pour chacuns des segments pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(F, OUTPUT); pinMode(G, OUTPUT); pinMode(buzz, OUTPUT); pinMode(bouton1, INPUT); pinMode(bouton2, INPUT); pinMode(bouton3, INPUT); // led de test pinMode(led3,OUTPUT); // on définit ces variables à HIGH au départ launch = HIGH; change_digit1 = HIGH; // digit de départ digit = 0; resetter = HIGH; digitalWrite(led3,LOW); } void loop(void) { // si le bouton de lancement est relaché while(launch==HIGH && resetter==HIGH){ // on fait en sorte que le buzzer est éteins noTone(buzz); change_digit1 = digitalRead(bouton1); launch = digitalRead(bouton2); if(launch==LOW){ truc = LOW; } resetter = digitalRead(bouton3); //je verifie au cours de la boucle si jappuie sur le bouton de lancement if(change_digit1 == LOW) // si je presse le bouton de changement de digit { digitalWrite(led3,HIGH); // jallume la led de test digit++; // jincremente le digit } else if(change_digit1 == HIGH) // si le bouton de changement de digit est relaché { digitalWrite(led3,LOW); // on éteins la led } if(digit > 9) // si le digit est superieur à 9 après incrémentation { digit=0; // on le remet à zéro } // affichage des digits en fonction de la valeur actuelle de digit if(digit==0) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW); digitalWrite(G, HIGH); } if(digit==1) { digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH); digitalWrite(G, HIGH); } if(digit==2) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, HIGH); digitalWrite(G, LOW); } if(digit==3) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, HIGH); digitalWrite(F, HIGH); digitalWrite(G, LOW); } if(digit==4) { digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, LOW); digitalWrite(G, LOW); } if(digit==5) { digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, HIGH); digitalWrite(F, LOW); digitalWrite(G, LOW); } if(digit==6) { digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW); digitalWrite(G, LOW); } if(digit==7) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH); digitalWrite(G, HIGH); } if(digit==8) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW); digitalWrite(G, LOW); } if(digit==9) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, HIGH); digitalWrite(F, LOW); digitalWrite(G, LOW); } delay(100); // on ajoute ce délai pour palier aux "sauts" du bouton poussoir qui ferait que la valeur pourrait être dure à régler à cause de la sensibilité } // phase 2 : lancement du compte à rebours, décompte et buzz par alternance while(truc==LOW && resetter==HIGH && digit!=0){ // bouton de lancement pressé et digit différent de zéro // launch = digitalRead(bouton1); // on vérifie que le bouton de lancement est toujours pressé change_digit1 = digitalRead(bouton1); launch = digitalRead(bouton2); resetter = digitalRead(bouton3); chiffre_actuel = digit; // comme c'est une boucle while, on va repasser dedans tant que digit est différent de zéro // donc on affiche sur le cadran la valeur du digit if(chiffre_actuel==0 ) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW); digitalWrite(G, HIGH); } if(chiffre_actuel==1) { digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH); digitalWrite(G, HIGH); } if(chiffre_actuel==2) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, HIGH); digitalWrite(G, LOW); } if(chiffre_actuel==3) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, HIGH); digitalWrite(F, HIGH); digitalWrite(G, LOW); } if(chiffre_actuel==4) { digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, LOW); digitalWrite(G, LOW); } if(chiffre_actuel==5) { digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, HIGH); digitalWrite(F, LOW); digitalWrite(G, LOW); } if(chiffre_actuel==6) { digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW); digitalWrite(G, LOW); } if(chiffre_actuel==7) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH); digitalWrite(G, HIGH); } if(chiffre_actuel==8) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW); digitalWrite(G, LOW); } if(chiffre_actuel==9) { digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, HIGH); digitalWrite(F, LOW); digitalWrite(G, LOW); } // on décrémente le digit que l'on affiche chiffre_actuel--; digit--; // on fait marcher le buzzer tone(buzz, 4000); digitalWrite(led3,HIGH); delay(500); digitalWrite(led3,LOW); noTone(buzz); // on joue sur le décallage de la seconde pour faire marcher le buzzer par alternance delay(500); } // une fois que le compte est fini while(truc==LOW && resetter==HIGH && digit==0){ change_digit1 = digitalRead(bouton1); launch = digitalRead(bouton2); resetter = digitalRead(bouton3); // on affiche zéro digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW); digitalWrite(G, HIGH); /* on fait sonner le buzzer en continue*/ tone(buzz, 4000); digitalWrite(led3,HIGH); truc == HIGH; } while(resetter==LOW){ // on arrete le buzzer noTone(buzz); // on eteint la led digitalWrite(led3,LOW); // on redefinit le digit de base à zéro digit=0; chiffre_actuel =0; // on rechecke letat des boutons change_digit1 = digitalRead(bouton1); launch = digitalRead(bouton2); resetter = digitalRead(bouton3); // on affiche zéro digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW); digitalWrite(G, HIGH); truc = HIGH; } }
Projets utilisant le même système d'affichage :
http://wikidebrouillard.org/index.php/Afficheur_7_segments_pilot%C3%A9_par_Arduino
http://wikidebrouillard.org/index.php/Horloge_Arduino
On pourrait ajouter un deuxième afficheur 7 segments voire un troisième pour aller plus loin. Pour cela il faudrait penser à utiliser un démultiplexeur pour pouvoir gérer plus de cas à cause du nombre limité d'entrées/sorties.
Ce compte à rebours peut être utilisé dans le domaine culinaire par exemple, pour la cuisson de certains plats.
© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique