diff --git a/electronicdice.ino b/electronicdice.ino index ac13f9b..a787ac8 100644 --- a/electronicdice.ino +++ b/electronicdice.ino @@ -1,122 +1,148 @@ +// Code original de HELIOX optimisé par Patrick PIGNOL patrick.pignol@gmail.com + // ----- DECLARATION DES VARIABLES ------ // Pour les LED -int pinLeds1 = 0; -int pinLeds2 = 1; -int pinLeds3 = 2; -int pinLed4 = 3; + +#define PINLEDS1 0 +#define PINLEDS2 1 +#define PINLEDS3 2 +#define PINLEDS4 3 // on indique la pin du capteur d'inclinaison -int buttonPin = 4; +#define BUTTONPIN 4 + +#define SHOWTIME 7000 //"time" est normalement un mot réservé, c'est pour ça qu'il est coloré. +// Nombre minimum de roulades inclus +#define MINROLL 5 +// Nombre maximum de roulades exlus +#define MAXROLL 10 +// Délais d'animation +#define ANIMATIONDELAY 200 +// Délais d'effacement +#define CLEARDELAY 50 + // On vérifie l'état du capteur d'inclinaison -int buttonState; -// Variable pour le random de l'animation -long ranim; -// Variable pour le random du résultat final -long ran; +int vButtonState; +// Variable pour random le nombre de roulades +int vRandomRoll; +// Variable pour le résultat intermédiaire de l'animation +int vRandomAnimation; // Il n'y a pas encore eu de lancement de dé -int last = 0; +int vLastAnimation = 0; // Temps que le dé reste affiché 1000 ms = 1 seconde -int time = 7000; +void mClearDice()// effacement du dé +{ + digitalWrite (PINLEDS1, LOW); + digitalWrite (PINLEDS2, LOW); + digitalWrite (PINLEDS3, LOW); + digitalWrite (PINLEDS4, LOW); +} -// ----- DECLARATION ENTREES ET SORTIES ------ -void setup () +void mShowDice1() // affiche 1 +{ + digitalWrite (PINLEDS4, HIGH); +} + +void mShowDice2() // affiche 2 +{ + digitalWrite (PINLEDS1, HIGH); +} + +void mShowDice3() // affiche 3 +{ + digitalWrite (PINLEDS3, HIGH); + digitalWrite (PINLEDS4, HIGH); +} + +void mShowDice4() // affiche 4 +{ + digitalWrite (PINLEDS1, HIGH); + digitalWrite (PINLEDS3, HIGH); +} + +void mShowDice5() // affiche 5 { - //On indique que les LED sont des sorties - pinMode (pinLeds1, OUTPUT); - pinMode (pinLeds2, OUTPUT); - pinMode (pinLeds3, OUTPUT); - pinMode (pinLed4, OUTPUT); - // On indique que le detecteur d'inclinaison est une entrée. - pinMode (buttonPin, INPUT); + digitalWrite (PINLEDS1, HIGH); + digitalWrite (PINLEDS3, HIGH); + digitalWrite (PINLEDS4, HIGH); +} - randomSeed(analogRead(0)); // on initialise le fait de pouvoir lancer des randoms +void mShowDice6() // affiche 6 +{ + digitalWrite (PINLEDS1, HIGH); + digitalWrite (PINLEDS2, HIGH); + digitalWrite (PINLEDS3, HIGH); +} + +// ----- DECLARATION ENTREES ET SORTIES ------ +void setup () +{ + //On indique que les LED sont des sorties + pinMode (PINLEDS1, OUTPUT); + pinMode (PINLEDS2, OUTPUT); + pinMode (PINLEDS3, OUTPUT); + pinMode (PINLEDS4, OUTPUT); + // On indique que le detecteur d'inclinaison est une entrée. + pinMode (BUTTONPIN, INPUT); + + randomSeed(analogRead(0)); // on initialise le fait de pouvoir lancer des randoms à peu près aléatoires + mClearDice();//on efface le dé (rien ne garanti que les pines soient à LOW par défaut, tout dépend le compilateur) } // ----- ACTIONS A EFFECTUER ------ void loop() -{ - buttonState = digitalRead(buttonPin); - if (buttonState == LOW){ // Si on bouge le dé - - for (int i=0; i <= 7; i++){ // Animation pour 8 affichages de dé avec 200 ms entre chaque - - ranim = random(1, 7); // on effectue un random pour chaque affichage - - while (ranim == last){ // On verifie que deux affichages consécutifs ne sont pas les mêmes - ranim = random(1, 7); // Sinon on random un autre chiffre - } - last = ranim; // On stock le chiffre pour éviter d'afficher les 2 mêmes valeurs de dé pendant l'animation - if (ranim == 1){ - digitalWrite (pinLed4, HIGH); - } - if (ranim == 2){ - digitalWrite (pinLeds1, HIGH); - } - if (ranim == 3){ - digitalWrite (pinLeds3, HIGH); - digitalWrite (pinLed4, HIGH); - } - if (ranim == 4){ - digitalWrite (pinLeds1, HIGH); - digitalWrite (pinLeds3, HIGH); - } - if (ranim == 5){ - digitalWrite (pinLeds1, HIGH); - digitalWrite (pinLeds3, HIGH); - digitalWrite (pinLed4, HIGH); - } - if (ranim == 6){ - digitalWrite (pinLeds1, HIGH); - digitalWrite (pinLeds2, HIGH); - digitalWrite (pinLeds3, HIGH); - } - delay(200); // Pause entre l'affichage de l'animation : 200ms led éteintes - digitalWrite (pinLeds1, LOW); - digitalWrite (pinLeds2, LOW); - digitalWrite (pinLeds3, LOW); - digitalWrite (pinLed4, LOW); - delay(50); - } - - -// RANDOM DU RESULTAT FINAL - ran = random(1, 7); - if (ran == 1){ - digitalWrite (pinLed4, HIGH); - delay (time); // time étant la variable qui vaut 7000ms donc affichage du résultat pendant 7 secondes - } - if (ran == 2){ - digitalWrite (pinLeds1, HIGH); - delay (time); - } - if (ran == 3){ - digitalWrite (pinLeds3, HIGH); - digitalWrite (pinLed4, HIGH); - delay (time); - } - if (ran == 4){ - digitalWrite (pinLeds1, HIGH); - digitalWrite (pinLeds3, HIGH); - delay (time); +{ + //Lire l'état du capteur à mercure + vButtonState = digitalRead(BUTTONPIN); + // Si on bouge le dé + if (vButtonState == LOW) + { + vRandomRoll = random(MINROLL, MAXROLL); // le dé roulera aléatoirement entre vMinRoll et vMaxRoll + for (int vIndex = 0; vIndex <= vRandomRoll; vIndex++) // Animation pour 8 affichages de dé avec 200 ms entre chaque + { + mClearDice();//On efface le dé + delay(CLEARDELAY);//On attend un peu pour que l'utilisateur distingue la transition entre 2 roulades + // On verifie que deux affichages consécutifs ne sont pas les mêmes sinon on random un autre chiffre + do // faire + { + vRandomAnimation = random(1, 7); // on effectue un random entre 1 inclus et 7 exclus (soit entre 1 et 6 inclus) pour chaque affichage + } while (vRandomAnimation == vLastAnimation); //tant que vRandomAnimation == vLastAnimation + vLastAnimation = vRandomAnimation; // On stock le chiffre pour éviter d'afficher les 2 mêmes valeurs de dé pendant l'animation + + switch(vRandomAnimation) // appliquer le traitement dédié à chaque valeurs de vRandomAnimation + { + case 1: + { + mShowDice1(); + }break; + case 2: + { + mShowDice2(); + }break; + case 3: + { + mShowDice3(); + }break; + case 4: + { + mShowDice4(); + }break; + case 5: + { + mShowDice5(); + }break; + case 6: + { + mShowDice6(); + }break; + } + delay(ANIMATIONDELAY); // Pause entre l'affichage de l'animation : 200ms led éteintes + } + //ici on garde le dernier affichage + delay (SHOWTIME); + //Après le délais on efface le dé + mClearDice(); } - if (ran == 5){ - digitalWrite (pinLeds1, HIGH); - digitalWrite (pinLeds3, HIGH); - digitalWrite (pinLed4, HIGH); - delay (time); - } - if (ran == 6){ - digitalWrite (pinLeds1, HIGH); - digitalWrite (pinLeds2, HIGH); - digitalWrite (pinLeds3, HIGH); - delay (time); - } - } - // On éteint tout pour pouvoir relancer le dé - digitalWrite (pinLeds1, LOW); - digitalWrite (pinLeds2, LOW); - digitalWrite (pinLeds3, LOW); - digitalWrite (pinLed4, LOW); }